import { AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion'; import { SidebarMenuButton, useSidebar } from '@/components/ui/sidebar'; import { routeLastSegment, routeSecondSegment } from '@/lib/route'; import { cn } from '@/lib/utils'; import { SharedData } from '@/types/global'; import { Link, usePage } from '@inertiajs/react'; import { Dot } from 'lucide-react'; interface NavMainItemProps { pageRoute: RoutePage; } const NavMainItem = (props: NavMainItemProps) => { const page = usePage(); const { auth, direction } = page.props; const { state, toggleSidebar } = useSidebar(); const { pageRoute } = props; const { Icon, name, path, children, slug } = pageRoute; const compact = state === 'collapsed' ? true : false; const activeAccordion = (slug: string) => { return routeSecondSegment(page.url) === slug; }; const activeRoute = (slug: string) => { return routeLastSegment(page.url) === slug; }; // Child routes can share the same last segment (e.g., "create"). // To avoid multiple items being marked active, we also require the parent // accordion slug (second segment) to match. const activeChildRoute = (parentSlug: string, childSlug: string) => { return activeAccordion(parentSlug) && activeRoute(childSlug); }; return children.length > 0 ? (
compact && toggleSidebar()} className={cn( 'hover:bg-muted h-9 overflow-hidden rounded-sm', activeAccordion(slug) && 'bg-secondary text-secondary-foreground hover:text-secondary-foreground hover:bg-secondary-light', )} > svg]:hidden', direction === 'rtl' && 'pr-0', )} > {name}
{children.map(({ path, name, slug, access }, index: number) => { if (access.includes(auth.user.role)) { return ( {name} ); } })}
) : ( {name} ); }; export default NavMainItem;