import { useState, useEffect } from 'react'; import { Box, Typography, Paper, FormControlLabel, Switch, Button, Snackbar, Alert, CircularProgress, } from '@mui/material'; import RefreshIcon from '@mui/icons-material/Refresh'; import type { PageType } from '@/types/storage'; import { storageUtil } from '@/utils/chromeStorage'; const PAGE_CONFIG = { timestamp: { label: '时间戳', defaultVisible: true }, storageCleaner: { label: '存储清理', defaultVisible: true }, } as const satisfies Record; function App() { const [visiblePages, setVisiblePages] = useState([]); const [isLoaded, setIsLoaded] = useState(false); const [toast, setToast] = useState(null); const [toastSeverity, setToastSeverity] = useState<'success' | 'info' | 'warning'>('info'); useEffect(() => { loadConfig(); }, []); const loadConfig = async () => { try { const saved = await storageUtil.get('app/visiblePages', [ 'timestamp', 'storageCleaner', ] as PageType[]); // Ensure we always have an array setVisiblePages(saved ?? ['timestamp', 'storageCleaner']); } catch (error) { console.error('Failed to load config:', error); setVisiblePages(['timestamp', 'storageCleaner']); } finally { setIsLoaded(true); } }; const handlePageToggle = async (page: PageType) => { const isCurrentlyVisible = visiblePages.includes(page); let newPages: PageType[]; if (isCurrentlyVisible) { // 尝试隐藏,但至少保留一个 if (visiblePages.length <= 1) { showToast('至少需要保留一个可见页面', 'warning'); return; } newPages = visiblePages.filter((p) => p !== page); } else { newPages = [...visiblePages, page]; } try { await storageUtil.set('app/visiblePages', newPages); setVisiblePages(newPages); showToast( `已${isCurrentlyVisible ? '隐藏' : '显示'} ${PAGE_CONFIG[page].label}`, 'success', ); } catch (error) { console.error('Failed to save config:', error); showToast('保存失败,请重试', 'warning'); } }; const handleRestoreDefaults = async () => { try { const defaults = (Object.keys(PAGE_CONFIG) as PageType[]).filter( (key) => PAGE_CONFIG[key].defaultVisible, ); await storageUtil.set('app/visiblePages', defaults); setVisiblePages(defaults); showToast('已恢复默认设置', 'success'); } catch (error) { console.error('Failed to restore defaults:', error); showToast('恢复失败,请重试', 'warning'); } }; const showToast = (message: string, severity: 'success' | 'info' | 'warning') => { setToast(message); setToastSeverity(severity); }; const handleCloseToast = () => { setToast(null); }; if (!isLoaded) { return ( ); } return ( ⚙️ 扩展设置 自定义 popup 弹窗中显示的功能页面。更改将立即生效,无需保存。 可见页面设置 {(Object.keys(PAGE_CONFIG) as PageType[]).map((pageKey) => { const config = PAGE_CONFIG[pageKey]; const isChecked = visiblePages.includes(pageKey); const isDisabled = !isChecked && visiblePages.length === 1; return ( handlePageToggle(pageKey)} disabled={isDisabled} color="primary" /> } label={config.label} sx={{ width: '100%', mb: 1, '&:last-child': { mb: 0 }, }} /> ); })} {toast} 提示:更改将立即应用到 popup 弹窗。如需查看效果,请关闭并重新打开扩展弹窗。 ); } export default App;