Files
clash-proxy/src/components/setting/setting-system.tsx

164 lines
4.8 KiB
TypeScript
Raw Normal View History

2022-09-07 01:51:43 +08:00
import useSWR from "swr";
2022-04-25 16:12:04 +08:00
import { useState } from "react";
2022-03-12 23:07:45 +08:00
import { useTranslation } from "react-i18next";
2022-09-07 01:51:43 +08:00
import { IconButton, Switch } from "@mui/material";
import { ArrowForward, PrivacyTipRounded, Settings } from "@mui/icons-material";
2022-11-20 20:12:58 +08:00
import { checkService } from "@/services/cmds";
import { useVerge } from "@/hooks/use-verge";
2022-01-17 02:42:52 +08:00
import { SettingList, SettingItem } from "./setting";
2022-09-07 01:51:43 +08:00
import useModalHandler from "@/hooks/use-modal-handler";
2022-08-06 02:35:11 +08:00
import getSystem from "@/utils/get-system";
import GuardState from "./mods/guard-state";
import ServiceMode from "./mods/service-mode";
2022-09-07 01:51:43 +08:00
import SysproxyViewer from "./mods/sysproxy-viewer";
2022-01-17 02:42:52 +08:00
interface Props {
onError?: (err: Error) => void;
}
2022-04-25 16:12:04 +08:00
const isWIN = getSystem() === "windows";
2022-01-17 02:42:52 +08:00
const SettingSystem = ({ onError }: Props) => {
2022-03-12 23:07:45 +08:00
const { t } = useTranslation();
2022-09-07 01:51:43 +08:00
2022-11-20 20:12:58 +08:00
const { verge, mutateVerge, patchVerge } = useVerge();
2022-01-17 02:42:52 +08:00
2022-04-25 16:12:04 +08:00
// service mode
const [serviceOpen, setServiceOpen] = useState(false);
const { data: serviceStatus } = useSWR(
isWIN ? "checkService" : null,
checkService,
2022-11-20 20:12:58 +08:00
{ revalidateIfStale: false, shouldRetryOnError: false }
2022-04-25 16:12:04 +08:00
);
2022-01-17 02:42:52 +08:00
const {
2022-03-12 23:07:45 +08:00
enable_tun_mode,
enable_auto_launch,
2022-04-25 16:12:04 +08:00
enable_service_mode,
2022-03-26 18:56:16 +08:00
enable_silent_start,
2022-03-12 23:07:45 +08:00
enable_system_proxy,
2022-11-20 20:12:58 +08:00
} = verge ?? {};
2022-01-17 02:42:52 +08:00
const onSwitchFormat = (_e: any, value: boolean) => value;
2022-11-19 17:22:29 +08:00
const onChangeData = (patch: Partial<IVergeConfig>) => {
2022-11-20 20:12:58 +08:00
mutateVerge({ ...verge, ...patch }, false);
2022-01-17 02:42:52 +08:00
};
2022-09-07 01:51:43 +08:00
const sysproxyHandler = useModalHandler();
2022-01-17 02:42:52 +08:00
return (
2022-03-12 23:07:45 +08:00
<SettingList title={t("System Setting")}>
2022-09-07 01:51:43 +08:00
<SysproxyViewer handler={sysproxyHandler} />
2022-08-15 01:30:37 +08:00
<SettingItem label={t("Tun Mode")}>
2022-02-25 02:09:39 +08:00
<GuardState
2022-03-12 23:07:45 +08:00
value={enable_tun_mode ?? false}
2022-02-25 02:09:39 +08:00
valueProps="checked"
onCatch={onError}
onFormat={onSwitchFormat}
onChange={(e) => onChangeData({ enable_tun_mode: e })}
2022-11-20 20:12:58 +08:00
onGuard={(e) => patchVerge({ enable_tun_mode: e })}
2022-02-25 02:09:39 +08:00
>
<Switch edge="end" />
</GuardState>
</SettingItem>
2022-04-25 16:12:04 +08:00
{isWIN && (
2022-08-06 03:48:03 +08:00
<SettingItem
label={t("Service Mode")}
extra={
(serviceStatus === "active" || serviceStatus === "installed") && (
<PrivacyTipRounded
fontSize="small"
style={{ cursor: "pointer", opacity: 0.75 }}
onClick={() => setServiceOpen(true)}
/>
)
}
>
2022-04-25 16:12:04 +08:00
{serviceStatus === "active" || serviceStatus === "installed" ? (
<GuardState
value={enable_service_mode ?? false}
valueProps="checked"
onCatch={onError}
onFormat={onSwitchFormat}
onChange={(e) => onChangeData({ enable_service_mode: e })}
2022-11-20 20:12:58 +08:00
onGuard={(e) => patchVerge({ enable_service_mode: e })}
2022-04-25 16:12:04 +08:00
>
<Switch edge="end" />
</GuardState>
) : (
<IconButton
color="inherit"
size="small"
2022-09-11 18:38:51 +08:00
sx={{ my: "2px" }}
2022-04-25 16:12:04 +08:00
onClick={() => setServiceOpen(true)}
>
<ArrowForward />
</IconButton>
)}
</SettingItem>
)}
2022-08-06 03:48:03 +08:00
{isWIN && (
<ServiceMode
open={serviceOpen}
enable={!!enable_service_mode}
onError={onError}
onClose={() => setServiceOpen(false)}
/>
)}
2022-09-07 01:51:43 +08:00
<SettingItem
label={t("System Proxy")}
extra={
<Settings
fontSize="small"
style={{ cursor: "pointer", opacity: 0.75 }}
onClick={() => sysproxyHandler.current.open()}
/>
}
>
2022-01-17 02:42:52 +08:00
<GuardState
2022-09-07 01:51:43 +08:00
value={enable_system_proxy ?? false}
2022-01-17 02:42:52 +08:00
valueProps="checked"
onCatch={onError}
onFormat={onSwitchFormat}
2022-09-07 01:51:43 +08:00
onChange={(e) => onChangeData({ enable_system_proxy: e })}
2022-11-20 20:12:58 +08:00
onGuard={(e) => patchVerge({ enable_system_proxy: e })}
2022-01-17 02:42:52 +08:00
>
<Switch edge="end" />
</GuardState>
</SettingItem>
2022-09-07 01:51:43 +08:00
<SettingItem label={t("Auto Launch")}>
2022-03-26 18:56:16 +08:00
<GuardState
2022-09-07 01:51:43 +08:00
value={enable_auto_launch ?? false}
2022-03-26 18:56:16 +08:00
valueProps="checked"
onCatch={onError}
onFormat={onSwitchFormat}
2022-09-07 01:51:43 +08:00
onChange={(e) => onChangeData({ enable_auto_launch: e })}
2022-11-20 20:12:58 +08:00
onGuard={(e) => patchVerge({ enable_auto_launch: e })}
2022-03-26 18:56:16 +08:00
>
<Switch edge="end" />
</GuardState>
</SettingItem>
2022-09-07 01:51:43 +08:00
<SettingItem label={t("Silent Start")}>
2022-01-17 02:42:52 +08:00
<GuardState
2022-09-07 01:51:43 +08:00
value={enable_silent_start ?? false}
2022-01-17 02:42:52 +08:00
valueProps="checked"
onCatch={onError}
onFormat={onSwitchFormat}
2022-09-07 01:51:43 +08:00
onChange={(e) => onChangeData({ enable_silent_start: e })}
2022-11-20 20:12:58 +08:00
onGuard={(e) => patchVerge({ enable_silent_start: e })}
2022-01-17 02:42:52 +08:00
>
<Switch edge="end" />
</GuardState>
</SettingItem>
</SettingList>
);
};
export default SettingSystem;