diff --git a/apps/web/src/features/settings/pages/ApiKeyModelSettings.tsx b/apps/web/src/features/settings/pages/ApiKeyModelSettings.tsx index 7d6262a..ff884d1 100644 --- a/apps/web/src/features/settings/pages/ApiKeyModelSettings.tsx +++ b/apps/web/src/features/settings/pages/ApiKeyModelSettings.tsx @@ -141,6 +141,8 @@ interface ModelsFormProps { function ModelsForm(props: ModelsFormProps) { const form = useAppForm({ defaultValues: { models: props.models, toAdd: [] as KeyModel[] }, + // An edit after a save means the page no longer holds what was saved. + listeners: { onChange: () => props.save.reset() }, onSubmit: ({ value }) => { const using = new Set(value.models.map((model) => model.id)) // Each joins as the key last saved it, so one removed and ticked again keeps what it could @@ -158,43 +160,36 @@ function ModelsForm(props: ModelsFormProps) { {(models) => ( - {(toAdd) => { - // A save starts over after the next edit, so Saved never outlasts the draft. - const edit = (field: typeof models | typeof toAdd) => (next: KeyModel[]) => { - field.handleChange(next) - props.save.reset() - } - return ( - <> - - - - - - - ( + <> + + + + + - - ) - }} + + + + )} )} diff --git a/apps/web/tests/features/settings/settings.test.tsx b/apps/web/tests/features/settings/settings.test.tsx index 58e814b..6823bf5 100644 --- a/apps/web/tests/features/settings/settings.test.tsx +++ b/apps/web/tests/features/settings/settings.test.tsx @@ -464,7 +464,13 @@ describe("Settings for one API key's models", () => { await vi.waitFor(() => expect(screen.getByText('Saved')).toBeInTheDocument()) expect(patchedModels(fetch)).toEqual([ { id: 'gpt', name: 'GPT', capabilities: { vision: false, reasoning: true, tools: true } }, - ]) + ]) // An edit after the save means the page no longer holds what was saved. + await userEvent.click( + within(screen.getByRole('group', { name: 'What GPT can do' })).getByRole('button', { + name: 'Tools', + }), + ) + expect(screen.queryByText('Saved')).not.toBeInTheDocument() }) it("starts a typed model with its provider's defaults", async () => {