'use client'; import * as React from 'react'; import { ChevronRight } from 'lucide-react'; import { LogoWrapper } from '@/components/LogoWrapper'; import { NavUser } from '@/components/nav-user'; import { filterMenuItems, menuItems, type MenuItem, } from '@/config/menu.config'; import { usePermissions } from '@/hooks/usePermissions'; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '@/components/ui/collapsible'; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarRail, SidebarTrigger, useSidebar, } from '@/components/ui/sidebar'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { useAppStore } from '@/store/app.store'; function isRouteActive(pathname: string, path?: string) { if (!path) return false; return pathname === path || pathname.startsWith(`${path}/`); } export function AppSidebar({ ...props }: React.ComponentProps) { const pathname = usePathname(); const { hasPermission } = usePermissions(); const { isMobile } = useSidebar(); const authUser = useAppStore((state) => state.user); const navItems = filterMenuItems(menuItems, hasPermission); const user = { name: [authUser?.first_name, authUser?.last_name].filter(Boolean).join(' ') || 'Admin', email: authUser?.email || '', avatar: authUser?.profile_photo_url || '/avatars/profile.jpg', }; return (
RoadMonitor Road Intelligence
{navItems.map((item) => ( ))}
); } function SidebarBrandControl({ isMobile }: { isMobile: boolean }) { return (
Open menu
); } function SidebarNavItem({ item, pathname, }: { item: MenuItem; pathname: string; }) { const isActive = isRouteActive(pathname, item.path); const isChildActive = item.children?.some((child) => isRouteActive(pathname, child.path)) ?? false; const hasChildren = Boolean(item.children?.length); const [open, setOpen] = React.useState(isChildActive); React.useEffect(() => { if (isChildActive) setOpen(true); }, [isChildActive]); if (hasChildren) { return ( {item.title} {item.children?.map((child) => ( {child.path ? ( {child.title} ) : null} ))} ); } return ( {item.path ? ( {item.title} ) : ( {item.title} )} ); }