From 979b45a898d1cc22e550e1569366392e5420a45e Mon Sep 17 00:00:00 2001
From: LingandRX <56020800+LingandRX@users.noreply.github.com>
Date: Sun, 5 Apr 2026 17:57:54 +0800
Subject: [PATCH] feat: enhance StorageCleanerPage with accordion for storage
options and immediate preference saving (#4)
---
.../popup/pages/StorageCleanerPage.tsx | 232 +++++++++++++-----
1 file changed, 168 insertions(+), 64 deletions(-)
diff --git a/entrypoints/popup/pages/StorageCleanerPage.tsx b/entrypoints/popup/pages/StorageCleanerPage.tsx
index 04ed851..0c0a477 100644
--- a/entrypoints/popup/pages/StorageCleanerPage.tsx
+++ b/entrypoints/popup/pages/StorageCleanerPage.tsx
@@ -8,9 +8,14 @@ import {
FormControlLabel,
Alert,
Snackbar,
+ Accordion,
+ AccordionSummary,
+ AccordionDetails,
+ Divider,
} from '@mui/material';
import RefreshIcon from '@mui/icons-material/Refresh';
import WarningIcon from '@mui/icons-material/Warning';
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import { storageUtil } from '@/utils/chromeStorage';
import type { StorageCleanerOptions, CleaningResult, StorageCleanerPreferences } from 'types/storage';
import {
@@ -76,8 +81,57 @@ export default function StorageCleanerPage() {
loadInfo();
}, []);
- const handleOptionChange = useCallback((key: keyof StorageCleanerOptions) => {
- setOptions((prev) => ({ ...prev, [key]: !prev[key] }));
+ const handleAutoRefreshChange = useCallback(async (checked: boolean) => {
+ setAutoRefresh(checked);
+ // Save preference immediately
+ const prefs = await storageUtil.get(
+ 'storageCleaner/preferences',
+ DEFAULT_PREFERENCES,
+ );
+ await storageUtil.set('storageCleaner/preferences', {
+ ...(prefs || DEFAULT_PREFERENCES),
+ autoRefresh: checked,
+ });
+ }, []);
+
+ const handleOptionChange = useCallback(async (key: keyof StorageCleanerOptions) => {
+ setOptions((prev) => {
+ const newOptions = { ...prev, [key]: !prev[key] };
+ // Save options immediately
+ storageUtil.get('storageCleaner/preferences', DEFAULT_PREFERENCES)
+ .then(prefs => {
+ storageUtil.set('storageCleaner/preferences', {
+ ...(prefs || DEFAULT_PREFERENCES),
+ selectedTypes: newOptions,
+ });
+ });
+ return newOptions;
+ });
+ }, []);
+
+ const allSelected = Object.values(options).every(Boolean);
+ const someSelected = Object.values(options).some(Boolean) && !allSelected;
+
+ const handleSelectAll = useCallback(async (checked: boolean) => {
+ const newOptions = {
+ localStorage: checked,
+ sessionStorage: checked,
+ indexedDB: checked,
+ cookies: checked,
+ cacheStorage: checked,
+ serviceWorkers: checked,
+ };
+ setOptions(newOptions);
+
+ // Save options immediately
+ const prefs = await storageUtil.get(
+ 'storageCleaner/preferences',
+ DEFAULT_PREFERENCES,
+ );
+ await storageUtil.set('storageCleaner/preferences', {
+ ...(prefs || DEFAULT_PREFERENCES),
+ selectedTypes: newOptions,
+ });
}, []);
const handleClean = useCallback(async () => {
@@ -148,67 +202,111 @@ export default function StorageCleanerPage() {
{/* Storage Type Options */}
-
-
- 选择要清理的存储类型:
-
-
- handleOptionChange('localStorage')}
- />
- }
- label="localStorage"
- />
- handleOptionChange('sessionStorage')}
- />
- }
- label="sessionStorage"
- />
- handleOptionChange('indexedDB')}
- />
- }
- label="IndexedDB"
- />
- handleOptionChange('cookies')}
- />
- }
- label="Cookies"
- />
- handleOptionChange('cacheStorage')}
- />
- }
- label="Cache Storage"
- />
- handleOptionChange('serviceWorkers')}
- />
- }
- label="Service Workers"
- />
-
-
+
+ }
+ sx={{
+ px: 2,
+ minHeight: 48,
+ '&.Mui-expanded': { minHeight: 48 },
+ '& .MuiAccordionSummary-content': { my: 1, '&.Mui-expanded': { my: 1 } },
+ }}
+ >
+
+ 清理选项 {allSelected ? '(全部)' : someSelected ? '(部分)' : '(未选)'}
+
+
+
+
+ handleOptionChange('localStorage')}
+ />
+ }
+ label={localStorage}
+ />
+ handleOptionChange('sessionStorage')}
+ />
+ }
+ label={sessionStorage}
+ />
+ handleOptionChange('indexedDB')}
+ />
+ }
+ label={IndexedDB}
+ />
+ handleOptionChange('cookies')}
+ />
+ }
+ label={Cookies}
+ />
+ handleOptionChange('cacheStorage')}
+ />
+ }
+ label={Cache Storage}
+ />
+ handleOptionChange('serviceWorkers')}
+ />
+ }
+ label={Service Workers}
+ />
+
+ handleSelectAll(e.target.checked)}
+ />
+ }
+ label={
+
+ 全选
+
+ }
+ />
+
+
+
{/* Auto Refresh Option */}
@@ -216,7 +314,7 @@ export default function StorageCleanerPage() {
control={
setAutoRefresh(e.target.checked)}
+ onChange={(e) => handleAutoRefreshChange(e.target.checked)}
/>
}
label="清理完成后自动刷新页面"
@@ -228,6 +326,12 @@ export default function StorageCleanerPage() {