diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index 8054ccae..87a7d2b1 100644 --- a/src-tauri/src/config/clash.rs +++ b/src-tauri/src/config/clash.rs @@ -55,6 +55,7 @@ impl IClashTemp { map.insert("secret".into(), "".into()); map.insert("tun".into(), tun.into()); map.insert("external-controller-cors".into(), cors_map.into()); + map.insert("unified-delay".into(), true.into()); Self(map) } diff --git a/src-tauri/src/config/runtime.rs b/src-tauri/src/config/runtime.rs index c406c7f0..66b3fec2 100644 --- a/src-tauri/src/config/runtime.rs +++ b/src-tauri/src/config/runtime.rs @@ -19,7 +19,7 @@ impl IRuntime { // 这里只更改 allow-lan | ipv6 | log-level | tun pub fn patch_config(&mut self, patch: Mapping) { if let Some(config) = self.config.as_mut() { - ["allow-lan", "ipv6", "log-level"] + ["allow-lan", "ipv6", "log-level", "unified-delay"] .into_iter() .for_each(|key| { if let Some(value) = patch.get(key).to_owned() { diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 4a21fa28..a1b9ab89 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -9,7 +9,7 @@ use std::collections::HashMap; /// path 是绝对路径 pub async fn put_configs(path: &str) -> Result<()> { let (url, headers) = clash_client_info()?; - let url = format!("{url}/configs"); + let url = format!("{url}/configs?force=true"); let mut data = HashMap::new(); data.insert("path", path); diff --git a/src-tauri/src/enhance/field.rs b/src-tauri/src/enhance/field.rs index d45cc142..f58b588c 100644 --- a/src-tauri/src/enhance/field.rs +++ b/src-tauri/src/enhance/field.rs @@ -1,7 +1,7 @@ use serde_yaml::{Mapping, Value}; use std::collections::HashSet; -pub const HANDLE_FIELDS: [&str; 11] = [ +pub const HANDLE_FIELDS: [&str; 12] = [ "mode", "redir-port", "tproxy-port", @@ -13,6 +13,7 @@ pub const HANDLE_FIELDS: [&str; 11] = [ "ipv6", "external-controller", "secret", + "unified-delay", ]; pub const DEFAULT_FIELDS: [&str; 5] = [ diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 0e0d5cfd..5b95faec 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -119,14 +119,15 @@ pub async fn patch_clash(patch: Mapping) -> Result<()> { Config::generate().await?; CoreManager::global().restart_core().await?; handle::Handle::refresh_clash(); - } + } else { + if patch.get("mode").is_some() { + log_err!(handle::Handle::update_systray_part()); + } - if patch.get("mode").is_some() { - log_err!(handle::Handle::update_systray_part()); + Config::runtime().latest().patch_config(patch); + update_core_config(false).await?; } - Config::runtime().latest().patch_config(patch); - >::Ok(()) }; match res { diff --git a/src/components/setting/mods/guard-state.tsx b/src/components/setting/mods/guard-state.tsx index 5ab8e991..745141e0 100644 --- a/src/components/setting/mods/guard-state.tsx +++ b/src/components/setting/mods/guard-state.tsx @@ -41,7 +41,6 @@ export function GuardState(props: Props) { childProps[onChangeProps] = async (...args: any[]) => { // 多次操作无效 if (lockRef.current) return; - lockRef.current = true; try { diff --git a/src/components/setting/setting-clash.tsx b/src/components/setting/setting-clash.tsx index 0505614e..aa31a98f 100644 --- a/src/components/setting/setting-clash.tsx +++ b/src/components/setting/setting-clash.tsx @@ -34,7 +34,12 @@ const SettingClash = ({ onError }: Props) => { const { clash, version, mutateClash, patchClash } = useClash(); const { verge, mutateVerge, patchVerge } = useVerge(); - const { ipv6, "allow-lan": allowLan, "log-level": logLevel } = clash ?? {}; + const { + ipv6, + "allow-lan": allowLan, + "log-level": logLevel, + "unified-delay": unifiedDelay, + } = clash ?? {}; const { enable_random_port = false, verge_mixed_port } = verge ?? {}; @@ -106,6 +111,19 @@ const SettingClash = ({ onError }: Props) => { + + onChangeData({ "unified-delay": e })} + onGuard={(e) => patchClash({ "unified-delay": e })} + > + + + + { ); const patchClash = useLockFn(async (patch: Partial) => { - await updateConfigs(patch); await patchClashConfig(patch); mutateClash(); }); diff --git a/src/locales/en.json b/src/locales/en.json index 7a2d652a..3802322d 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -246,6 +246,7 @@ "Ip Address": "IP Address", "Mac Address": "MAC Address", "IPv6": "IPv6", + "Unified Delay": "Unified Delay", "Log Level": "Log Level", "Port Config": "Port Config", "Random Port": "Random Port", diff --git a/src/locales/fa.json b/src/locales/fa.json index 108dc01d..4b872d86 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -241,6 +241,7 @@ "Ip Address": "آدرس IP", "Mac Address": "آدرس MAC", "IPv6": "IPv6", + "Unified Delay": "معادلDELAY", "Log Level": "سطح لاگ", "Port Config": "پیکربندی پورت", "Random Port": "پورت تصادفی", diff --git a/src/locales/ru.json b/src/locales/ru.json index 09eaa205..ed00491b 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -244,6 +244,7 @@ "Ip Address": "IP адрес", "Mac Address": "MAC адрес", "IPv6": "IPv6", + "Unified Delay": "Общий задержка", "Log Level": "Уровень логов", "Port Config": "Настройка порта", "Random Port": "Случайный порт", diff --git a/src/locales/zh.json b/src/locales/zh.json index 2760e3e9..03a71457 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -246,6 +246,7 @@ "Ip Address": "IP 地址", "Mac Address": "MAC 地址", "IPv6": "IPv6", + "Unified Delay": "统一延时", "Log Level": "日志等级", "Port Config": "端口设置", "Random Port": "随机端口", diff --git a/src/pages/proxies.tsx b/src/pages/proxies.tsx index 9259b8b3..67bc9b31 100644 --- a/src/pages/proxies.tsx +++ b/src/pages/proxies.tsx @@ -3,11 +3,7 @@ import { useEffect } from "react"; import { useLockFn } from "ahooks"; import { useTranslation } from "react-i18next"; import { Box, Button, ButtonGroup } from "@mui/material"; -import { - closeAllConnections, - getClashConfig, - updateConfigs, -} from "@/services/api"; +import { closeAllConnections, getClashConfig } from "@/services/api"; import { patchClashConfig } from "@/services/cmds"; import { useVerge } from "@/hooks/use-verge"; import { BasePage } from "@/components/base"; @@ -33,7 +29,6 @@ const ProxyPage = () => { if (mode !== curMode && verge?.auto_close_connection) { closeAllConnections(); } - await updateConfigs({ mode }); await patchClashConfig({ mode }); mutateClash(); }); diff --git a/src/services/api.ts b/src/services/api.ts index b46e6aef..c102f2f3 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -49,12 +49,6 @@ export const getClashConfig = async () => { return instance.get("/configs") as Promise; }; -/// Update current configs -export const updateConfigs = async (config: Partial) => { - const instance = await getAxios(); - return instance.patch("/configs", config); -}; - /// Update geo data export const updateGeoData = async () => { const instance = await getAxios(); diff --git a/src/services/types.d.ts b/src/services/types.d.ts index df48e529..be2eb29e 100644 --- a/src/services/types.d.ts +++ b/src/services/types.d.ts @@ -32,6 +32,7 @@ interface IConfigData { "tproxy-port": number; "external-controller": string; secret: string; + "unified-delay": boolean; tun: { stack: string; device: string;