import { useState, useEffect } from 'react' import { Outlet, Link, useLocation, useNavigate } from 'react-router-dom' import { LayoutDashboard, Users, Settings, LogOut, Wallet, BookOpen, GitMerge, } from 'lucide-react' import { get, post } from '@/api/client' import { clearAdminToken } from '@/api/auth' // 主菜单(5 项平铺,按 Mycontent-temp 新规范) const primaryMenuItems = [ { icon: LayoutDashboard, label: '数据概览', href: '/dashboard' }, { icon: BookOpen, label: '内容管理', href: '/content' }, { icon: Users, label: '用户管理', href: '/users' }, { icon: GitMerge, label: '找伙伴', href: '/find-partner' }, { icon: Wallet, label: '推广中心', href: '/distribution' }, ] export function AdminLayout() { const location = useLocation() const navigate = useNavigate() const [mounted, setMounted] = useState(false) const [authChecked, setAuthChecked] = useState(false) useEffect(() => { setMounted(true) }, []) useEffect(() => { if (!mounted) return setAuthChecked(false) let cancelled = false get<{ success?: boolean }>('/api/admin') .then((data) => { if (cancelled) return if (data && (data as { success?: boolean }).success !== false) { setAuthChecked(true) } else { navigate('/login', { replace: true }) } }) .catch(() => { if (!cancelled) navigate('/login', { replace: true }) }) return () => { cancelled = true } }, [mounted, navigate]) const handleLogout = async () => { clearAdminToken() try { await post('/api/admin/logout', {}) } catch { // 忽略登出接口失败,本地已清 token } navigate('/login', { replace: true }) } if (!mounted || !authChecked) { return (
Soul创业派对