import { useRef } from "react"; import { useTranslation } from "react-i18next"; import { IconButton, MenuItem, Select, Switch, Typography, } from "@mui/material"; import { openAppDir, openCoreDir, openLogsDir } from "@/services/cmds"; import { ArrowForward } from "@mui/icons-material"; import { useVerge } from "@/hooks/use-verge"; import { version } from "@root/package.json"; import { DialogRef } from "@/components/base"; import { SettingList, SettingItem } from "./mods/setting-comp"; import { ThemeModeSwitch } from "./mods/theme-mode-switch"; import { ConfigViewer } from "./mods/config-viewer"; import { HotkeyViewer } from "./mods/hotkey-viewer"; import { MiscViewer } from "./mods/misc-viewer"; import { ThemeViewer } from "./mods/theme-viewer"; import { GuardState } from "./mods/guard-state"; interface Props { onError?: (err: Error) => void; } const SettingVerge = ({ onError }: Props) => { const { t } = useTranslation(); const { verge, patchVerge, mutateVerge } = useVerge(); const { theme_mode, theme_blur, traffic_graph, language } = verge ?? {}; const configRef = useRef<DialogRef>(null); const hotkeyRef = useRef<DialogRef>(null); const miscRef = useRef<DialogRef>(null); const themeRef = useRef<DialogRef>(null); const onSwitchFormat = (_e: any, value: boolean) => value; const onChangeData = (patch: Partial<IVergeConfig>) => { mutateVerge({ ...verge, ...patch }, false); }; return ( <SettingList title={t("Verge Setting")}> <ThemeViewer ref={themeRef} /> <ConfigViewer ref={configRef} /> <HotkeyViewer ref={hotkeyRef} /> <MiscViewer ref={miscRef} /> <SettingItem label={t("Language")}> <GuardState value={language ?? "en"} onCatch={onError} onFormat={(e: any) => e.target.value} onChange={(e) => onChangeData({ language: e })} onGuard={(e) => patchVerge({ language: e })} > <Select size="small" sx={{ width: 100, "> div": { py: "7.5px" } }}> <MenuItem value="zh">中文</MenuItem> <MenuItem value="en">English</MenuItem> <MenuItem value="ru">Русский</MenuItem> </Select> </GuardState> </SettingItem> <SettingItem label={t("Theme Mode")}> <GuardState value={theme_mode} onCatch={onError} onChange={(e) => onChangeData({ theme_mode: e })} onGuard={(e) => patchVerge({ theme_mode: e })} > <ThemeModeSwitch /> </GuardState> </SettingItem> <SettingItem label={t("Theme Blur")}> <GuardState value={theme_blur ?? false} valueProps="checked" onCatch={onError} onFormat={onSwitchFormat} onChange={(e) => onChangeData({ theme_blur: e })} onGuard={(e) => patchVerge({ theme_blur: e })} > <Switch edge="end" /> </GuardState> </SettingItem> <SettingItem label={t("Traffic Graph")}> <GuardState value={traffic_graph ?? true} valueProps="checked" onCatch={onError} onFormat={onSwitchFormat} onChange={(e) => onChangeData({ traffic_graph: e })} onGuard={(e) => patchVerge({ traffic_graph: e })} > <Switch edge="end" /> </GuardState> </SettingItem> <SettingItem label={t("Miscellaneous")}> <IconButton color="inherit" size="small" sx={{ my: "2px" }} onClick={() => miscRef.current?.open()} > <ArrowForward /> </IconButton> </SettingItem> <SettingItem label={t("Theme Setting")}> <IconButton color="inherit" size="small" sx={{ my: "2px" }} onClick={() => themeRef.current?.open()} > <ArrowForward /> </IconButton> </SettingItem> <SettingItem label={t("Hotkey Setting")}> <IconButton color="inherit" size="small" sx={{ my: "2px" }} onClick={() => hotkeyRef.current?.open()} > <ArrowForward /> </IconButton> </SettingItem> <SettingItem label={t("Runtime Config")}> <IconButton color="inherit" size="small" sx={{ my: "2px" }} onClick={() => configRef.current?.open()} > <ArrowForward /> </IconButton> </SettingItem> <SettingItem label={t("Open App Dir")}> <IconButton color="inherit" size="small" sx={{ my: "2px" }} onClick={openAppDir} > <ArrowForward /> </IconButton> </SettingItem> <SettingItem label={t("Open Core Dir")}> <IconButton color="inherit" size="small" sx={{ my: "2px" }} onClick={openCoreDir} > <ArrowForward /> </IconButton> </SettingItem> <SettingItem label={t("Open Logs Dir")}> <IconButton color="inherit" size="small" sx={{ my: "2px" }} onClick={openLogsDir} > <ArrowForward /> </IconButton> </SettingItem> <SettingItem label={t("Verge Version")}> <Typography sx={{ py: "7px", pr: 1 }}>v{version}</Typography> </SettingItem> </SettingList> ); }; export default SettingVerge;