diff --git a/UPDATELOG.md b/UPDATELOG.md index 7ba6ad88..ac80a5ad 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -40,6 +40,7 @@ - 重构更新失败回退机制,使用后端完成更新失败后回退到使用 Clash 代理再次尝试更新 - 编辑非激活订阅的时候不在触发当前订阅配置重载 - 改进核心功能防止主进程阻塞、改进MihomoManager实现,以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况 + - 优化系统代理设置更新逻辑 ## v2.2.3 diff --git a/src/components/setting/mods/sysproxy-viewer.tsx b/src/components/setting/mods/sysproxy-viewer.tsx index aeaabdd1..a7b80257 100644 --- a/src/components/setting/mods/sysproxy-viewer.tsx +++ b/src/components/setting/mods/sysproxy-viewer.tsx @@ -17,6 +17,7 @@ import { EditRounded } from "@mui/icons-material"; import { Autocomplete, Button, + CircularProgress, InputAdornment, List, ListItem, @@ -79,6 +80,7 @@ export const SysproxyViewer = forwardRef((props, ref) => { const [open, setOpen] = useState(false); const [editorOpen, setEditorOpen] = useState(false); + const [saving, setSaving] = useState(false); const { verge, patchVerge } = useVerge(); const [hostOptions, setHostOptions] = useState([]); @@ -224,80 +226,87 @@ export const SysproxyViewer = forwardRef((props, ref) => { return; } - const patch: Partial = {}; - - if (value.guard !== enable_proxy_guard) { - patch.enable_proxy_guard = value.guard; - } - if (value.duration !== proxy_guard_duration) { - patch.proxy_guard_duration = value.duration; - } - if (value.bypass !== system_proxy_bypass) { - patch.system_proxy_bypass = value.bypass; - } - if (value.pac !== proxy_auto_config) { - patch.proxy_auto_config = value.pac; - } - if (value.use_default !== use_default_bypass) { - patch.use_default_bypass = value.use_default; - } - - let pacContent = value.pac_content; - if (pacContent) { - pacContent = pacContent.replace(/%proxy_host%/g, value.proxy_host); - } - - if (pacContent !== pac_file_content) { - patch.pac_file_content = pacContent; - } - - // 处理IPv6地址,如果是IPv6地址但没有被方括号包围,则添加方括号 - let proxyHost = value.proxy_host; - if ( - ipv6Regex.test(proxyHost) && - !proxyHost.startsWith("[") && - !proxyHost.endsWith("]") - ) { - proxyHost = `[${proxyHost}]`; - } - - if (proxyHost !== proxy_host) { - patch.proxy_host = proxyHost; - } - + setSaving(true); try { + const patch: Partial = {}; + + if (value.guard !== enable_proxy_guard) { + patch.enable_proxy_guard = value.guard; + } + if (value.duration !== proxy_guard_duration) { + patch.proxy_guard_duration = value.duration; + } + if (value.bypass !== system_proxy_bypass) { + patch.system_proxy_bypass = value.bypass; + } + if (value.pac !== proxy_auto_config) { + patch.proxy_auto_config = value.pac; + } + if (value.use_default !== use_default_bypass) { + patch.use_default_bypass = value.use_default; + } + + let pacContent = value.pac_content; + if (pacContent) { + pacContent = pacContent.replace(/%proxy_host%/g, value.proxy_host); + } + + if (pacContent !== pac_file_content) { + patch.pac_file_content = pacContent; + } + + // 处理IPv6地址,如果是IPv6地址但没有被方括号包围,则添加方括号 + let proxyHost = value.proxy_host; + if ( + ipv6Regex.test(proxyHost) && + !proxyHost.startsWith("[") && + !proxyHost.endsWith("]") + ) { + proxyHost = `[${proxyHost}]`; + } + + if (proxyHost !== proxy_host) { + patch.proxy_host = proxyHost; + } + + // 判断是否需要重置系统代理 + const needResetProxy = + value.pac !== proxy_auto_config || + proxyHost !== proxy_host || + pacContent !== pac_file_content || + value.bypass !== system_proxy_bypass || + value.use_default !== use_default_bypass; + await patchVerge(patch); // 更新系统代理状态,以便UI立即反映变化 - await new Promise((resolve) => setTimeout(resolve, 100)); - await mutate("getSystemProxy"); - await mutate("getAutotemProxy"); + await Promise.all([mutate("getSystemProxy"), mutate("getAutotemProxy")]); - // 如果系统代理当前已开启,则重新应用系统代理设置以便立即生效 - const currentSysProxy = await getSystemProxy(); - const currentAutoProxy = await getAutotemProxy(); - - if (value.pac ? currentAutoProxy?.enable : currentSysProxy?.enable) { - // 如果系统代理已开启,则通过临时切换代理状态来触发系统代理重新应用 - const currentState = enabled ?? false; + // 只有在修改了影响系统代理的配置且系统代理当前启用时,才重置系统代理 + if (needResetProxy) { + const currentSysProxy = await getSystemProxy(); + const currentAutoProxy = await getAutotemProxy(); - // 临时关闭系统代理 - await patchVergeConfig({ enable_system_proxy: false }); - - // 等待一小段时间 - await new Promise((resolve) => setTimeout(resolve, 300)); - - // 重新开启系统代理 - await patchVergeConfig({ enable_system_proxy: currentState }); - - // 更新UI状态 - await mutate("getSystemProxy"); - await mutate("getAutotemProxy"); + if (value.pac ? currentAutoProxy?.enable : currentSysProxy?.enable) { + // 临时关闭系统代理 + await patchVergeConfig({ enable_system_proxy: false }); + + // 减少等待时间 + await new Promise((resolve) => setTimeout(resolve, 200)); + + // 重新开启系统代理 + await patchVergeConfig({ enable_system_proxy: true }); + + // 更新UI状态 + await Promise.all([mutate("getSystemProxy"), mutate("getAutotemProxy")]); + } } setOpen(false); } catch (err: any) { Notice.error(err.message || err.toString()); + } finally { + setSaving(false); } }); @@ -311,6 +320,8 @@ export const SysproxyViewer = forwardRef((props, ref) => { onClose={() => setOpen(false)} onCancel={() => setOpen(false)} onOk={onSave} + loading={saving} + disableOk={saving} >