diff --git a/src/components/setting/mods/layout-viewer.tsx b/src/components/setting/mods/layout-viewer.tsx index 9f745888..a4d84efc 100644 --- a/src/components/setting/mods/layout-viewer.tsx +++ b/src/components/setting/mods/layout-viewer.tsx @@ -36,6 +36,7 @@ import { SelectValue, } from "@/components/ui/select"; import getSystem from "@/utils/get-system"; +import { Loader2 } from "lucide-react"; const OS = getSystem(); @@ -69,6 +70,9 @@ export const LayoutViewer = forwardRef((props, ref) => { const { t } = useTranslation(); const { verge, patchVerge, mutateVerge } = useVerge(); + const [localConfig, setLocalConfig] = useState>({}); + const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); const [commonIcon, setCommonIcon] = useState(""); const [sysproxyIcon, setSysproxyIcon] = useState(""); @@ -96,28 +100,26 @@ export const LayoutViewer = forwardRef((props, ref) => { }, []); useEffect(() => { - if (open) initIconPath(); - }, [open, initIconPath]); + if (open) { + setLocalConfig(verge ?? {}); + initIconPath(); + } + }, [open, verge, initIconPath]); useImperativeHandle(ref, () => ({ open: () => setOpen(true), close: () => setOpen(false), })); - const onSwitchFormat = (_e: any, value: boolean) => value; - const onError = (err: any) => { - showNotice("error", err.message || err.toString()); - }; - const onChangeData = (patch: Partial) => { - mutateVerge({ ...verge, ...patch }, false); + const handleConfigChange = (patch: Partial) => { + setLocalConfig(prev => ({ ...prev, ...patch })); }; const handleIconChange = useLockFn( async (type: "common" | "sysproxy" | "tun") => { const key = `${type}_tray_icon` as keyof IVergeConfig; - if (verge?.[key]) { - onChangeData({ [key]: false }); - await patchVerge({ [key]: false }); + if (localConfig[key]) { + handleConfigChange({ [key]: false }); } else { const selected = await openDialog({ directory: false, @@ -128,72 +130,94 @@ export const LayoutViewer = forwardRef((props, ref) => { const path = Array.isArray(selected) ? selected[0] : selected; await copyIconFile(path, type); await initIconPath(); - onChangeData({ [key]: true }); - await patchVerge({ [key]: true }); + handleConfigChange({ [key]: true }); } } - }, - ); + }); + + const handleSave = useLockFn(async () => { + setLoading(true); + try { + await patchVerge(localConfig); + showNotice("success", t("Settings saved successfully")); + setOpen(false); + } catch (err: any) { + showNotice("error", err.message || err.toString()); + } finally { + setLoading(false); + } + }); return ( - - - - {t("Layout Setting")} - + + + + {t("Layout Setting")} + -
- - onChangeData({ enable_memory_usage: e })} - onGuard={(e) => patchVerge({ enable_memory_usage: e })} - > - - - +
+ {OS === "macos" && ( + <> + + + - - onChangeData({ enable_group_icon: e })} - onGuard={(e) => patchVerge({ enable_group_icon: e })} - > - - - + + handleConfigChange({ enable_tray_icon: checked })} + /> + + + )} - } - > - onChangeData({ enable_hover_jump_navigator: e })} - onGuard={(e) => patchVerge({ enable_hover_jump_navigator: e })} - > - - - -
+ + + - - - + + + + + +
+ + + + + + - - -
-
+ +
+
); -}); +}); \ No newline at end of file diff --git a/src/components/setting/setting-verge-basic.tsx b/src/components/setting/setting-verge-basic.tsx index 18cb6077..3c08ea5c 100644 --- a/src/components/setting/setting-verge-basic.tsx +++ b/src/components/setting/setting-verge-basic.tsx @@ -188,24 +188,22 @@ const SettingVergeBasic = ({ onError }: Props) => { {OS !== "linux" && ( - } + label={ + + } > v} - onChange={(e) => onChangeData({ tray_event: e })} - onGuard={(e) => patchVerge({ tray_event: e })} + value={tray_event ?? "main_window"} + onCatch={onError} + onFormat={(v) => v} + onChange={(e) => onChangeData({ tray_event: e })} + onGuard={(e) => patchVerge({ tray_event: e })} + onChangeProps="onValueChange" > -