import { useRef } from "react"; import { useTranslation } from "react-i18next"; import { useLockFn } from "ahooks"; import { TextField, Select, MenuItem, Typography, IconButton, Tooltip, } from "@mui/material"; import { ArrowForward, Settings, Shuffle } from "@mui/icons-material"; import { DialogRef, Notice, Switch } from "@/components/base"; import { useClash } from "@/hooks/use-clash"; import { GuardState } from "./mods/guard-state"; import { WebUIViewer } from "./mods/web-ui-viewer"; import { ClashPortViewer } from "./mods/clash-port-viewer"; import { ControllerViewer } from "./mods/controller-viewer"; import { SettingList, SettingItem } from "./mods/setting-comp"; import { ClashCoreViewer } from "./mods/clash-core-viewer"; import { invoke_uwp_tool } from "@/services/cmds"; import getSystem from "@/utils/get-system"; import { useVerge } from "@/hooks/use-verge"; import { updateGeoData } from "@/services/api"; const isWIN = getSystem() === "windows"; interface Props { onError: (err: Error) => void; } const SettingClash = ({ onError }: Props) => { const { t } = useTranslation(); const { clash, version, mutateClash, patchClash } = useClash(); const { verge, mutateVerge, patchVerge } = useVerge(); const { ipv6, "allow-lan": allowLan, "log-level": logLevel } = clash ?? {}; const { enable_random_port = false, verge_mixed_port } = verge ?? {}; const webRef = useRef(null); const portRef = useRef(null); const ctrlRef = useRef(null); const coreRef = useRef(null); const onSwitchFormat = (_e: any, value: boolean) => value; const onChangeData = (patch: Partial) => { mutateClash((old) => ({ ...(old! || {}), ...patch }), false); }; const onChangeVerge = (patch: Partial) => { mutateVerge({ ...verge, ...patch }, false); }; const onUpdateGeo = useLockFn(async () => { try { await updateGeoData(); Notice.success("Start update geodata"); } catch (err: any) { Notice.error(err?.response.data.message || err.toString()); } }); return ( onChangeData({ "allow-lan": e })} onGuard={(e) => patchClash({ "allow-lan": e })} > onChangeData({ ipv6: e })} onGuard={(e) => patchClash({ ipv6: e })} > e.target.value} onChange={(e) => onChangeData({ "log-level": e })} onGuard={(e) => patchClash({ "log-level": e })} > { Notice.success(t("After restart to take effect"), 1000); onChangeVerge({ enable_random_port: !enable_random_port }); patchVerge({ enable_random_port: !enable_random_port }); }} > } > { portRef.current?.open(); (e.target as any).blur(); }} /> ctrlRef.current?.open()} > webRef.current?.open()} > coreRef.current?.open()} > } > {version} {isWIN && ( )} ); }; export default SettingClash;