From f8dbc7bea0ce892a8c979fbf8a19522787242826 Mon Sep 17 00:00:00 2001 From: wonfen Date: Thu, 20 Mar 2025 01:44:43 +0800 Subject: [PATCH] feat: lite mode settings --- src-tauri/src/config/verge.rs | 14 ++ src-tauri/src/lib.rs | 35 +++++ .../setting/mods/lite-mode-viewer.tsx | 144 ++++++++++++++++++ .../setting/setting-verge-advanced.tsx | 7 +- src/locales/en.json | 6 + src/locales/zh.json | 6 + src/services/types.d.ts | 2 + 7 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 src/components/setting/mods/lite-mode-viewer.tsx diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index be8cb718..f124365b 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -191,6 +191,12 @@ pub struct IVerge { /// 轻量模式 - 只保留内核运行 pub enable_lite_mode: Option, + + /// 自动进入轻量模式 + pub auto_enter_lite_mode: Option, + + /// 自动进入轻量模式的延迟(分钟) + pub auto_enter_lite_mode_delay: Option, } #[derive(Default, Debug, Clone, Deserialize, Serialize)] @@ -294,6 +300,8 @@ impl IVerge { enable_tray_speed: Some(true), enable_global_hotkey: Some(true), enable_lite_mode: Some(false), + auto_enter_lite_mode: Some(false), + auto_enter_lite_mode_delay: Some(10), enable_dns_settings: Some(true), home_cards: None, ..Self::default() @@ -378,6 +386,8 @@ impl IVerge { patch!(webdav_password); patch!(enable_tray_speed); patch!(enable_lite_mode); + patch!(auto_enter_lite_mode); + patch!(auto_enter_lite_mode_delay); patch!(enable_dns_settings); patch!(home_cards); } @@ -469,6 +479,8 @@ pub struct IVergeResponse { pub webdav_password: Option, pub enable_tray_speed: Option, pub enable_lite_mode: Option, + pub auto_enter_lite_mode: Option, + pub auto_enter_lite_mode_delay: Option, pub enable_dns_settings: Option, pub home_cards: Option, } @@ -534,6 +546,8 @@ impl From for IVergeResponse { webdav_password: verge.webdav_password, enable_tray_speed: verge.enable_tray_speed, enable_lite_mode: verge.enable_lite_mode, + auto_enter_lite_mode: verge.auto_enter_lite_mode, + auto_enter_lite_mode_delay: verge.auto_enter_lite_mode_delay, enable_dns_settings: verge.enable_dns_settings, home_cards: verge.home_cards, } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 43e1140d..26f682b1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -283,6 +283,41 @@ pub fn run() { api.prevent_close(); let window = core::handle::Handle::global().get_window().unwrap(); let _ = window.hide(); + + // 检查是否启用了自动进入 Lite Mode + let verge = crate::config::Config::verge(); + let verge_config = verge.latest(); + let auto_enter_lite_mode = verge_config.auto_enter_lite_mode.unwrap_or(false); + + if auto_enter_lite_mode { + let delay_minutes = verge_config.auto_enter_lite_mode_delay.unwrap_or(10); + let app_handle_clone = app_handle.clone(); + println!("自动进入 Lite Mode 已启用"); + // 启动一个线程,在指定延迟后启用 Lite Mode + std::thread::spawn(move || { + println!("等待 {} 分钟后自动进入 Lite Mode", delay_minutes); + std::thread::sleep(std::time::Duration::from_secs(delay_minutes as u64 * 60)); + println!("Lite Mode 倒计时结束"); + + // 延迟后检查窗口是否仍然隐藏,如果是,则启用 Lite Mode + let window_opt = app_handle_clone.get_webview_window("main"); + if let Some(window) = window_opt { + if !window.is_visible().unwrap_or(true) { + println!("倒计时结束,正在进入 Lite Mode..."); + // 应用 Lite Mode + if let Err(e) = tauri::async_runtime::block_on(crate::feat::patch_verge( + crate::config::IVerge { + enable_lite_mode: Some(true), + ..Default::default() + }, + false + )) { + println!("Lite Mode 进入失败: {:?}", e); + } + } + } + }); + } } tauri::WindowEvent::Focused(true) => { #[cfg(target_os = "macos")] diff --git a/src/components/setting/mods/lite-mode-viewer.tsx b/src/components/setting/mods/lite-mode-viewer.tsx new file mode 100644 index 00000000..760c240f --- /dev/null +++ b/src/components/setting/mods/lite-mode-viewer.tsx @@ -0,0 +1,144 @@ +import { forwardRef, useImperativeHandle, useState } from "react"; +import { useLockFn } from "ahooks"; +import { useTranslation } from "react-i18next"; +import { + List, + ListItem, + ListItemText, + TextField, + Typography, + InputAdornment, +} from "@mui/material"; +import { useVerge } from "@/hooks/use-verge"; +import { BaseDialog, DialogRef, Notice, Switch } from "@/components/base"; +import { TooltipIcon } from "@/components/base/base-tooltip-icon"; + +export const LiteModeViewer = forwardRef((props, ref) => { + const { t } = useTranslation(); + const { verge, patchVerge } = useVerge(); + + const [open, setOpen] = useState(false); + const [values, setValues] = useState({ + autoEnterLiteMode: false, + autoEnterLiteModeDelay: 10, // 默认10分钟 + }); + + useImperativeHandle(ref, () => ({ + open: () => { + setOpen(true); + setValues({ + autoEnterLiteMode: verge?.auto_enter_lite_mode ?? false, + autoEnterLiteModeDelay: verge?.auto_enter_lite_mode_delay ?? 10, + }); + }, + close: () => setOpen(false), + })); + + const onEnterLiteMode = useLockFn(async () => { + try { + await patchVerge({ enable_lite_mode: true }); + setOpen(false); + } catch (err: any) { + Notice.error(err.message || err.toString()); + } + }); + + const onSave = useLockFn(async () => { + try { + await patchVerge({ + auto_enter_lite_mode: values.autoEnterLiteMode, + auto_enter_lite_mode_delay: values.autoEnterLiteModeDelay, + }); + setOpen(false); + } catch (err: any) { + Notice.error(err.message || err.toString()); + } + }); + + return ( + setOpen(false)} + onCancel={() => setOpen(false)} + onOk={onSave} + > + + + + + {t("Enable")} + + + + + + + + setValues((v) => ({ ...v, autoEnterLiteMode: c })) + } + sx={{ marginLeft: "auto" }} + /> + + + {values.autoEnterLiteMode && ( + <> + + + + setValues((v) => ({ + ...v, + autoEnterLiteModeDelay: parseInt(e.target.value) || 1, + })) + } + slotProps={{ + input: { + endAdornment: ( + {t("mins")} + ) + } + }} + /> + + + + + {t("When closing the window, Lite Mode will be automatically activated after _n minutes", + { n: values.autoEnterLiteModeDelay })} + + + + )} + + + ); +}); \ No newline at end of file diff --git a/src/components/setting/setting-verge-advanced.tsx b/src/components/setting/setting-verge-advanced.tsx index 4473b8dd..af2bbf53 100644 --- a/src/components/setting/setting-verge-advanced.tsx +++ b/src/components/setting/setting-verge-advanced.tsx @@ -21,6 +21,7 @@ import { ThemeViewer } from "./mods/theme-viewer"; import { LayoutViewer } from "./mods/layout-viewer"; import { UpdateViewer } from "./mods/update-viewer"; import { BackupViewer } from "./mods/backup-viewer"; +import { LiteModeViewer } from "./mods/lite-mode-viewer"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; import { ContentCopyRounded } from "@mui/icons-material"; @@ -39,6 +40,7 @@ const SettingVergeAdvanced = ({ onError }: Props) => { const layoutRef = useRef(null); const updateRef = useRef(null); const backupRef = useRef(null); + const liteModeRef = useRef(null); const onCheckUpdate = async () => { try { @@ -67,6 +69,7 @@ const SettingVergeAdvanced = ({ onError }: Props) => { + backupRef.current?.open()} @@ -104,11 +107,11 @@ const SettingVergeAdvanced = ({ onError }: Props) => { } - onClick={() => patchVerge({ enable_lite_mode: true })} + onClick={() => liteModeRef.current?.open()} />