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 () => {