import React, { useState, useEffect, useRef } from "react"; import { X, Save } from "lucide-react"; import { extractBaseUrlFromToml } from "../../utils/providerConfigUtils"; interface CodexConfigEditorProps { authValue: string; configValue: string; onAuthChange: (value: string) => void; onConfigChange: (value: string) => void; onAuthBlur?: () => void; useCommonConfig: boolean; onCommonConfigToggle: (checked: boolean) => void; commonConfigSnippet: string; onCommonConfigSnippetChange: (value: string) => void; commonConfigError: string; authError: string; } const CodexConfigEditor: React.FC = ({ authValue, configValue, onAuthChange, onConfigChange, onAuthBlur, useCommonConfig, onCommonConfigToggle, commonConfigSnippet, onCommonConfigSnippetChange, commonConfigError, authError, }) => { const [isCommonConfigModalOpen, setIsCommonConfigModalOpen] = useState(false); const [writeVscodeConfig, setWriteVscodeConfig] = useState(false); const [vscodeError, setVscodeError] = useState(""); const [vscodeSuccess, setVscodeSuccess] = useState(""); const [isWritingVscode, setIsWritingVscode] = useState(false); const lastAppliedBaseUrlRef = useRef(null); useEffect(() => { if (commonConfigError && !isCommonConfigModalOpen) { setIsCommonConfigModalOpen(true); } }, [commonConfigError, isCommonConfigModalOpen]); useEffect(() => { if (!vscodeSuccess) return; const timer = window.setTimeout(() => { setVscodeSuccess(""); }, 3000); return () => window.clearTimeout(timer); }, [vscodeSuccess]); const ensureVscodeApiAvailable = () => { if (typeof window === "undefined" || !window.api?.writeVscodeSettings) { setVscodeError("当前环境暂不支持写入 VS Code 配置"); return false; } return true; }; const applyVscodeConfig = async ( baseUrl: string, successMessage = "已写入 VS Code 配置", ) => { if (!ensureVscodeApiAvailable()) { return false; } setIsWritingVscode(true); try { const success = await window.api.writeVscodeSettings(baseUrl); if (success) { setVscodeSuccess(successMessage); lastAppliedBaseUrlRef.current = baseUrl; return true; } setVscodeError("写入 VS Code 配置失败,请稍后重试"); } catch (error) { setVscodeError(`写入 VS Code 配置失败: ${String(error)}`); } finally { setIsWritingVscode(false); } return false; }; const removeVscodeConfig = async () => { if (!ensureVscodeApiAvailable()) { return false; } setIsWritingVscode(true); try { const success = await window.api.writeVscodeSettings(); if (success) { setVscodeSuccess("已移除 VS Code 配置"); lastAppliedBaseUrlRef.current = null; return true; } setVscodeError("移除 VS Code 配置失败,请稍后重试"); } catch (error) { setVscodeError(`移除 VS Code 配置失败: ${String(error)}`); } finally { setIsWritingVscode(false); } return false; }; const handleVscodeConfigToggle = async (checked: boolean) => { if (isWritingVscode) return; setWriteVscodeConfig(checked); setVscodeError(""); setVscodeSuccess(""); if (checked) { const trimmed = configValue.trim(); if (!trimmed) { setVscodeError("请先填写 config.toml,再写入 VS Code 配置"); setWriteVscodeConfig(false); return; } const baseUrl = extractBaseUrlFromToml(trimmed); if (!baseUrl) { setVscodeError("未在 config.toml 中找到 base_url 字段"); setWriteVscodeConfig(false); return; } const success = await applyVscodeConfig(baseUrl); if (!success) { setWriteVscodeConfig(false); } return; } const success = await removeVscodeConfig(); if (!success) { setWriteVscodeConfig(true); } }; useEffect(() => { if (!writeVscodeConfig || isWritingVscode) { return; } const trimmed = configValue.trim(); if (!trimmed) { return; } const baseUrl = extractBaseUrlFromToml(trimmed); if (!baseUrl) { setVscodeError("未在 config.toml 中找到 base_url 字段"); setWriteVscodeConfig(false); return; } if (lastAppliedBaseUrlRef.current === baseUrl) { return; } const sync = async () => { // 直接调用 API 而不依赖 applyVscodeConfig 函数,避免闭包问题 if (typeof window === "undefined" || !window.api?.writeVscodeSettings) { setVscodeError("当前环境暂不支持写入 VS Code 配置"); return; } setIsWritingVscode(true); try { const success = await window.api.writeVscodeSettings(baseUrl); if (success) { setVscodeSuccess("已更新 VS Code 配置"); lastAppliedBaseUrlRef.current = baseUrl; } else { setVscodeError("写入 VS Code 配置失败,请稍后重试"); } } catch (error) { setVscodeError(`写入 VS Code 配置失败: ${String(error)}`); } finally { setIsWritingVscode(false); } }; sync(); }, [configValue, writeVscodeConfig, isWritingVscode]); // 支持按下 ESC 关闭弹窗 useEffect(() => { if (!isCommonConfigModalOpen) return; const onKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { e.preventDefault(); closeModal(); } }; window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); }, [isCommonConfigModalOpen]); const closeModal = () => { setIsCommonConfigModalOpen(false); }; return (