From fee08f3826af5dce0d9e328fb7a3888e8d0f307d Mon Sep 17 00:00:00 2001 From: wonfen Date: Sun, 22 Jun 2025 23:19:11 +0800 Subject: [PATCH] fix: correct address display error caused by async system proxy retrieval --- src/components/home/clash-info-card.tsx | 13 ++- .../setting/mods/sysproxy-viewer.tsx | 36 ++++++- src/providers/app-data-provider.tsx | 95 ++++++++++++++----- 3 files changed, 113 insertions(+), 31 deletions(-) diff --git a/src/components/home/clash-info-card.tsx b/src/components/home/clash-info-card.tsx index 029f174c..dcdd22a8 100644 --- a/src/components/home/clash-info-card.tsx +++ b/src/components/home/clash-info-card.tsx @@ -17,7 +17,7 @@ const formatUptime = (uptimeMs: number) => { export const ClashInfoCard = () => { const { t } = useTranslation(); const { version: clashVersion } = useClash(); - const { clashConfig, sysproxy, rules, uptime } = useAppData(); + const { clashConfig, rules, uptime, systemProxyAddress } = useAppData(); // 使用useMemo缓存格式化后的uptime,避免频繁计算 const formattedUptime = useMemo(() => formatUptime(uptime), [uptime]); @@ -42,7 +42,7 @@ export const ClashInfoCard = () => { {t("System Proxy Address")} - {sysproxy?.server || "-"} + {systemProxyAddress} @@ -74,7 +74,14 @@ export const ClashInfoCard = () => { ); - }, [clashConfig, clashVersion, t, formattedUptime, rules.length, sysproxy]); + }, [ + clashConfig, + clashVersion, + t, + formattedUptime, + rules.length, + systemProxyAddress, + ]); return ( ((props, ref) => { } }; + const { systemProxyAddress } = useAppData(); + + // 为当前状态计算系统代理地址 + const getSystemProxyAddress = useMemo(() => { + if (!clashConfig) return "-"; + + const isPacMode = value.pac ?? false; + + if (isPacMode) { + const host = value.proxy_host || "127.0.0.1"; + const port = verge?.verge_mixed_port || clashConfig["mixed-port"] || 7897; + return `${host}:${port}`; + } else { + return systemProxyAddress; + } + }, [ + value.pac, + value.proxy_host, + verge?.verge_mixed_port, + clashConfig, + systemProxyAddress, + ]); + const getCurrentPacUrl = useMemo(() => { + const host = value.proxy_host || "127.0.0.1"; + // 根据环境判断PAC端口 + const port = import.meta.env.DEV ? 11233 : 33331; + return `http://${host}:${port}/commands/pac`; + }, [value.proxy_host]); + useImperativeHandle(ref, () => ({ open: () => { setOpen(true); @@ -417,7 +447,7 @@ export const SysproxyViewer = forwardRef((props, ref) => { {t("Server Addr")} - {sysproxy?.server ? sysproxy.server : t("Not available")} + {getSystemProxyAddress} @@ -425,7 +455,9 @@ export const SysproxyViewer = forwardRef((props, ref) => { {value.pac && ( {t("PAC URL")} - {autoproxy?.url || "-"} + + {getCurrentPacUrl || "-"} + )} diff --git a/src/providers/app-data-provider.tsx b/src/providers/app-data-provider.tsx index 166b8057..0fee8a81 100644 --- a/src/providers/app-data-provider.tsx +++ b/src/providers/app-data-provider.tsx @@ -1,5 +1,12 @@ -import { createContext, useContext, useMemo, useEffect } from "react"; -import useSWR from "swr"; +import React, { + createContext, + useContext, + useEffect, + useMemo, + useState, +} from "react"; +import { useVerge } from "@/hooks/use-verge"; +import useSWR, { mutate } from "swr"; import useSWRSubscription from "swr/subscription"; import { getProxies, @@ -37,6 +44,8 @@ interface AppDataContextType { }; traffic: { up: number; down: number }; memory: { inuse: number }; + systemProxyAddress: string; + refreshProxy: () => Promise; refreshClashConfig: () => Promise; refreshRules: () => Promise; @@ -55,8 +64,9 @@ export const AppDataProvider = ({ }: { children: React.ReactNode; }) => { - const { clashInfo } = useClashInfo(); const pageVisible = useVisibility(); + const { clashInfo } = useClashInfo(); + const { verge } = useVerge(); // 基础数据 - 中频率更新 (5秒) const { data: proxiesData, mutate: refreshProxy } = useSWR( @@ -508,8 +518,39 @@ export const AppDataProvider = ({ }; // 聚合所有数据 - const value = useMemo( - () => ({ + const value = useMemo(() => { + // 计算系统代理地址 + const calculateSystemProxyAddress = () => { + if (!verge || !clashConfig) return "-"; + + const isPacMode = verge.proxy_auto_config ?? false; + + if (isPacMode) { + // PAC模式:显示我们期望设置的代理地址 + const proxyHost = verge.proxy_host || "127.0.0.1"; + const proxyPort = + verge.verge_mixed_port || clashConfig["mixed-port"] || 7897; + return `${proxyHost}:${proxyPort}`; + } else { + // HTTP代理模式:优先使用系统地址,但如果格式不正确则使用期望地址 + const systemServer = sysproxy?.server; + if ( + systemServer && + systemServer !== "-" && + !systemServer.startsWith(":") + ) { + return systemServer; + } else { + // 系统地址无效,返回期望的代理地址 + const proxyHost = verge.proxy_host || "127.0.0.1"; + const proxyPort = + verge.verge_mixed_port || clashConfig["mixed-port"] || 7897; + return `${proxyHost}:${proxyPort}`; + } + } + }; + + return { // 数据 proxies: proxiesData, clashConfig, @@ -534,6 +575,8 @@ export const AppDataProvider = ({ traffic: trafficData, memory: memoryData, + systemProxyAddress: calculateSystemProxyAddress(), + // 刷新方法 refreshProxy, refreshClashConfig, @@ -542,27 +585,27 @@ export const AppDataProvider = ({ refreshProxyProviders, refreshRuleProviders, refreshAll, - }), - [ - proxiesData, - clashConfig, - rulesData, - sysproxy, - runningMode, - uptimeData, - connectionsData, - trafficData, - memoryData, - proxyProviders, - ruleProviders, - refreshProxy, - refreshClashConfig, - refreshRules, - refreshSysproxy, - refreshProxyProviders, - refreshRuleProviders, - ], - ); + }; + }, [ + proxiesData, + clashConfig, + rulesData, + sysproxy, + runningMode, + uptimeData, + connectionsData, + trafficData, + memoryData, + proxyProviders, + ruleProviders, + verge, + refreshProxy, + refreshClashConfig, + refreshRules, + refreshSysproxy, + refreshProxyProviders, + refreshRuleProviders, + ]); return ( {children}