import { useState, useEffect } from 'react'; import { Box, Typography, Paper, Switch, Button, Snackbar, Alert, CircularProgress, Stack, } from '@mui/material'; import RefreshIcon from '@mui/icons-material/Refresh'; import type { PageType } from '@/types/storage'; import { storageUtil } from '@/utils/chromeStorage'; import { ROUTES } from '@/config/routes'; 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', 'openUrl', ] as PageType[]); setVisiblePages(saved ?? ['timestamp', 'storageCleaner', 'openUrl']); } catch (error) { console.error('Failed to load config:', error); setVisiblePages(['timestamp', 'storageCleaner', 'openUrl']); } 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); const route = ROUTES.find((r) => r.key === page); showToast(`已${isCurrentlyVisible ? '隐藏' : '显示'} ${route?.label || page}`, 'success'); } catch (error) { console.error('Failed to save config:', error); showToast('保存失败', 'warning'); } }; const handleRestoreDefaults = async () => { try { const defaults = ROUTES.filter((route) => route.defaultVisible).map((route) => route.key); 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 ( {ROUTES.filter((route) => route.key !== 'dashboard' && route.key !== 'openUrlViewer').map( (route, index, array) => { const isChecked = visiblePages.includes(route.key); const isDisabled = isChecked && visiblePages.length === 1; return ( {route.label} {isChecked ? '已在 Dashboard 启用' : '已在 Dashboard 隐藏'} handlePageToggle(route.key)} disabled={isDisabled} /> ); }, )} {toast} ); } export default App;