import { useEffect, useState } from 'react' import { NavLink, Outlet, useNavigate } from 'react-router-dom' import { LayoutDashboard, Users, User, LogOut, Moon, Sun, Menu, } from 'lucide-react' import { api, UserInfo } from '@/lib/api' import { clearAuth, canManageUsers, roleLabel } from '@/lib/auth' import { cn } from '@/lib/cn' import { useTheme } from './ThemeProvider' const BRAND = '#8B5CF6' export function Layout() { const { resolved, setTheme, theme } = useTheme() const isDark = resolved === 'dark' const navigate = useNavigate() const [user, setUser] = useState(null) const [mobileOpen, setMobileOpen] = useState(false) useEffect(() => { const token = localStorage.getItem('access_token') if (!token) { setUser(null) return } api.me() .then(setUser) .catch(() => { clearAuth() setUser(null) }) }, [navigate]) const handleLogout = async () => { try { await api.logout() } catch {} clearAuth() navigate('/login', { replace: true }) } const navItems = [ { to: '/', label: '看板', icon: LayoutDashboard }, ...(user && canManageUsers(user.role) ? [{ to: '/users', label: '用户管理', icon: Users }] : []), { to: '/profile', label: '个人中心', icon: User }, ] const toggleTheme = () => { if (theme === 'system') { setTheme(isDark ? 'light' : 'dark') } else { setTheme(theme === 'dark' ? 'light' : 'dark') } } const sidebar = ( ) return (
A
A股工作台
setMobileOpen(false)} />
{sidebar}
) }