diff --git a/src/components/AIConfigModal.tsx b/src/components/AIConfigModal.tsx index c91c4d6..f5c4345 100644 --- a/src/components/AIConfigModal.tsx +++ b/src/components/AIConfigModal.tsx @@ -68,9 +68,19 @@ const AIConfigModal: React.FC = ({ setConnectionStatus({ kind: "idle" }); }, []); - // ── Connection test ──────────────────────────────────────────────────────── + // ── Save & Verify ────────────────────────────────────────────────────────── + + const handleSave = useCallback(async () => { + if (!useLLM) { + onSave({ + ...DEFAULT_LLM_CONFIG, + enabled: false, + apiKey: apiKey.trim(), + model: selectedModel, + }); + return; + } - const handleTestConnection = useCallback(async () => { if (!apiKey.trim()) { setConnectionStatus({ kind: "error", @@ -87,52 +97,29 @@ const AIConfigModal: React.FC = ({ DEFAULT_LLM_CONFIG.apiUrl, ); - setConnectionStatus( - result.success - ? { - kind: "success", - message: t("aiConfig.llm.connectedMsg", { - modelName: - MODELS.find((m) => m.id === selectedModel)?.name ?? - selectedModel, - }), - } - : { - kind: "error", - message: t("aiConfig.llm.connectionError", { - error: result.message, - }), - }, - ); - }, [apiKey, selectedModel, t]); - - // ── Save ─────────────────────────────────────────────────────────────────── - - const handleSave = useCallback(() => { - const newConfig: LLMConfig = { - ...DEFAULT_LLM_CONFIG, - enabled: useLLM, - apiKey: apiKey.trim(), - model: selectedModel, - }; - onSave(newConfig); - }, [useLLM, apiKey, selectedModel, onSave]); - - // ── Test & Save (merged action) ──────────────────────────────────────────── - - const handleTestAndSave = useCallback(async () => { - if (!useLLM) { - handleSave(); - return; - } - if (connectionStatus.kind === "success") { - // Already tested — save directly - handleSave(); - return; + if (result.success) { + setConnectionStatus({ + kind: "success", + message: t("aiConfig.llm.connectedMsg", { + modelName: + MODELS.find((m) => m.id === selectedModel)?.name ?? selectedModel, + }), + }); + onSave({ + ...DEFAULT_LLM_CONFIG, + enabled: true, + apiKey: apiKey.trim(), + model: selectedModel, + }); + } else { + setConnectionStatus({ + kind: "error", + message: t("aiConfig.llm.connectionError", { + error: result.message, + }), + }); } - // First press: run the test; button will become "Save" on success - await handleTestConnection(); - }, [useLLM, connectionStatus.kind, handleTestConnection, handleSave]); + }, [useLLM, apiKey, selectedModel, onSave, t]); // ── Render ───────────────────────────────────────────────────────────────── @@ -385,7 +372,7 @@ const AIConfigModal: React.FC = ({ styles.saveBtn, connectionStatus.kind === "testing" && styles.saveBtnDisabled, ]} - onPress={handleTestAndSave} + onPress={handleSave} disabled={connectionStatus.kind === "testing"} activeOpacity={0.8} > @@ -393,8 +380,8 @@ const AIConfigModal: React.FC = ({ ) : ( - {useLLM && connectionStatus.kind !== "success" - ? t("aiConfig.buttons.verify") + {useLLM + ? t("aiConfig.buttons.verifyAndSave") : t("aiConfig.buttons.save")} )} diff --git a/src/locales/en/modals.json b/src/locales/en/modals.json index 4d315a8..04072bb 100644 --- a/src/locales/en/modals.json +++ b/src/locales/en/modals.json @@ -58,7 +58,7 @@ }, "buttons": { "cancel": "Cancel", - "verify": "Verify", + "verifyAndSave": "Verify & Save", "save": "Save" }, "models": { diff --git a/src/locales/types.ts b/src/locales/types.ts index c671160..a05cb04 100644 --- a/src/locales/types.ts +++ b/src/locales/types.ts @@ -148,7 +148,7 @@ export interface ModalsTranslations { }; buttons: { cancel: string; - verify: string; + verifyAndSave: string; save: string; }; models: { diff --git a/src/locales/zh/modals.json b/src/locales/zh/modals.json index 547cb9d..09f479e 100644 --- a/src/locales/zh/modals.json +++ b/src/locales/zh/modals.json @@ -58,7 +58,7 @@ }, "buttons": { "cancel": "取消", - "verify": "验证", + "verifyAndSave": "验证并保存", "save": "保存" }, "models": {