import { useState, useMemo } from 'react'; import { NavLink, useLocation, useNavigate } from 'react-router-dom'; import { Activity, BarChart3, Calculator, CalendarDays, ChevronDown, ClipboardCheck, ClipboardList, Database, Info, LayoutGrid, LogOut, Map, Menu, Receipt, Search, Settings, ShieldCheck, Tag, TrendingDown, User, X, Repeat, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useAuth } from '@/hooks/useAuth'; import { useOverdueCount } from '@/hooks/useQueries'; import { ThemeToggle } from '@/components/ui/theme-toggle'; import { Button } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; 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: '/', icon: LayoutGrid, label: 'Tracker', end: true }, { to: '/admin', icon: ShieldCheck, label: 'Admin Panel', end: true }, { to: '/admin/status', icon: Activity, label: 'System Status' }, { to: '/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: '/subscriptions', icon: Repeat, label: 'Subscriptions' }, { to: '/categories', icon: Tag, label: 'Categories' }, { to: '/health', icon: ClipboardCheck, label: 'Health' }, { to: '/snowball', icon: TrendingDown, label: 'Snowball' }, { to: '/payoff', icon: Calculator, label: 'Payoff' }, ]; function TrackerMenu({ onNavigate, badge, badgeNames = [] }) { 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('/roadmap')}> Roadmap )} Logout ); } export default function Sidebar({ adminMode = false }) { const [mobileOpen, setMobileOpen] = useState(false); const { user } = useAuth(); const items = useMemo(() => adminMode ? adminNavItems : userNavItems, [adminMode]); const { data: overdueData } = useOverdueCount(); const overdueCount = (!adminMode && overdueData?.count) ? overdueData.count : 0; const overdueNames = (!adminMode && overdueData?.names) ? overdueData.names : []; return (
{!adminMode && ( )}
{mobileOpen && (
)}
); }