From 9a58a729d29753e4536c6b65e91d82ef33411bd0 Mon Sep 17 00:00:00 2001 From: Sepehr Ramezani Date: Sun, 29 Mar 2026 10:12:35 +0200 Subject: [PATCH] fix(admin): model selection resets after save and provider switch Three bugs fixed: - Removed the useEffect that synced state from config prop on every re-render, which caused a race condition resetting model state after revalidatePath triggered a server re-render. - Reset selected model to a sensible default when switching providers, preventing stale model names from one provider appearing in another provider's model list (which made the select show the first option). - Model select FormData names already fixed in previous commit to match provider-specific field names (AI_MODEL_TAGS_OLLAMA etc). Co-Authored-By: Claude Opus 4.5 --- .../admin/settings/admin-settings-form.tsx | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx b/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx index 59207dd..c97ea83 100644 --- a/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx +++ b/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx @@ -57,16 +57,6 @@ export function AdminSettingsForm({ config }: { config: Record } const [isLoadingTagsModels, setIsLoadingTagsModels] = useState(false) const [isLoadingEmbeddingsModels, setIsLoadingEmbeddingsModels] = useState(false) - // Sync state with config - useEffect(() => { - setAllowRegister(config.ALLOW_REGISTRATION !== 'false') - setSmtpSecure(config.SMTP_SECURE === 'true') - setSmtpIgnoreCert(config.SMTP_IGNORE_CERT === 'true') - setTagsProvider((config.AI_PROVIDER_TAGS as AIProvider) || 'ollama') - setEmbeddingsProvider((config.AI_PROVIDER_EMBEDDING as AIProvider) || 'ollama') - setSelectedTagsModel(config.AI_MODEL_TAGS || '') - setSelectedEmbeddingModel(config.AI_MODEL_EMBEDDING || '') - }, [config]) // Fetch Ollama models const fetchOllamaModels = useCallback(async (type: 'tags' | 'embeddings', url: string) => { @@ -287,7 +277,16 @@ export function AdminSettingsForm({ config }: { config: Record } id="AI_PROVIDER_TAGS" name="AI_PROVIDER_TAGS" value={tagsProvider} - onChange={(e) => setTagsProvider(e.target.value as AIProvider)} + onChange={(e) => { + const newProvider = e.target.value as AIProvider + setTagsProvider(newProvider) + const defaultModels: Record = { + ollama: '', + openai: MODELS_2026.openai.tags[0], + custom: MODELS_2026.custom.tags[0], + } + setSelectedTagsModel(defaultModels[newProvider] || '') + }} className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2" > @@ -417,7 +416,16 @@ export function AdminSettingsForm({ config }: { config: Record } id="AI_PROVIDER_EMBEDDING" name="AI_PROVIDER_EMBEDDING" value={embeddingsProvider} - onChange={(e) => setEmbeddingsProvider(e.target.value as AIProvider)} + onChange={(e) => { + const newProvider = e.target.value as AIProvider + setEmbeddingsProvider(newProvider) + const defaultModels: Record = { + ollama: '', + openai: MODELS_2026.openai.embeddings[0], + custom: MODELS_2026.custom.embeddings[0], + } + setSelectedEmbeddingModel(defaultModels[newProvider] || '') + }} className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2" >