import useSWR from "swr"; import { useRef } from "react"; import { useTranslation } from "react-i18next"; import { TextField, Switch, Select, MenuItem, Typography, IconButton, } from "@mui/material"; import { ArrowForward } from "@mui/icons-material"; import { patchClashConfig } from "@/services/cmds"; import { getClashConfig, getVersion, updateConfigs } from "@/services/api"; import { DialogRef } from "@/components/base"; import { GuardState } from "./mods/guard-state"; import { CoreSwitch } from "./mods/core-switch"; import { WebUIViewer } from "./mods/web-ui-viewer"; import { ClashFieldViewer } from "./mods/clash-field-viewer"; import { ClashPortViewer } from "./mods/clash-port-viewer"; import { ControllerViewer } from "./mods/controller-viewer"; import { SettingList, SettingItem } from "./mods/setting-comp"; interface Props { onError: (err: Error) => void; } const SettingClash = ({ onError }: Props) => { const { t } = useTranslation(); const { data: clashConfig, mutate: mutateClash } = useSWR( "getClashConfig", getClashConfig ); const { data: versionData } = useSWR("getVersion", getVersion); const { ipv6, "allow-lan": allowLan, "log-level": logLevel, "mixed-port": mixedPort, } = clashConfig ?? {}; const webRef = useRef(null); const fieldRef = useRef(null); const portRef = useRef(null); const ctrlRef = useRef(null); const onSwitchFormat = (_e: any, value: boolean) => value; const onChangeData = (patch: Partial) => { mutateClash((old) => ({ ...(old! || {}), ...patch }), false); }; const onUpdateData = async (patch: Partial) => { await updateConfigs(patch); await patchClashConfig(patch); }; // get clash core version const clashVer = versionData?.premium ? `${versionData.version} Premium` : versionData?.version || "-"; return ( onChangeData({ "allow-lan": e })} onGuard={(e) => onUpdateData({ "allow-lan": e })} > onChangeData({ ipv6: e })} onGuard={(e) => onUpdateData({ ipv6: e })} > e.target.value} onChange={(e) => onChangeData({ "log-level": e })} onGuard={(e) => onUpdateData({ "log-level": e })} > { portRef.current?.open(); (e.target as any).blur(); }} /> ctrlRef.current?.open()} > webRef.current?.open()} > fieldRef.current?.open()} > }> {clashVer} ); }; export default SettingClash;