import { useState, useMemo } from 'react'; import { NavLink, useLocation, useNavigate } from 'react-router-dom'; import { Activity, BarChart3, CalendarDays, ChevronDown, ClipboardList, Database, Info, LayoutGrid, LogOut, Map, Menu, Receipt, Settings, ShieldCheck, Tag, User, X, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useAuth } from '@/hooks/useAuth'; import { ThemeToggle } from '@/components/ui/theme-toggle'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { NavPill } from './NavPill'; import { BrandBlock } from './BrandBlock'; const userNavItems = [ { to: '/calendar', icon: CalendarDays, label: 'Calendar' }, { to: '/analytics', icon: BarChart3, label: 'Analytics' }, ]; const adminNavItems = [ { to: '/admin', icon: ShieldCheck, label: 'Admin Panel', end: true }, { to: '/admin/status', icon: Activity, label: 'System Status' }, { to: '/admin/roadmap', icon: Map, label: 'Roadmap' }, ]; const trackerItems = [ { to: '/', icon: LayoutGrid, label: 'Overview', end: true }, { to: '/summary', icon: ClipboardList, label: 'Summary' }, { to: '/bills', icon: Receipt, label: 'Bills' }, { to: '/categories', icon: Tag, label: 'Categories' }, ]; function TrackerMenu({ onNavigate }) { const location = useLocation(); const navigate = useNavigate(); const isTrackerActive = useMemo(() => trackerItems.some(item => ( item.end ? location.pathname === item.to : location.pathname.startsWith(item.to) )), [location.pathname]); return ( {trackerItems.map(item => { const Icon = item.icon; return ( { navigate(item.to); onNavigate?.(); }}> {item.label} ); })} ); } function UserMenu({ adminMode = false }) { const { user, logout } = useAuth(); const navigate = useNavigate(); const name = useMemo(() => user?.display_name || user?.username || (adminMode ? 'Admin' : 'Profile'), [user, adminMode] ); const accountToolsAllowed = useMemo(() => !user?.is_default_admin, [user]); const userRole = useMemo(() => user?.role, [user]); const handleLogout = async () => { try { await logout(); } catch {} navigate('/login', { replace: true }); }; return ( {name} {userRole === 'admin' && !adminMode && ( <> navigate('/admin')}> Admin Panel navigate('/admin/status')}> System Status )} {accountToolsAllowed && ( <> navigate('/profile')}> Profile navigate('/settings')}> Settings navigate('/data')}> Data )} navigate('/about')}> About {user?.role === 'admin' && ( navigate('/admin/roadmap')}> Roadmap )} Logout ); } export default function Sidebar({ adminMode = false }) { const [mobileOpen, setMobileOpen] = useState(false); const { user } = useAuth(); const items = useMemo(() => adminMode ? adminNavItems : userNavItems, [adminMode]); return (
{mobileOpen && (
)}
); }