import { useState } from 'react'; import { NavLink, useLocation, useNavigate } from 'react-router-dom'; import { Activity, BarChart3, CalendarDays, ChevronDown, ClipboardList, Database, Info, LayoutGrid, LogOut, 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'; 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' }, ]; 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 BrandBlock({ adminMode = false }) { return ( BillTracker {adminMode && ( Admin )} ); } function NavPill({ item, onNavigate }) { const Icon = item.icon; return ( cn( 'inline-flex items-center gap-2 rounded-full px-3 py-2 text-sm font-medium transition-all', 'focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50', isActive ? 'bg-primary text-primary-foreground shadow-sm shadow-primary/20' : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground hover:shadow-sm' )} > {item.label} ); } function TrackerMenu({ onNavigate }) { const location = useLocation(); const navigate = useNavigate(); const isTrackerActive = trackerItems.some(item => ( item.end ? location.pathname === item.to : location.pathname.startsWith(item.to) )); 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 = user?.display_name || user?.username || (adminMode ? 'Admin' : 'Profile'); const handleLogout = async () => { try { await logout(); } catch {} navigate('/login', { replace: true }); }; return ( {name} {user?.role === 'admin' && !adminMode && ( <> navigate('/admin')}> Admin Panel navigate('/admin/status')}> System Status )} navigate('/profile')}> Profile navigate('/settings')}> Settings navigate('/data')}> Data navigate('/about')}> About Logout ); } export default function Sidebar({ adminMode = false }) { const [mobileOpen, setMobileOpen] = useState(false); const { user } = useAuth(); const items = adminMode ? adminNavItems : userNavItems; return (
{mobileOpen && (
)}
); }