fix: prevent stale budget fallback entries after form reset and guard empty payload in edit view

Address Greptile P1 (stale state after reset): use key prop to force
BudgetFallbacksEditor remount when parent resets budgetFallbacks to {},
matching the existing routerSettingsKey pattern.

Address Greptile P2 (inconsistent empty payload): guard budget_fallbacks
in edit view to only include when non-empty, matching create form behavior.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Krrish Dholakia 2026-07-03 20:52:25 +00:00
parent ed51c96d3f
commit 640ee9384b
3 changed files with 25 additions and 1 deletions

View file

@ -68,6 +68,23 @@ describe("BudgetFallbacksEditor", () => {
expect(labels.length).toBe(2);
});
it("resets internal state when remounted with empty value via key prop", () => {
const onChange = vi.fn();
const { rerender } = render(
<BudgetFallbacksEditor
key={1}
value={{ "gpt-4": ["gpt-3.5-turbo"] }}
onChange={onChange}
availableModels={MODELS}
/>,
);
expect(screen.getAllByText("Primary Model").length).toBe(1);
rerender(<BudgetFallbacksEditor key={2} value={{}} onChange={onChange} availableModels={MODELS} />);
expect(screen.queryByText("Primary Model")).toBeNull();
expect(screen.getByText("Add Budget Fallback")).toBeTruthy();
});
it("shows ordering hint when multiple fallback models are configured", () => {
const onChange = vi.fn();
render(

View file

@ -204,6 +204,7 @@ const CreateKey: React.FC<CreateKeyProps> = ({ team, teams, data, addKey, autoOp
const [routerSettings, setRouterSettings] = useState<RouterSettingsAccordionValue | null>(null);
const [budgetLimits, setBudgetLimits] = useState<BudgetWindowEntry[]>([]);
const [budgetFallbacks, setBudgetFallbacks] = useState<Record<string, string[]>>({});
const [budgetFallbacksKey, setBudgetFallbacksKey] = useState<number>(0);
const [routerSettingsKey, setRouterSettingsKey] = useState<number>(0);
const [agentsList, setAgentsList] = useState<{ agent_id: string; agent_name: string }[]>([]);
const [selectedAgentId, setSelectedAgentId] = useState<string | null>(null);
@ -223,6 +224,7 @@ const CreateKey: React.FC<CreateKeyProps> = ({ team, teams, data, addKey, autoOp
setSelectedProjectId(null);
setBudgetLimits([]);
setBudgetFallbacks({});
setBudgetFallbacksKey((k) => k + 1);
};
const handleCancel = () => {
@ -243,6 +245,7 @@ const CreateKey: React.FC<CreateKeyProps> = ({ team, teams, data, addKey, autoOp
setSelectedProjectId(null);
setBudgetLimits([]);
setBudgetFallbacks({});
setBudgetFallbacksKey((k) => k + 1);
};
useEffect(() => {
@ -567,6 +570,7 @@ const CreateKey: React.FC<CreateKeyProps> = ({ team, teams, data, addKey, autoOp
form.resetFields();
setBudgetLimits([]);
setBudgetFallbacks({});
setBudgetFallbacksKey((k) => k + 1);
localStorage.removeItem("userData" + userID);
} catch (error) {
console.log("error in create key:", error);
@ -1097,6 +1101,7 @@ const CreateKey: React.FC<CreateKeyProps> = ({ team, teams, data, addKey, autoOp
}
>
<BudgetFallbacksEditor
key={budgetFallbacksKey}
value={budgetFallbacks}
onChange={setBudgetFallbacks}
availableModels={modelsToPick}

View file

@ -308,7 +308,9 @@ export function KeyEditView({
values.budget_limits = [];
}
values.budget_fallbacks = budgetFallbacks;
if (Object.keys(budgetFallbacks).length > 0) {
values.budget_fallbacks = budgetFallbacks;
}
await onSubmit(values);
} finally {