import { useState } from 'react'; import { NavLink, useNavigate } from 'react-router-dom'; import { Activity, ChevronDown, 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'; import { APP_VERSION } from '@/lib/version'; const userNavItems = [ { to: '/', icon: LayoutGrid, label: 'Tracker', end: true }, { to: '/bills', icon: Receipt, label: 'Bills' }, { to: '/categories', icon: Tag, label: 'Categories' }, { to: '/settings', icon: Settings, label: 'Settings' }, { to: '/status', icon: Activity, label: 'Status' }, ]; const adminNavItems = [ { to: '/admin', icon: ShieldCheck, label: 'Admin', end: true }, ]; function BrandBlock({ adminMode = false }) { return (
$
BillTracker {adminMode && ( Admin )}
v{APP_VERSION}
); } 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 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} navigate('/profile')}> Profile {user?.role === 'admin' && !adminMode && ( navigate('/admin')}> Admin )} Logout ); } export default function Sidebar({ adminMode = false }) { const [mobileOpen, setMobileOpen] = useState(false); const { user } = useAuth(); const items = user?.role === 'admin' ? [...userNavItems, ...adminNavItems] : userNavItems; return (
{mobileOpen && (
)}
); }