From 8764af1a560064ebd636cefbb6fb2fdba96df739 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Fri, 17 Apr 2026 12:05:33 -0400 Subject: [PATCH] alert before clean browsers --- src-tauri/src/backend/fast_clean.rs | 2 +- src/App.vue | 58 ++++++++++++++++++++++++++++- src/components/common/AppModal.vue | 15 ++++++-- src/composables/useBrowserClean.ts | 21 ++++++++++- src/pages/BrowserCleanPage.vue | 5 ++- src/styles/common.css | 10 +++++ src/types/cleaner.ts | 6 +++ 7 files changed, 109 insertions(+), 8 deletions(-) diff --git a/src-tauri/src/backend/fast_clean.rs b/src-tauri/src/backend/fast_clean.rs index 1f4d3f2..a706cf5 100644 --- a/src-tauri/src/backend/fast_clean.rs +++ b/src-tauri/src/backend/fast_clean.rs @@ -19,7 +19,7 @@ fn get_fast_cleaning_configs() -> Vec { Some(10), true, )); - configs.push(CleaningConfig::new("回收站", "C:\\$Recycle.Bin", None, false)); + configs.push(CleaningConfig::new("回收站", "C:\\$Recycle.Bin", None, true)); configs.push(CleaningConfig::new( "内核转储文件", "C:\\Windows\\LiveKernelReports", diff --git a/src/App.vue b/src/App.vue index 6a99540..0bb4ba5 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,7 +8,14 @@ import DiskAnalysisPage from "./pages/DiskAnalysisPage.vue"; import FastCleanPage from "./pages/FastCleanPage.vue"; import MemoryCleanPage from "./pages/MemoryCleanPage.vue"; import { openInExplorer, openSearch } from "./services/tauri/cleaner"; -import type { AlertOptions, FileNode, ModalType, Tab } from "./types/cleaner"; +import type { + AlertOptions, + ConfirmOptions, + FileNode, + ModalMode, + ModalType, + Tab, +} from "./types/cleaner"; const activeTab = ref("clean-c-fast"); const isCMenuOpen = ref(true); @@ -18,6 +25,10 @@ const showModal = ref(false); const modalTitle = ref(""); const modalMessage = ref(""); const modalType = ref("info"); +const modalMode = ref("alert"); +const modalConfirmText = ref("确定"); +const modalCancelText = ref("取消"); +let modalResolver: ((confirmed: boolean) => void) | null = null; const contextMenu = ref({ show: false, @@ -27,14 +38,53 @@ const contextMenu = ref({ }); function showAlert({ title, message, type = "info" }: AlertOptions) { + modalMode.value = "alert"; modalTitle.value = title; modalMessage.value = message; modalType.value = type; + modalConfirmText.value = "确定"; showModal.value = true; } +function requestConfirm({ + title, + message, + type = "info", + confirmText = "确定", + cancelText = "取消", +}: ConfirmOptions) { + if (modalResolver) { + modalResolver(false); + modalResolver = null; + } + + modalMode.value = "confirm"; + modalTitle.value = title; + modalMessage.value = message; + modalType.value = type; + modalConfirmText.value = confirmText; + modalCancelText.value = cancelText; + showModal.value = true; + + return new Promise((resolve) => { + modalResolver = resolve; + }); +} + function closeModal() { showModal.value = false; + if (modalResolver) { + modalResolver(false); + modalResolver = null; + } +} + +function confirmModal() { + showModal.value = false; + if (modalResolver) { + modalResolver(true); + modalResolver = null; + } } function handleContextMenu(event: MouseEvent, node: FileNode) { @@ -95,11 +145,13 @@ async function searchNode(provider: "google" | "perplexity") { v-else-if="activeTab === 'clean-browser-chrome'" browser="chrome" :show-alert="showAlert" + :request-confirm="requestConfirm" /> diff --git a/src/components/common/AppModal.vue b/src/components/common/AppModal.vue index 0ce11f6..d151d68 100644 --- a/src/components/common/AppModal.vue +++ b/src/components/common/AppModal.vue @@ -1,15 +1,19 @@ @@ -27,8 +31,13 @@ const emit = defineEmits<{ - diff --git a/src/composables/useBrowserClean.ts b/src/composables/useBrowserClean.ts index 8e5f66b..bea8237 100644 --- a/src/composables/useBrowserClean.ts +++ b/src/composables/useBrowserClean.ts @@ -3,7 +3,12 @@ import { startBrowserClean as runBrowserCleanCommand, startBrowserScan as runBrowserScanCommand, } from "../services/tauri/cleaner"; -import type { AlertOptions, BrowserScanResult, CleanResult } from "../types/cleaner"; +import type { + AlertOptions, + BrowserScanResult, + CleanResult, + ConfirmOptions, +} from "../types/cleaner"; import { formatItemSize } from "../utils/format"; interface BrowserState { @@ -17,6 +22,7 @@ interface BrowserState { export function useBrowserClean( browser: "chrome" | "edge", showAlert: (options: AlertOptions) => void, + requestConfirm: (options: ConfirmOptions) => Promise, ) { const state = ref({ isScanning: false, @@ -83,6 +89,19 @@ export function useBrowserClean( return; } + const browserName = browser === "chrome" ? "谷歌浏览器" : "微软浏览器"; + const confirmed = await requestConfirm({ + title: "确认清理浏览器缓存", + message: `即将清理 ${browserName} 的缓存和临时文件。\n\n建议先关闭浏览器,以避免部分文件被占用导致清理不完整。\n\n是否继续?`, + type: "info", + confirmText: "继续清理", + cancelText: "暂不清理", + }); + + if (!confirmed) { + return; + } + current.isCleaning = true; try { current.cleanResult = await runBrowserCleanCommand(browser, selectedProfiles); diff --git a/src/pages/BrowserCleanPage.vue b/src/pages/BrowserCleanPage.vue index 68ce1c2..0fa1a74 100644 --- a/src/pages/BrowserCleanPage.vue +++ b/src/pages/BrowserCleanPage.vue @@ -1,15 +1,16 @@ diff --git a/src/styles/common.css b/src/styles/common.css index e41879d..9e08442 100644 --- a/src/styles/common.css +++ b/src/styles/common.css @@ -462,11 +462,21 @@ color: var(--text-sec); font-size: 15px; line-height: 1.6; + white-space: pre-line; } .modal-footer { display: flex; justify-content: center; + gap: 12px; +} + +.modal-footer.is-confirm { + justify-content: center; +} + +.modal-btn { + min-width: 120px; } .context-menu { diff --git a/src/types/cleaner.ts b/src/types/cleaner.ts index 7ca7bc4..533ebe1 100644 --- a/src/types/cleaner.ts +++ b/src/types/cleaner.ts @@ -65,9 +65,15 @@ export interface ScanProgressPayload { } export type ModalType = "info" | "success" | "error"; +export type ModalMode = "alert" | "confirm"; export interface AlertOptions { title: string; message: string; type?: ModalType; } + +export interface ConfirmOptions extends AlertOptions { + confirmText?: string; + cancelText?: string; +}