import { useState, useCallback } from 'react'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, } from '@/components/ui/alert-dialog'; import { Loader2, Trash2, AlertTriangle } from 'lucide-react'; import { useI18n } from '@/lib/hooks/use-i18n'; import { clearDatabase } from '@/lib/utils/database'; import { toast } from 'sonner'; import { createLogger } from '@/lib/logger'; const log = createLogger('GeneralSettings'); export function GeneralSettings() { const { t } = useI18n(); // Clear cache state const [showClearDialog, setShowClearDialog] = useState(false); const [confirmInput, setConfirmInput] = useState(''); const [clearing, setClearing] = useState(false); const confirmPhrase = t('settings.clearCacheConfirmPhrase'); const isConfirmValid = confirmInput === confirmPhrase; const handleClearCache = useCallback(async () => { if (!isConfirmValid) return; setClearing(true); try { // 1. Clear IndexedDB await clearDatabase(); // 2. Clear localStorage localStorage.clear(); // 3. Clear sessionStorage sessionStorage.clear(); toast.success(t('settings.clearCacheSuccess')); // Reload page after a short delay setTimeout(() => { window.location.reload(); }, 1000); } catch (error) { log.error('Failed to clear cache:', error); toast.error(t('settings.clearCacheFailed')); setClearing(false); } }, [isConfirmValid, t]); const clearCacheItems = t('settings.clearCacheConfirmItems').split('、').length > 1 ? t('settings.clearCacheConfirmItems').split('、') : t('settings.clearCacheConfirmItems').split(', '); return (
{/* Danger Zone - Clear Cache */}
{/* Subtle diagonal stripe pattern for danger emphasis */}
{/* Header */}

{t('settings.dangerZone')}

{/* Content */}

{t('settings.clearCache')}

{t('settings.clearCacheDescription')}

{/* Clear Cache Confirmation Dialog */} { if (!clearing) { setShowClearDialog(open); if (!open) setConfirmInput(''); } }} > {t('settings.clearCacheConfirmTitle')}

{t('settings.clearCacheConfirmDescription')}

    {clearCacheItems.map((item, i) => (
  • {item.trim()}
  • ))}
setConfirmInput(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter' && isConfirmValid) { handleClearCache(); } }} autoFocus />
{t('common.cancel')}
); }