"use client"; import { useState } from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { ChevronRightIcon } from "lucide-react"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, } from "@/components/ui/sidebar"; import { navItems, type NavItem } from "./nav-items"; type NavGroupItem = Extract; export function AppSidebar({ footer }: { footer: React.ReactNode }) { const pathname = usePathname(); return ( Cleo Minimarket {navItems.map((item) => "items" in item ? ( ) : ( } isActive={pathname === item.href} > {item.title} ), )} {footer} ); } // Controlled karena sidebar tetap ter-mount antar navigasi; defaultOpen yang berubah memicu warning Base UI. function NavGroup({ item, pathname, }: { item: NavGroupItem; pathname: string; }) { const isActive = item.items.some((sub) => pathname.startsWith(sub.href)); const [open, setOpen] = useState(isActive); const [prevActive, setPrevActive] = useState(isActive); // Buka otomatis saat navigasi masuk ke grup ini, tanpa menutup grup yang dibuka manual. if (isActive !== prevActive) { setPrevActive(isActive); if (isActive) setOpen(true); } return ( } > }> {item.title} {item.items.map((sub) => ( } isActive={pathname.startsWith(sub.href)} > {sub.title} ))} ); }