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() {