import { FC, useState, useEffect } from 'react'; import { Link, Outlet, useLocation, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { RiFileTextLine, RiFolderLine, RiUserLine, RiTeamLine, RiLogoutBoxRLine, RiSunLine, RiMoonLine, RiComputerLine, RiGlobalLine, RiCalendarLine, RiImageLine, RiSettings3Line, } from 'react-icons/ri'; import { useTheme } from '../../../hooks/useTheme'; import { Suspense } from 'react'; import LoadingSpinner from '../../../components/LoadingSpinner'; import { useUser } from '../../../contexts/UserContext'; import { PageTitleProvider, usePageTitle } from '../../../contexts/PageTitleContext'; interface AdminLayoutProps {} const menuItems = [ { path: '/admin/posts', icon: RiFileTextLine, label: 'admin.nav.posts' }, { path: '/admin/daily', icon: RiCalendarLine, label: 'admin.nav.daily' }, { path: '/admin/medias', icon: RiImageLine, label: 'admin.nav.medias' }, { path: '/admin/categories', icon: RiFolderLine, label: 'admin.nav.categories' }, { path: '/admin/users', icon: RiUserLine, label: 'admin.nav.users' }, { path: '/admin/contributors', icon: RiTeamLine, label: 'admin.nav.contributors' }, { path: '/admin/settings', icon: RiSettings3Line, label: 'admin.nav.settings' }, ]; const themeOptions = [ { value: 'light' as const, icon: RiSunLine, label: 'theme.light' }, { value: 'dark' as const, icon: RiMoonLine, label: 'theme.dark' }, { value: 'system' as const, icon: RiComputerLine, label: 'theme.system' } ]; const languageOptions = [ { value: 'en', label: 'English' }, { value: 'zh-Hans', label: '简体中文' }, { value: 'zh-Hant', label: '繁體中文' } ]; type LanguageMap = { 'en': 'zh-Hans'; 'zh-Hans': 'zh-Hant'; 'zh-Hant': 'en'; }; const languageMap: LanguageMap = { 'en': 'zh-Hans', 'zh-Hans': 'zh-Hant', 'zh-Hant': 'en' }; const AdminLayoutContent: FC = () => { const { t, i18n } = useTranslation(); const location = useLocation(); const navigate = useNavigate(); const { theme, setTheme } = useTheme(); const { user, loading, error, fetchUser } = useUser(); const { title } = usePageTitle(); useEffect(() => { // 如果没有 token,重定向到登录页 if (!localStorage.getItem('token')) { navigate('/admin/login'); return; } // 如果没有用户信息且没有在加载中,尝试获取用户信息 if (!user && !loading && !error) { fetchUser(); } // 如果获取用户信息出错,可能是 token 过期,重定向到登录页 if (error) { localStorage.removeItem('token'); navigate('/admin/login'); } }, [user, loading, error, navigate, fetchUser]); const handleLogout = async () => { try { // 调用后端登出接口 const token = localStorage.getItem('token'); if (token) { await fetch('/api/v1/auth/logout', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, }, }); } } catch (err) { console.error('Logout error:', err); } finally { // 清除所有认证相关的存储数据 localStorage.removeItem('token'); localStorage.removeItem('username'); // 重置用户状态 await fetchUser(); // 重定向到登录页 navigate('/admin/login'); } }; return (