import { useRef } from "react"; import { useTranslation } from "react-i18next"; import useSWR, { mutate } from "swr"; import { SettingsRounded, PlayCircleOutlineRounded, PauseCircleOutlineRounded, BuildRounded, } from "@mui/icons-material"; import { Box, Button, Tooltip, Typography, alpha, useTheme, } from "@mui/material"; import { DialogRef, Switch } from "@/components/base"; import { GuardState } from "@/components/setting/mods/guard-state"; import { SysproxyViewer } from "@/components/setting/mods/sysproxy-viewer"; import { TunViewer } from "@/components/setting/mods/tun-viewer"; import { useVerge } from "@/hooks/use-verge"; import { getSystemProxy, getAutotemProxy, getRunningMode, } from "@/services/cmds"; import { closeAllConnections } from "@/services/api"; import { showNotice } from "@/services/noticeService"; import { useServiceInstaller } from "@/hooks/useServiceInstaller"; interface ProxySwitchProps { label?: string; onError?: (err: Error) => void; } /** * 可复用的代理控制开关组件 * 包含 Tun Mode 和 System Proxy 的开关功能 */ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { const { t } = useTranslation(); const { verge, mutateVerge, patchVerge } = useVerge(); const theme = useTheme(); const { installServiceAndRestartCore } = useServiceInstaller(); const { data: sysproxy } = useSWR("getSystemProxy", getSystemProxy); const { data: autoproxy } = useSWR("getAutotemProxy", getAutotemProxy); const { data: runningMode, mutate: mutateRunningMode } = useSWR( "getRunningMode", getRunningMode, ); // 是否以sidecar模式运行 const isSidecarMode = runningMode === "Sidecar"; const sysproxyRef = useRef(null); const tunRef = useRef(null); const { enable_tun_mode, enable_system_proxy, proxy_auto_config } = verge ?? {}; // 确定当前显示哪个开关 const isSystemProxyMode = label === t("System Proxy") || !label; const isTunMode = label === t("Tun Mode"); 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 onInstallService = installServiceAndRestartCore; return ( {label && ( {label} )} {/* 仅显示当前选中的开关 */} {isSystemProxyMode && ( {enable_system_proxy ? ( ) : ( )} {t("System Proxy")} {/* {sysproxy?.enable ? t("Proxy is active") : t("Enable this for most users") } */} sysproxyRef.current?.open()} > onChangeData({ enable_system_proxy: e })} onGuard={async (e) => { if (!e && verge?.auto_close_connection) { closeAllConnections(); } await patchVerge({ enable_system_proxy: e }); await updateProxyStatus(); }} > )} {isTunMode && ( {enable_tun_mode ? ( ) : ( )} {t("Tun Mode")} {isSidecarMode && ( )} tunRef.current?.open()} > { if (isSidecarMode) { showNotice( "error", t("TUN requires Service Mode or Admin Mode"), ); return Promise.reject( new Error(t("TUN requires Service Mode or Admin Mode")), ); } onChangeData({ enable_tun_mode: e }); }} onGuard={(e) => { if (isSidecarMode) { 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 }); }} > )} {/* 引用对话框组件 */} ); }; export default ProxyControlSwitches;