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}