import { useRef } from "react"; import { useTranslation } from "react-i18next"; import { TextField, Select, MenuItem, Typography } from "@mui/material"; import { 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"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; 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 = async () => { try { await updateGeoData(); Notice.success(t("GeoData Updated")); } 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("Restart Application to Apply Modifications"), 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()} label={t("External")} /> webRef.current?.open()} label={t("Web UI")} /> coreRef.current?.open()} /> } > {version} {isWIN && ( } /> )} ); }; export default SettingClash;