mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-13 05:20:28 +08:00
* 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
99 lines
2.6 KiB
TypeScript
99 lines
2.6 KiB
TypeScript
import { useEffect } from "react";
|
|
import useSWR from "swr";
|
|
|
|
import { getRunningMode, isAdmin, isServiceAvailable } from "@/services/cmds";
|
|
import { showNotice } from "@/services/notice-service";
|
|
|
|
import { useVerge } from "./use-verge";
|
|
|
|
export interface SystemState {
|
|
runningMode: "Sidecar" | "Service";
|
|
isAdminMode: boolean;
|
|
isServiceOk: boolean;
|
|
}
|
|
|
|
const defaultSystemState = {
|
|
runningMode: "Sidecar",
|
|
isAdminMode: false,
|
|
isServiceOk: false,
|
|
} as SystemState;
|
|
|
|
let disablingTunMode = false;
|
|
|
|
/**
|
|
* 自定义 hook 用于获取系统运行状态
|
|
* 包括运行模式、管理员状态、系统服务是否可用
|
|
*/
|
|
export function useSystemState() {
|
|
const { verge, patchVerge } = useVerge();
|
|
|
|
const {
|
|
data: systemState,
|
|
mutate: mutateSystemState,
|
|
isLoading,
|
|
} = useSWR(
|
|
"getSystemState",
|
|
async () => {
|
|
const [runningMode, isAdminMode, isServiceOk] = await Promise.all([
|
|
getRunningMode(),
|
|
isAdmin(),
|
|
isServiceAvailable(),
|
|
]);
|
|
return { runningMode, isAdminMode, isServiceOk } as SystemState;
|
|
},
|
|
{
|
|
suspense: true,
|
|
refreshInterval: 30000,
|
|
fallback: defaultSystemState,
|
|
},
|
|
);
|
|
|
|
const isSidecarMode = systemState.runningMode === "Sidecar";
|
|
const isServiceMode = systemState.runningMode === "Service";
|
|
const isTunModeAvailable = systemState.isAdminMode || systemState.isServiceOk;
|
|
|
|
const enable_tun_mode = verge?.enable_tun_mode;
|
|
useEffect(() => {
|
|
if (enable_tun_mode === undefined) return;
|
|
|
|
if (
|
|
!disablingTunMode &&
|
|
enable_tun_mode &&
|
|
!isTunModeAvailable &&
|
|
!isLoading
|
|
) {
|
|
disablingTunMode = true;
|
|
patchVerge({ enable_tun_mode: false })
|
|
.then(() => {
|
|
showNotice.info(
|
|
"settings.sections.system.notifications.tunMode.autoDisabled",
|
|
);
|
|
})
|
|
.catch((err) => {
|
|
console.error("[useVerge] 自动关闭TUN模式失败:", err);
|
|
showNotice.error(
|
|
"settings.sections.system.notifications.tunMode.autoDisableFailed",
|
|
);
|
|
})
|
|
.finally(() => {
|
|
const tid = setTimeout(() => {
|
|
// 避免 verge 数据更新不及时导致重复执行关闭 Tun 模式
|
|
disablingTunMode = false;
|
|
clearTimeout(tid);
|
|
}, 1000);
|
|
});
|
|
}
|
|
}, [enable_tun_mode, isTunModeAvailable, patchVerge, isLoading]);
|
|
|
|
return {
|
|
runningMode: systemState.runningMode,
|
|
isAdminMode: systemState.isAdminMode,
|
|
isServiceOk: systemState.isServiceOk,
|
|
isSidecarMode,
|
|
isServiceMode,
|
|
isTunModeAvailable,
|
|
mutateSystemState,
|
|
isLoading,
|
|
};
|
|
}
|