import { useState, useEffect, useCallback } from 'react'; import { useTheme, THEME_OPTIONS, type Theme } from '@/hooks/useTheme'; import { LOGIN_STYLE_OPTIONS, type LoginStyle } from '@/pages/LoginPage'; import { Check, Save, Loader2 } from 'lucide-react'; import api from '@/api/request'; import { toast } from '@/hooks/useToast'; // Login style preview color themes (independent from app theme) const LOGIN_PREVIEW_COLORS: Record = { split: { bg: 'linear-gradient(135deg, #080c14 0%, #0c1420 100%)', accent: '#00d4aa', label: '晶格科技' }, centered: { bg: 'linear-gradient(180deg, #0a0a1a 0%, #1a1035 50%, #2d1810 100%)', accent: '#fbbf24', label: '晨曦微光' }, sidepanel: { bg: 'linear-gradient(180deg, #020810 0%, #062030 100%)', accent: '#06b6d4', label: '深海鲸歌' }, fullimage: { bg: '#0d1117', accent: '#6366f1', label: 'GitHub/AWS' }, minimal: { bg: 'linear-gradient(160deg, #0a0a1a 0%, #0f0a2a 40%, #150825 70%, #0a0a1a 100%)', accent: '#ec4899', label: 'Premium Dark' }, }; export default function AppearanceSettings() { const { theme, setTheme } = useTheme(); const [loginStyle, setLoginStyle] = useState('split'); const [saving, setSaving] = useState(false); const [loading, setLoading] = useState(true); const [dirty, setDirty] = useState(false); useEffect(() => { api.get<{ theme?: string; login_style?: string }>('/user/preferences') .then(prefs => { if (prefs?.theme) { const t = prefs.theme; if (t === 'dark' || t === 'light') { setTheme(t === 'dark' ? 'ocean-deep' : 'light-professional'); } else if (THEME_OPTIONS.some(o => o.id === t)) { setTheme(t as Theme); } } if (prefs?.login_style) setLoginStyle(prefs.login_style as LoginStyle); }) .catch(() => { const stored = localStorage.getItem('login-style') as LoginStyle | null; if (stored) setLoginStyle(stored); }) .finally(() => setLoading(false)); }, []); const handleThemeChange = (t: Theme) => { setTheme(t); setDirty(true); }; const handleLoginStyleChange = (id: LoginStyle) => { setLoginStyle(id); setDirty(true); }; const handleSave = useCallback(async () => { setSaving(true); try { await api.put('/user/preferences', { theme, login_style: loginStyle, }); localStorage.setItem('login-style', loginStyle); setDirty(false); toast('success', '外观设置已保存'); } catch { toast('error', '保存失败'); } finally { setSaving(false); } }, [theme, loginStyle]); if (loading) { return (
); } return (
{/* ===== Theme Mode Section ===== */}

界面配色

选择界面配色方案,即时预览效果

{THEME_OPTIONS.map(opt => ( ))}
{/* ===== Login Page Style Section ===== */}

登录页风格

选择登录页面的视觉风格,保存后退出登录即可预览

{LOGIN_STYLE_OPTIONS.map(opt => { const preview = LOGIN_PREVIEW_COLORS[opt.id]; return ( ); })}
{/* Save Button */}
{dirty && ( 有未保存的更改 )}
); }