"use client"; import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuAction, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, } from "@/components/ui/sidebar"; import { ChevronRight, ChevronDown, MoreHorizontal } from "lucide-react"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@radix-ui/react-collapsible"; import React from "react"; import Link from "next/link"; import { cn } from "@/lib/utils"; import { buttonVariants } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { usePathname } from "next/navigation"; export type SidebarItem = { title: string; url: string; redirect?: boolean; not_from_base_url?: boolean; icon: React.ElementType; dropdown?: SidebarItem[]; submenu?: SidebarItem[]; details?: boolean; type: "item" | "collapse"; }; export type SidebarGroupItem = { label: string; type: "list" | "collapse"; group_content: SidebarItem[]; }; type SidebarMenuCustomBaseProps = { baseUrl: string; items: SidebarGroupItem[]; }; export const SidebarMenuCustomBase = ({ baseUrl, items }: SidebarMenuCustomBaseProps) => { const pathname = usePathname(); const normalize = (url: string) => url.split("?")[0].replace(/\/$/, ""); const isItemActive = (item: SidebarItem) => { const fullUrl = item.not_from_base_url ? normalize(item.url) : normalize(`${baseUrl}${item.url}`); if (item.details) return normalize(pathname).startsWith(fullUrl); return normalize(pathname) === fullUrl; }; const isSubActive = (item: SidebarItem) => { if (!item.submenu) return false; return item.submenu.some((sub) => isItemActive(sub)); }; return ( {items.map((group, index) => ( {group.label} {group.type === "collapse" && ( )} {group.group_content.map((item, idx) => { if (item.type === "collapse" && item.submenu) { const isChildActive = isSubActive(item); return ( {item.title} {item.submenu.map((sub, subIdx) => ( {sub.title} ))} ); } return ( {item.title} {item.dropdown && ( {item.dropdown.map((dropdown, dIdx) => ( {dropdown.title} ))} )} ); })} ))} ); };