import { forwardRef, useEffect, useImperativeHandle, useState } from "react"; import { useTranslation } from "react-i18next"; import { List, Button, Select, MenuItem, styled, ListItem, ListItemText, Box, } from "@mui/material"; import { useVerge } from "@/hooks/use-verge"; import { BaseDialog, DialogRef, Notice, Switch } from "@/components/base"; import { GuardState } from "./guard-state"; import { open as openDialog } from "@tauri-apps/plugin-dialog"; import { convertFileSrc } from "@tauri-apps/api/core"; import { copyIconFile, getAppDir } from "@/services/cmds"; import { join } from "@tauri-apps/api/path"; import { exists } from "@tauri-apps/plugin-fs"; import getSystem from "@/utils/get-system"; const OS = getSystem(); const getIcons = async (icon_dir: string, name: string) => { const updateTime = localStorage.getItem(`icon_${name}_update_time`) || ""; const icon_png = await join(icon_dir, `${name}-${updateTime}.png`); const icon_ico = await join(icon_dir, `${name}-${updateTime}.ico`); return { icon_png, icon_ico, }; }; export const LayoutViewer = forwardRef((props, ref) => { const { t } = useTranslation(); const { verge, patchVerge, mutateVerge } = useVerge(); const [open, setOpen] = useState(false); const [commonIcon, setCommonIcon] = useState(""); const [sysproxyIcon, setSysproxyIcon] = useState(""); const [tunIcon, setTunIcon] = useState(""); useEffect(() => { initIconPath(); }, []); async function initIconPath() { const appDir = await getAppDir(); const icon_dir = await join(appDir, "icons"); const { icon_png: common_icon_png, icon_ico: common_icon_ico } = await getIcons(icon_dir, "common"); const { icon_png: sysproxy_icon_png, icon_ico: sysproxy_icon_ico } = await getIcons(icon_dir, "sysproxy"); const { icon_png: tun_icon_png, icon_ico: tun_icon_ico } = await getIcons( icon_dir, "tun", ); if (await exists(common_icon_ico)) { setCommonIcon(common_icon_ico); } else { setCommonIcon(common_icon_png); } if (await exists(sysproxy_icon_ico)) { setSysproxyIcon(sysproxy_icon_ico); } else { setSysproxyIcon(sysproxy_icon_png); } if (await exists(tun_icon_ico)) { setTunIcon(tun_icon_ico); } else { setTunIcon(tun_icon_png); } } useImperativeHandle(ref, () => ({ open: () => setOpen(true), close: () => setOpen(false), })); const onSwitchFormat = (_e: any, value: boolean) => value; const onError = (err: any) => { Notice.error(err.message || err.toString()); }; const onChangeData = (patch: Partial) => { mutateVerge({ ...verge, ...patch }, false); }; return ( setOpen(false)} onCancel={() => setOpen(false)} > onChangeData({ traffic_graph: e })} onGuard={(e) => patchVerge({ traffic_graph: e })} > onChangeData({ enable_memory_usage: e })} onGuard={(e) => patchVerge({ enable_memory_usage: e })} > onChangeData({ enable_group_icon: e })} onGuard={(e) => patchVerge({ enable_group_icon: e })} > e.target.value} onChange={(e) => onChangeData({ menu_icon: e })} onGuard={(e) => patchVerge({ menu_icon: e })} > {OS === "macos" && ( e.target.value} onChange={(e) => onChangeData({ tray_icon: e })} onGuard={(e) => patchVerge({ tray_icon: e })} > )} {OS === "macos" && ( onChangeData({ enable_tray_speed: e })} onGuard={(e) => patchVerge({ enable_tray_speed: e })} > )} {OS === "macos" && ( onChangeData({ enable_tray_icon: e })} onGuard={(e) => patchVerge({ enable_tray_icon: e })} > )} onChangeData({ common_tray_icon: e })} onGuard={(e) => patchVerge({ common_tray_icon: e })} > onChangeData({ sysproxy_tray_icon: e })} onGuard={(e) => patchVerge({ sysproxy_tray_icon: e })} > onChangeData({ tun_tray_icon: e })} onGuard={(e) => patchVerge({ tun_tray_icon: e })} > ); }); const Item = styled(ListItem)(() => ({ padding: "5px 2px", }));