import useSWR, { mutate } from "swr"; import { useRef, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { SettingsRounded, PlayArrowRounded, PauseRounded, WarningRounded, BuildRounded, DeleteForeverRounded, } from "@mui/icons-material"; import { useVerge } from "@/hooks/use-verge"; import { DialogRef, Switch } from "@/components/base"; import { SettingList, SettingItem } from "./mods/setting-comp"; import { GuardState } from "./mods/guard-state"; import { SysproxyViewer } from "./mods/sysproxy-viewer"; import { TunViewer } from "./mods/tun-viewer"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; import { getSystemProxy, getAutotemProxy, installService, uninstallService, restartCore, stopCore, } from "@/services/cmds"; import { useLockFn } from "ahooks"; import { Button, Tooltip } from "@mui/material"; import { useSystemState } from "@/hooks/use-system-state"; import { closeAllConnections } from "@/services/api"; import { showNotice } from "@/services/noticeService"; import { useServiceInstaller } from "@/hooks/useServiceInstaller"; interface Props { onError?: (err: Error) => void; } const SettingSystem = ({ onError }: Props) => { const { t } = useTranslation(); const { verge, mutateVerge, patchVerge } = useVerge(); const { installServiceAndRestartCore } = useServiceInstaller(); const { data: sysproxy } = useSWR("getSystemProxy", getSystemProxy); const { data: autoproxy } = useSWR("getAutotemProxy", getAutotemProxy); const { isAdminMode, isServiceMode, mutateRunningMode } = useSystemState(); // +++ isTunAvailable 现在使用 SWR 的 isServiceMode const isTunAvailable = isServiceMode || isAdminMode; const sysproxyRef = useRef(null); const tunRef = useRef(null); const { enable_tun_mode, enable_auto_launch, enable_silent_start, enable_system_proxy, proxy_auto_config, } = verge ?? {}; const onSwitchFormat = (_e: any, value: boolean) => value; const onChangeData = (patch: Partial) => { mutateVerge({ ...verge, ...patch }, false); }; const updateProxyStatus = async () => { await new Promise((resolve) => setTimeout(resolve, 100)); await mutate("getSystemProxy"); await mutate("getAutotemProxy"); }; // 抽象服务操作逻辑 const handleServiceOperation = useLockFn( async ({ beforeMsg, action, actionMsg, successMsg, }: { beforeMsg: string; action: () => Promise; actionMsg: string; successMsg: string; }) => { try { showNotice("info", beforeMsg); await stopCore(); showNotice("info", actionMsg); await action(); showNotice("success", successMsg); showNotice("info", t("Restarting Core...")); await restartCore(); await mutateRunningMode(); } catch (err: any) { showNotice("error", err.message || err.toString()); try { showNotice("info", t("Try running core as Sidecar...")); await restartCore(); await mutateRunningMode(); } catch (e: any) { showNotice("error", e?.message || e?.toString()); } } }, ); // 卸载系统服务 const onUninstallService = () => handleServiceOperation({ beforeMsg: t("Stopping Core..."), action: uninstallService, actionMsg: t("Uninstalling Service..."), successMsg: t("Service Uninstalled Successfully"), }); return ( tunRef.current?.open()} /> {!isTunAvailable && ( )} {!isServiceMode && !isAdminMode && ( )} {isServiceMode && ( )} } > { if (!isTunAvailable) return; onChangeData({ enable_tun_mode: e }); }} onGuard={(e) => { if (!isTunAvailable) { showNotice("error", t("TUN requires Service Mode or Admin Mode")); return Promise.reject( new Error(t("TUN requires Service Mode or Admin Mode")), ); } return patchVerge({ enable_tun_mode: e }); }} > sysproxyRef.current?.open()} /> {proxy_auto_config ? ( autoproxy?.enable ? ( ) : ( ) ) : sysproxy?.enable ? ( ) : ( )} } > onChangeData({ enable_system_proxy: e })} onGuard={async (e) => { if (!e && verge?.auto_close_connection) { closeAllConnections(); } await patchVerge({ enable_system_proxy: e }); await updateProxyStatus(); }} > ) } > { // 移除管理员模式检查提示 onChangeData({ enable_auto_launch: e }); }} onGuard={async (e) => { if (isAdminMode) { showNotice( "info", t("Administrator mode may not support auto launch"), ); } try { // 先触发UI更新立即看到反馈 onChangeData({ enable_auto_launch: e }); await patchVerge({ enable_auto_launch: e }); await mutate("getAutoLaunchStatus"); return Promise.resolve(); } catch (error) { // 如果出错,恢复原始状态 onChangeData({ enable_auto_launch: !e }); return Promise.reject(error); } }} > } > onChangeData({ enable_silent_start: e })} onGuard={(e) => patchVerge({ enable_silent_start: e })} > ); }; export default SettingSystem;