From 15c12c8e6510d09f110575f4906a919490b32da0 Mon Sep 17 00:00:00 2001 From: Jason Date: Wed, 17 Sep 2025 10:36:28 +0800 Subject: [PATCH] fix: resolve checkbox sync issue when editing common config snippet The checkbox state was becoming out of sync when users edited the common config snippet. Added a ref flag to track when updates are coming from common config changes to prevent the handleChange function from incorrectly resetting the checkbox state during these updates. --- src/components/ProviderForm.tsx | 34 +++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/components/ProviderForm.tsx b/src/components/ProviderForm.tsx index 50851b7..4370d8a 100644 --- a/src/components/ProviderForm.tsx +++ b/src/components/ProviderForm.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useRef } from "react"; import { Provider, ProviderCategory } from "../types"; import { AppType } from "../lib/tauri-api"; import { @@ -106,6 +106,8 @@ const ProviderForm: React.FC = ({ return DEFAULT_COMMON_CONFIG_SNIPPET; }); const [commonConfigError, setCommonConfigError] = useState(""); + // 用于跟踪是否正在通过通用配置更新 + const isUpdatingFromCommonConfig = useRef(false); // -1 表示自定义,null 表示未选择,>= 0 表示预设索引 const [selectedPreset, setSelectedPreset] = useState( showPresets ? -1 : null, @@ -293,9 +295,11 @@ const ProviderForm: React.FC = ({ const { name, value } = e.target; if (name === "settingsConfig") { - // 同时检查并同步选择框状态 - const hasCommon = hasCommonConfigSnippet(value, commonConfigSnippet); - setUseCommonConfig(hasCommon); + // 只有在不是通过通用配置更新时,才检查并同步选择框状态 + if (!isUpdatingFromCommonConfig.current) { + const hasCommon = hasCommonConfigSnippet(value, commonConfigSnippet); + setUseCommonConfig(hasCommon); + } // 同步 API Key 输入框显示与值 const parsedKey = getApiKeyFromConfig(value); @@ -330,10 +334,16 @@ const ProviderForm: React.FC = ({ setCommonConfigError(""); setUseCommonConfig(checked); + // 标记正在通过通用配置更新 + isUpdatingFromCommonConfig.current = true; setFormData((prev) => ({ ...prev, settingsConfig: updatedConfig, })); + // 在下一个事件循环中重置标记 + setTimeout(() => { + isUpdatingFromCommonConfig.current = false; + }, 0); }; const handleCommonConfigSnippetChange = (value: string) => { @@ -348,6 +358,7 @@ const ProviderForm: React.FC = ({ previousSnippet, false, ); + // 直接更新 formData,不通过 handleChange setFormData((prev) => ({ ...prev, settingsConfig: updatedConfig, @@ -385,10 +396,25 @@ const ProviderForm: React.FC = ({ return; } + // 标记正在通过通用配置更新,避免触发状态检查 + isUpdatingFromCommonConfig.current = true; setFormData((prev) => ({ ...prev, settingsConfig: addResult.updatedConfig, })); + // 在下一个事件循环中重置标记 + setTimeout(() => { + isUpdatingFromCommonConfig.current = false; + }, 0); + } + + // 保存通用配置到 localStorage + if (isValidJson && typeof window !== "undefined") { + try { + window.localStorage.setItem(COMMON_CONFIG_STORAGE_KEY, value); + } catch { + // ignore localStorage 写入失败 + } } };