import useSWR, { useSWRConfig } from "swr"; import { useSetRecoilState } from "recoil"; import { useTranslation } from "react-i18next"; import { ListItemText, TextField, Switch, Select, MenuItem, Typography, } from "@mui/material"; import { ApiType } from "../../services/types"; import { atomClashPort } from "../../services/states"; import { patchClashConfig } from "../../services/cmds"; import { SettingList, SettingItem } from "./setting"; import { getClashConfig, getVersion, updateConfigs } from "../../services/api"; import Notice from "../base/base-notice"; import GuardState from "./guard-state"; interface Props { onError: (err: Error) => void; } const SettingClash = ({ onError }: Props) => { const { t } = useTranslation(); const { mutate } = useSWRConfig(); const { data: clashConfig } = useSWR("getClashConfig", getClashConfig); const { data: versionData } = useSWR("getVersion", getVersion); const { ipv6, "allow-lan": allowLan, "log-level": logLevel, "mixed-port": mixedPort, } = clashConfig ?? {}; const setGlobalClashPort = useSetRecoilState(atomClashPort); const onSwitchFormat = (_e: any, value: boolean) => value; const onChangeData = (patch: Partial) => { mutate("getClashConfig", { ...clashConfig, ...patch }, false); }; const onUpdateData = async (patch: Partial) => { await updateConfigs(patch); await patchClashConfig(patch); }; const onUpdatePort = async (port: number) => { if (port < 1000) { throw new Error("The port should not < 1000"); } if (port > 65536) { throw new Error("The port should not > 65536"); } await patchClashConfig({ "mixed-port": port }); setGlobalClashPort(port); Notice.success("Change Clash port successfully!"); // update the config mutate("getClashConfig"); }; // 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 })} > +e.target.value?.replace(/\D+/, "")} onChange={(e) => onChangeData({ "mixed-port": e })} onGuard={onUpdatePort} waitTime={1000} > {clashVer} ); }; export default SettingClash;