From e97d14f35b34de6b4a54098e0ca78eabe97fd4d2 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Wed, 28 Oct 2026 06:48:04 +0800 Subject: [PATCH] fix(setting): build viewer form defaults from a single source sysproxy, misc and tunnels viewers duplicated their form default literals in useState and open(), and the two copies in misc-viewer had already diverged (app log max size, app log max count, auto log clean). Extract a buildInitialValues factory per viewer and unify on the open() values, which are the only ones users could ever see. --- src/components/setting/mods/misc-viewer.tsx | 47 +++++++------------ .../setting/mods/sysproxy-viewer.tsx | 33 +++++-------- .../setting/mods/tunnels-viewer.tsx | 30 +++++------- 3 files changed, 43 insertions(+), 67 deletions(-) diff --git a/src/components/setting/mods/misc-viewer.tsx b/src/components/setting/mods/misc-viewer.tsx index 91247c877..8ebd99057 100644 --- a/src/components/setting/mods/misc-viewer.tsx +++ b/src/components/setting/mods/misc-viewer.tsx @@ -15,44 +15,33 @@ import { BaseDialog, DialogRef, Switch, TooltipIcon } from '@/components/base' import { useVerge } from '@/hooks/use-verge' import { showNotice } from '@/services/notice-service' +const buildInitialValues = (verge?: IVergeConfig | null) => ({ + appLogLevel: verge?.app_log_level ?? 'warn', + appLogMaxSize: verge?.app_log_max_size ?? 128, + appLogMaxCount: verge?.app_log_max_count ?? 8, + autoCloseConnection: verge?.auto_close_connection ?? true, + autoCheckUpdate: verge?.auto_check_update ?? true, + enableBuiltinEnhanced: verge?.enable_builtin_enhanced ?? true, + proxyLayoutColumn: verge?.proxy_layout_column || 6, + enableAutoDelayDetection: verge?.enable_auto_delay_detection ?? false, + autoDelayDetectionIntervalMinutes: + verge?.auto_delay_detection_interval_minutes ?? 5, + defaultLatencyTest: verge?.default_latency_test || '', + autoLogClean: verge?.auto_log_clean || 0, + defaultLatencyTimeout: verge?.default_latency_timeout || 10000, +}) + export const MiscViewer = forwardRef((props, ref) => { const { t } = useTranslation() const { verge, patchVerge } = useVerge() const [open, setOpen] = useState(false) - const [values, setValues] = useState({ - appLogLevel: 'warn', - appLogMaxSize: 8, - appLogMaxCount: 12, - autoCloseConnection: true, - autoCheckUpdate: true, - enableBuiltinEnhanced: true, - proxyLayoutColumn: 6, - enableAutoDelayDetection: false, - autoDelayDetectionIntervalMinutes: 5, - defaultLatencyTest: '', - autoLogClean: 2, - defaultLatencyTimeout: 10000, - }) + const [values, setValues] = useState(() => buildInitialValues(null)) useImperativeHandle(ref, () => ({ open: () => { setOpen(true) - setValues({ - appLogLevel: verge?.app_log_level ?? 'warn', - appLogMaxSize: verge?.app_log_max_size ?? 128, - appLogMaxCount: verge?.app_log_max_count ?? 8, - autoCloseConnection: verge?.auto_close_connection ?? true, - autoCheckUpdate: verge?.auto_check_update ?? true, - enableBuiltinEnhanced: verge?.enable_builtin_enhanced ?? true, - proxyLayoutColumn: verge?.proxy_layout_column || 6, - enableAutoDelayDetection: verge?.enable_auto_delay_detection ?? false, - autoDelayDetectionIntervalMinutes: - verge?.auto_delay_detection_interval_minutes ?? 5, - defaultLatencyTest: verge?.default_latency_test || '', - autoLogClean: verge?.auto_log_clean || 0, - defaultLatencyTimeout: verge?.default_latency_timeout || 10000, - }) + setValues(buildInitialValues(verge)) }, close: () => setOpen(false), })) diff --git a/src/components/setting/mods/sysproxy-viewer.tsx b/src/components/setting/mods/sysproxy-viewer.tsx index 2e1d6ff31..eb7997e88 100644 --- a/src/components/setting/mods/sysproxy-viewer.tsx +++ b/src/components/setting/mods/sysproxy-viewer.tsx @@ -87,6 +87,17 @@ const splitBypass = (value?: string) => .map((item) => item.trim()) .filter(Boolean) +const buildInitialValues = (verge?: IVergeConfig | null) => ({ + guard: verge?.enable_proxy_guard, + enable_bypass_check: verge?.enable_bypass_check ?? true, + bypass: verge?.system_proxy_bypass, + duration: verge?.proxy_guard_duration ?? 10, + use_default: verge?.use_default_bypass ?? true, + pac: verge?.proxy_auto_config, + pac_content: verge?.pac_file_content ?? DEFAULT_PAC, + proxy_host: verge?.proxy_host ?? '127.0.0.1', +}) + export const SysproxyViewer = forwardRef((props, ref) => { const { t } = useTranslation() const systemName = getSystem() @@ -116,16 +127,7 @@ export const SysproxyViewer = forwardRef((props, ref) => { proxy_host, } = verge ?? {} - const [value, setValue] = useState({ - guard: enable_proxy_guard, - enable_bypass_check: enable_bypass_check ?? true, - bypass: system_proxy_bypass, - duration: proxy_guard_duration ?? 10, - use_default: use_default_bypass ?? true, - pac: proxy_auto_config, - pac_content: pac_file_content ?? DEFAULT_PAC, - proxy_host: proxy_host ?? '127.0.0.1', - }) + const [value, setValue] = useState(() => buildInitialValues(null)) const [embeddedServerPort, setEmbeddedServerPort] = useState( null, ) @@ -192,16 +194,7 @@ export const SysproxyViewer = forwardRef((props, ref) => { useImperativeHandle(ref, () => ({ open: () => { setOpen(true) - setValue({ - guard: enable_proxy_guard, - enable_bypass_check: enable_bypass_check ?? true, - bypass: system_proxy_bypass, - duration: proxy_guard_duration ?? 10, - use_default: use_default_bypass ?? true, - pac: proxy_auto_config, - pac_content: pac_file_content ?? DEFAULT_PAC, - proxy_host: proxy_host ?? '127.0.0.1', - }) + setValue(buildInitialValues(verge)) fetchNetworkInterfaces() }, close: () => setOpen(false), diff --git a/src/components/setting/mods/tunnels-viewer.tsx b/src/components/setting/mods/tunnels-viewer.tsx index 1efb1a81c..fe149c51b 100644 --- a/src/components/setting/mods/tunnels-viewer.tsx +++ b/src/components/setting/mods/tunnels-viewer.tsx @@ -76,34 +76,28 @@ const proxyOptionToken = ({ memberIndex, member }: TunnelProxyOption) => member.kind === 'node' ? member.node.recordId : member.ref.name }` +const buildInitialValues = (): TunnelFormValues => ({ + localAddr: '', + localPort: '', + targetAddr: '', + targetPort: '', + network: 'tcp+udp', + group: '', + proxy: null, +}) + export const TunnelsViewer = forwardRef((_, ref) => { const { t } = useTranslation() const { clash, mutateClash, patchClash } = useClash() const [open, setOpen] = useState(false) const [expanded, setExpanded] = useState(false) - const [values, setValues] = useState({ - localAddr: '', - localPort: '', - targetAddr: '', - targetPort: '', - network: 'tcp+udp', - group: '', - proxy: null, - }) + const [values, setValues] = useState(buildInitialValues) const [draftTunnels, setDraftTunnels] = useState([]) useImperativeHandle(ref, () => ({ open: () => { - setValues(() => ({ - localAddr: '', - localPort: '', - targetAddr: '', - targetPort: '', - network: 'tcp+udp', - group: '', - proxy: null, - })) + setValues(buildInitialValues()) setDraftTunnels(() => clash?.tunnels ?? []) setOpen(true) // 如果没有隧道,则自动展开