clash-verge-rev/src/hooks/use-system-proxy-state.ts
Sline fd98caccd2
revert: use-app-data (#6088)
* Revert "refactor(app-data): split monolithic context into focused SWR hooks (#5576)"

This reverts commit 8e8182f70793f44e76ca3bb71eb98d6d60701e13.

# Conflicts:
#	src/components/home/clash-info-card.tsx
#	src/components/home/clash-mode-card.tsx
#	src/components/home/current-proxy-card.tsx
#	src/components/home/home-profile-card.tsx
#	src/components/proxy/provider-button.tsx
#	src/components/proxy/proxy-chain.tsx
#	src/components/proxy/proxy-groups.tsx
#	src/components/proxy/use-render-list.ts
#	src/components/rule/provider-button.tsx
#	src/components/setting/mods/sysproxy-viewer.tsx
#	src/hooks/use-clash-data.ts
#	src/hooks/use-current-proxy.ts
#	src/hooks/use-shared-swr-poller.ts
#	src/hooks/use-system-proxy-state.ts
#	src/pages/rules.tsx

* docs: Changelog.md
2026-01-16 18:32:31 +08:00

80 lines
2.4 KiB
TypeScript

import { useLockFn } from "ahooks";
import useSWR, { mutate } from "swr";
import { closeAllConnections } from "tauri-plugin-mihomo-api";
import { useVerge } from "@/hooks/use-verge";
import { useAppData } from "@/providers/app-data-context";
import { getAutotemProxy } from "@/services/cmds";
// 系统代理状态检测统一逻辑
export const useSystemProxyState = () => {
const { verge, mutateVerge, patchVerge } = useVerge();
const { sysproxy } = useAppData();
const { data: autoproxy } = useSWR("getAutotemProxy", getAutotemProxy, {
revalidateOnFocus: true,
revalidateOnReconnect: true,
});
const { enable_system_proxy, proxy_auto_config } = verge ?? {};
const getSystemProxyActualState = () => {
const userEnabled = enable_system_proxy ?? false;
// 用户配置状态应该与系统实际状态一致
// 如果用户启用了系统代理,检查实际的系统状态
if (userEnabled) {
if (proxy_auto_config) {
return autoproxy?.enable ?? false;
} else {
return sysproxy?.enable ?? false;
}
}
// 用户没有启用时,返回 false
return false;
};
const getSystemProxyIndicator = () => {
if (proxy_auto_config) {
return autoproxy?.enable ?? false;
} else {
return sysproxy?.enable ?? false;
}
};
const updateProxyStatus = async (isEnabling: boolean) => {
// 关闭时更快响应,开启时等待系统确认
const delay = isEnabling ? 20 : 10;
await new Promise((resolve) => setTimeout(resolve, delay));
await mutate("getSystemProxy");
await mutate("getAutotemProxy");
};
const toggleSystemProxy = useLockFn(async (enabled: boolean) => {
mutateVerge({ ...verge, enable_system_proxy: enabled }, false);
try {
if (!enabled && verge?.auto_close_connection) {
await closeAllConnections();
}
await patchVerge({ enable_system_proxy: enabled });
await updateProxyStatus(enabled);
} catch (error) {
console.warn("[useSystemProxyState] toggleSystemProxy failed:", error);
mutateVerge({ ...verge, enable_system_proxy: !enabled }, false);
await updateProxyStatus(!enabled);
throw error;
}
});
return {
actualState: getSystemProxyActualState(),
indicator: getSystemProxyIndicator(),
configState: enable_system_proxy ?? false,
sysproxy,
autoproxy,
proxy_auto_config,
toggleSystemProxy,
};
};