diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index ec03457fa..7f9bcd9e5 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -155,6 +155,9 @@ pub struct IVerge { /// 是否自动检测当前节点延迟 pub enable_auto_delay_detection: Option, + /// 自动检测当前节点延迟的间隔(分钟) + pub auto_delay_detection_interval_minutes: Option, + /// 是否使用内部的脚本支持,默认为真 pub enable_builtin_enhanced: Option, @@ -523,6 +526,7 @@ impl IVerge { patch!(default_latency_test); patch!(default_latency_timeout); patch!(enable_auto_delay_detection); + patch!(auto_delay_detection_interval_minutes); patch!(enable_builtin_enhanced); patch!(proxy_layout_column); patch!(test_list); diff --git a/src/components/home/current-proxy-card.tsx b/src/components/home/current-proxy-card.tsx index c192f1e53..3b9f0907a 100644 --- a/src/components/home/current-proxy-card.tsx +++ b/src/components/home/current-proxy-card.tsx @@ -47,7 +47,7 @@ const STORAGE_KEY_PROXY = "clash-verge-selected-proxy"; const STORAGE_KEY_SORT_TYPE = "clash-verge-proxy-sort-type"; const AUTO_CHECK_INITIAL_DELAY_MS = 1500; -const AUTO_CHECK_INTERVAL_MS = 5 * 60 * 1000; +const AUTO_CHECK_DEFAULT_INTERVAL_MINUTES = 5; // 代理节点信息接口 interface ProxyOption { @@ -106,6 +106,14 @@ export const CurrentProxyCard = () => { const { current: currentProfile } = useProfiles(); const autoDelayEnabled = verge?.enable_auto_delay_detection ?? false; const defaultLatencyTimeout = verge?.default_latency_timeout; + const autoDelayIntervalMs = useMemo(() => { + const rawInterval = verge?.auto_delay_detection_interval_minutes; + const intervalMinutes = + typeof rawInterval === "number" && rawInterval > 0 + ? rawInterval + : AUTO_CHECK_DEFAULT_INTERVAL_MINUTES; + return Math.max(1, Math.round(intervalMinutes)) * 60 * 1000; + }, [verge?.auto_delay_detection_interval_minutes]); const currentProfileId = currentProfile?.uid || null; const getProfileStorageKey = useCallback( @@ -592,13 +600,13 @@ export const CurrentProxyCard = () => { if (disposed) return; await checkCurrentProxyDelay(); if (disposed) return; - intervalTimer = setTimeout(runAndSchedule, AUTO_CHECK_INTERVAL_MS); + intervalTimer = setTimeout(runAndSchedule, autoDelayIntervalMs); }; initialTimer = setTimeout(async () => { await checkCurrentProxyDelay(); if (disposed) return; - intervalTimer = setTimeout(runAndSchedule, AUTO_CHECK_INTERVAL_MS); + intervalTimer = setTimeout(runAndSchedule, autoDelayIntervalMs); }, AUTO_CHECK_INITIAL_DELAY_MS); return () => { @@ -608,6 +616,7 @@ export const CurrentProxyCard = () => { }; }, [ checkCurrentProxyDelay, + autoDelayIntervalMs, isDirectMode, state.selection.group, state.selection.proxy, diff --git a/src/components/setting/mods/misc-viewer.tsx b/src/components/setting/mods/misc-viewer.tsx index 9f493968b..89c0708d4 100644 --- a/src/components/setting/mods/misc-viewer.tsx +++ b/src/components/setting/mods/misc-viewer.tsx @@ -29,6 +29,7 @@ export const MiscViewer = forwardRef((props, ref) => { enableBuiltinEnhanced: true, proxyLayoutColumn: 6, enableAutoDelayDetection: false, + autoDelayDetectionIntervalMinutes: 5, defaultLatencyTest: "", autoLogClean: 2, defaultLatencyTimeout: 10000, @@ -46,6 +47,8 @@ export const MiscViewer = forwardRef((props, ref) => { 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, @@ -65,6 +68,8 @@ export const MiscViewer = forwardRef((props, ref) => { enable_builtin_enhanced: values.enableBuiltinEnhanced, proxy_layout_column: values.proxyLayoutColumn, enable_auto_delay_detection: values.enableAutoDelayDetection, + auto_delay_detection_interval_minutes: + values.autoDelayDetectionIntervalMinutes, default_latency_test: values.defaultLatencyTest, default_latency_timeout: values.defaultLatencyTimeout, auto_log_clean: values.autoLogClean as any, @@ -323,6 +328,44 @@ export const MiscViewer = forwardRef((props, ref) => { /> + + + { + const parsed = parseInt(e.target.value, 10); + const intervalMinutes = + Number.isFinite(parsed) && parsed > 0 ? parsed : 1; + setValues((v) => ({ + ...v, + autoDelayDetectionIntervalMinutes: intervalMinutes, + })); + }} + slotProps={{ + input: { + endAdornment: ( + + {t("shared.units.minutes")} + + ), + }, + }} + /> + +