From 04e81ebbe3e94a8669e6c783aa0f91e81ac35e43 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 18 Sep 2025 22:33:55 +0800 Subject: [PATCH] refactor: simplify TOML common config handling by removing markers - Remove COMMON_CONFIG_MARKER_START/END constants - Simplify config snippet addition/removal logic - Use natural append/replace approach instead of markers - Fix unused variable warning - Improve user experience with cleaner config output --- src/components/AppSwitcher.tsx | 4 +- src/components/JsonEditor.tsx | 2 +- src/components/ProviderForm.tsx | 83 +++++++------- .../ProviderForm/ClaudeConfigEditor.tsx | 14 +-- .../ProviderForm/CodexConfigEditor.tsx | 18 +-- src/utils/errorUtils.ts | 2 +- src/utils/providerConfigUtils.ts | 105 +++++++++--------- 7 files changed, 116 insertions(+), 112 deletions(-) diff --git a/src/components/AppSwitcher.tsx b/src/components/AppSwitcher.tsx index c09cc46..5c21cd5 100644 --- a/src/components/AppSwitcher.tsx +++ b/src/components/AppSwitcher.tsx @@ -26,8 +26,8 @@ export function AppSwitcher({ activeApp, onSwitch }: AppSwitcherProps) { diff --git a/src/components/JsonEditor.tsx b/src/components/JsonEditor.tsx index bdd1c16..65868e3 100644 --- a/src/components/JsonEditor.tsx +++ b/src/components/JsonEditor.tsx @@ -62,7 +62,7 @@ const JsonEditor: React.FC = ({ return diagnostics; }), - [showValidation] + [showValidation], ); useEffect(() => { diff --git a/src/components/ProviderForm.tsx b/src/components/ProviderForm.tsx index ed04869..9045e78 100644 --- a/src/components/ProviderForm.tsx +++ b/src/components/ProviderForm.tsx @@ -128,25 +128,26 @@ const ProviderForm: React.FC = ({ const [settingsConfigError, setSettingsConfigError] = useState(""); // 用于跟踪是否正在通过通用配置更新 const isUpdatingFromCommonConfig = useRef(false); - + // Codex 通用配置状态 const [useCodexCommonConfig, setUseCodexCommonConfig] = useState(false); - const [codexCommonConfigSnippet, setCodexCommonConfigSnippetState] = useState(() => { - if (typeof window === "undefined") { - return DEFAULT_CODEX_COMMON_CONFIG_SNIPPET; - } - try { - const stored = window.localStorage.getItem( - CODEX_COMMON_CONFIG_STORAGE_KEY, - ); - if (stored && stored.trim()) { - return stored; + const [codexCommonConfigSnippet, setCodexCommonConfigSnippetState] = + useState(() => { + if (typeof window === "undefined") { + return DEFAULT_CODEX_COMMON_CONFIG_SNIPPET; } - } catch { - // ignore localStorage 读取失败 - } - return DEFAULT_CODEX_COMMON_CONFIG_SNIPPET; - }); + try { + const stored = window.localStorage.getItem( + CODEX_COMMON_CONFIG_STORAGE_KEY, + ); + if (stored && stored.trim()) { + return stored; + } + } catch { + // ignore localStorage 读取失败 + } + return DEFAULT_CODEX_COMMON_CONFIG_SNIPPET; + }); const [codexCommonConfigError, setCodexCommonConfigError] = useState(""); const isUpdatingFromCodexCommonConfig = useRef(false); // -1 表示自定义,null 表示未选择,>= 0 表示预设索引 @@ -217,7 +218,11 @@ const ProviderForm: React.FC = ({ useEffect(() => { if (initialData) { if (!isCodex) { - const configString = JSON.stringify(initialData.settingsConfig, null, 2); + const configString = JSON.stringify( + initialData.settingsConfig, + null, + 2, + ); const hasCommon = hasCommonConfigSnippet( configString, commonConfigSnippet, @@ -235,7 +240,9 @@ const ProviderForm: React.FC = ({ }; if (config.env) { setClaudeModel(config.env.ANTHROPIC_MODEL || ""); - setClaudeSmallFastModel(config.env.ANTHROPIC_SMALL_FAST_MODEL || ""); + setClaudeSmallFastModel( + config.env.ANTHROPIC_SMALL_FAST_MODEL || "", + ); setBaseUrl(config.env.ANTHROPIC_BASE_URL || ""); // 初始化基础 URL // 初始化 Kimi 模型选择 @@ -254,7 +261,13 @@ const ProviderForm: React.FC = ({ setUseCodexCommonConfig(hasCommon); } } - }, [initialData, commonConfigSnippet, codexCommonConfigSnippet, isCodex, codexConfig]); + }, [ + initialData, + commonConfigSnippet, + codexCommonConfigSnippet, + isCodex, + codexConfig, + ]); // 当选择预设变化时,同步类别 useEffect(() => { @@ -497,7 +510,7 @@ const ProviderForm: React.FC = ({ isUpdatingFromCommonConfig.current = false; }, 0); } - + // 保存通用配置到 localStorage if (!validationError && typeof window !== "undefined") { try { @@ -529,10 +542,7 @@ const ProviderForm: React.FC = ({ setBaseUrl(""); // 清空基础 URL // 同步通用配置状态 - const hasCommon = hasCommonConfigSnippet( - configString, - commonConfigSnippet, - ); + const hasCommon = hasCommonConfigSnippet(configString, commonConfigSnippet); setUseCommonConfig(hasCommon); setCommonConfigError(""); @@ -643,10 +653,7 @@ const ProviderForm: React.FC = ({ updateSettingsConfigValue(configString); // 同步通用配置开关 - const hasCommon = hasCommonConfigSnippet( - configString, - commonConfigSnippet, - ); + const hasCommon = hasCommonConfigSnippet(configString, commonConfigSnippet); setUseCommonConfig(hasCommon); }; @@ -681,11 +688,12 @@ const ProviderForm: React.FC = ({ // Codex: 处理通用配置开关 const handleCodexCommonConfigToggle = (checked: boolean) => { - const { updatedConfig, error: snippetError } = updateTomlCommonConfigSnippet( - codexConfig, - codexCommonConfigSnippet, - checked, - ); + const { updatedConfig, error: snippetError } = + updateTomlCommonConfigSnippet( + codexConfig, + codexCommonConfigSnippet, + checked, + ); if (snippetError) { setCodexCommonConfigError(snippetError); @@ -753,10 +761,7 @@ const ProviderForm: React.FC = ({ // 保存 Codex 通用配置到 localStorage if (typeof window !== "undefined") { try { - window.localStorage.setItem( - CODEX_COMMON_CONFIG_STORAGE_KEY, - value, - ); + window.localStorage.setItem(CODEX_COMMON_CONFIG_STORAGE_KEY, value); } catch { // ignore localStorage 写入失败 } @@ -1177,7 +1182,9 @@ const ProviderForm: React.FC = ({ useCommonConfig={useCodexCommonConfig} onCommonConfigToggle={handleCodexCommonConfigToggle} commonConfigSnippet={codexCommonConfigSnippet} - onCommonConfigSnippetChange={handleCodexCommonConfigSnippetChange} + onCommonConfigSnippetChange={ + handleCodexCommonConfigSnippetChange + } commonConfigError={codexCommonConfigError} authError={codexAuthError} /> diff --git a/src/components/ProviderForm/ClaudeConfigEditor.tsx b/src/components/ProviderForm/ClaudeConfigEditor.tsx index 2b75e6d..03aa98b 100644 --- a/src/components/ProviderForm/ClaudeConfigEditor.tsx +++ b/src/components/ProviderForm/ClaudeConfigEditor.tsx @@ -60,7 +60,7 @@ const ClaudeConfigEditor: React.FC = ({ // 支持按下 ESC 关闭弹窗 useEffect(() => { if (!isCommonConfigModalOpen) return; - + const onKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { e.preventDefault(); @@ -120,15 +120,13 @@ const ClaudeConfigEditor: React.FC = ({ rows={12} /> {configError && ( -

- {configError} -

+

{configError}

)}

完整的 Claude Code settings.json 配置内容

{isCommonConfigModalOpen && ( -
{ if (e.target === e.currentTarget) closeModal(); @@ -136,7 +134,7 @@ const ClaudeConfigEditor: React.FC = ({ > {/* Backdrop - 统一背景样式 */}
- + {/* Modal - 统一窗口样式 */}
{/* Header - 统一标题栏样式 */} @@ -153,7 +151,7 @@ const ClaudeConfigEditor: React.FC = ({
- + {/* Content - 统一内容区域样式 */}

@@ -171,7 +169,7 @@ const ClaudeConfigEditor: React.FC = ({

)}
- + {/* Footer - 统一底部按钮样式 */}
{isCommonConfigModalOpen && ( -
{ if (e.target === e.currentTarget) closeModal(); @@ -169,7 +167,7 @@ const CodexConfigEditor: React.FC = ({ > {/* Backdrop - 统一背景样式 */}
- + {/* Modal - 统一窗口样式 */}
{/* Header - 统一标题栏样式 */} @@ -186,7 +184,7 @@ const CodexConfigEditor: React.FC = ({
- + {/* Content - 统一内容区域样式 */}

@@ -194,7 +192,9 @@ const CodexConfigEditor: React.FC = ({