From 37396b9c706d091e0706949564cffed01270d63a Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 4 Jan 2026 10:46:35 +0800 Subject: [PATCH] fix(common-config): reset initialization flag when preset changes The common config checkbox was only auto-enabled for the first preset (custom) because hasInitializedNewMode ref was permanently locked to true after first initialization. Add selectedPresetId parameter to all three common config hooks and reset the initialization flag when preset changes, allowing the initialization logic to re-run for each preset switch. --- src/components/providers/forms/ProviderForm.tsx | 3 +++ .../providers/forms/hooks/useCodexCommonConfig.ts | 7 +++++++ .../providers/forms/hooks/useCommonConfigSnippet.ts | 7 +++++++ .../providers/forms/hooks/useGeminiCommonConfig.ts | 7 +++++++ 4 files changed, 24 insertions(+) diff --git a/src/components/providers/forms/ProviderForm.tsx b/src/components/providers/forms/ProviderForm.tsx index d6c18855a..514367740 100644 --- a/src/components/providers/forms/ProviderForm.tsx +++ b/src/components/providers/forms/ProviderForm.tsx @@ -358,6 +358,7 @@ export function ProviderForm({ settingsConfig: form.watch("settingsConfig"), onConfigChange: (config) => form.setValue("settingsConfig", config), initialData: appId === "claude" ? initialData : undefined, + selectedPresetId: selectedPresetId ?? undefined, }); // 使用 Codex 通用配置片段 hook (仅 Codex 模式) @@ -373,6 +374,7 @@ export function ProviderForm({ codexConfig, onConfigChange: handleCodexConfigChange, initialData: appId === "codex" ? initialData : undefined, + selectedPresetId: selectedPresetId ?? undefined, }); // 使用 Gemini 配置 hook (仅 Gemini 模式) @@ -460,6 +462,7 @@ export function ProviderForm({ envStringToObj, envObjToString, initialData: appId === "gemini" ? initialData : undefined, + selectedPresetId: selectedPresetId ?? undefined, }); const [isCommonConfigModalOpen, setIsCommonConfigModalOpen] = useState(false); diff --git a/src/components/providers/forms/hooks/useCodexCommonConfig.ts b/src/components/providers/forms/hooks/useCodexCommonConfig.ts index 0c0e1811a..383536a5a 100644 --- a/src/components/providers/forms/hooks/useCodexCommonConfig.ts +++ b/src/components/providers/forms/hooks/useCodexCommonConfig.ts @@ -16,6 +16,7 @@ interface UseCodexCommonConfigProps { initialData?: { settingsConfig?: Record; }; + selectedPresetId?: string; } /** @@ -26,6 +27,7 @@ export function useCodexCommonConfig({ codexConfig, onConfigChange, initialData, + selectedPresetId, }: UseCodexCommonConfigProps) { const { t } = useTranslation(); const [useCommonConfig, setUseCommonConfig] = useState(false); @@ -41,6 +43,11 @@ export function useCodexCommonConfig({ // 用于跟踪新建模式是否已初始化默认勾选 const hasInitializedNewMode = useRef(false); + // 当预设变化时,重置初始化标记,使新预设能够重新触发初始化逻辑 + useEffect(() => { + hasInitializedNewMode.current = false; + }, [selectedPresetId]); + // 初始化:从 config.json 加载,支持从 localStorage 迁移 useEffect(() => { let mounted = true; diff --git a/src/components/providers/forms/hooks/useCommonConfigSnippet.ts b/src/components/providers/forms/hooks/useCommonConfigSnippet.ts index ddc8e4e17..d341ca64a 100644 --- a/src/components/providers/forms/hooks/useCommonConfigSnippet.ts +++ b/src/components/providers/forms/hooks/useCommonConfigSnippet.ts @@ -18,6 +18,7 @@ interface UseCommonConfigSnippetProps { initialData?: { settingsConfig?: Record; }; + selectedPresetId?: string; } /** @@ -28,6 +29,7 @@ export function useCommonConfigSnippet({ settingsConfig, onConfigChange, initialData, + selectedPresetId, }: UseCommonConfigSnippetProps) { const { t } = useTranslation(); const [useCommonConfig, setUseCommonConfig] = useState(false); @@ -43,6 +45,11 @@ export function useCommonConfigSnippet({ // 用于跟踪新建模式是否已初始化默认勾选 const hasInitializedNewMode = useRef(false); + // 当预设变化时,重置初始化标记,使新预设能够重新触发初始化逻辑 + useEffect(() => { + hasInitializedNewMode.current = false; + }, [selectedPresetId]); + // 初始化:从 config.json 加载,支持从 localStorage 迁移 useEffect(() => { let mounted = true; diff --git a/src/components/providers/forms/hooks/useGeminiCommonConfig.ts b/src/components/providers/forms/hooks/useGeminiCommonConfig.ts index 5e5011371..d1f1abb65 100644 --- a/src/components/providers/forms/hooks/useGeminiCommonConfig.ts +++ b/src/components/providers/forms/hooks/useGeminiCommonConfig.ts @@ -19,6 +19,7 @@ interface UseGeminiCommonConfigProps { initialData?: { settingsConfig?: Record; }; + selectedPresetId?: string; } function isPlainObject(value: unknown): value is Record { @@ -42,6 +43,7 @@ export function useGeminiCommonConfig({ envStringToObj, envObjToString, initialData, + selectedPresetId, }: UseGeminiCommonConfigProps) { const { t } = useTranslation(); const [useCommonConfig, setUseCommonConfig] = useState(false); @@ -57,6 +59,11 @@ export function useGeminiCommonConfig({ // 用于跟踪新建模式是否已初始化默认勾选 const hasInitializedNewMode = useRef(false); + // 当预设变化时,重置初始化标记,使新预设能够重新触发初始化逻辑 + useEffect(() => { + hasInitializedNewMode.current = false; + }, [selectedPresetId]); + const parseSnippetEnv = useCallback( ( snippetString: string,