import { ReactNode } from "react";
import { Link, useLocation } from "@tanstack/react-router";
import { ChevronRight } from "lucide-react";
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger
} from "@/components/ui/collapsible";
import {
SidebarGroup,
SidebarGroupLabel,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
SidebarMenuSub,
SidebarMenuSubButton,
SidebarMenuSubItem,
useSidebar
} from "@/components/ui/sidebar";
import { Badge } from "../ui/badge";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger
} from "../ui/dropdown-menu";
import { NavCollapsible, NavItem, NavLink, type NavGroup } from "./types";
export function NavGroup({ title, items }: NavGroup) {
const { state } = useSidebar();
const href = useLocation({ select: (location) => location.href });
return (
{title}
{items.map((item) => {
const key = `${item.title}-${item.url}`;
if (!item.items)
return ;
if (state === "collapsed")
return (
);
return ;
})}
);
}
const NavBadge = ({ children }: { children: ReactNode }) => (
{children}
);
const SidebarMenuLink = ({ item, href }: { item: NavLink; href: string }) => {
const { setOpenMobile } = useSidebar();
return (
setOpenMobile(false)}>
{item.icon && }
{item.title}
{item.badge && {item.badge}}
);
};
const SidebarMenuCollapsible = ({
item,
href
}: {
item: NavCollapsible;
href: string;
}) => {
const { setOpenMobile } = useSidebar();
return (
{item.icon && }
{item.title}
{item.badge && {item.badge}}
{item.items.map((subItem) => (
setOpenMobile(false)}>
{subItem.icon && }
{subItem.title}
{subItem.badge && {subItem.badge}}
))}
);
};
const SidebarMenuCollapsedDropdown = ({
item,
href
}: {
item: NavCollapsible;
href: string;
}) => {
return (
{item.icon && }
{item.title}
{item.badge && {item.badge}}
{item.title} {item.badge ? `(${item.badge})` : ""}
{item.items.map((sub) => (
{sub.icon && }
{sub.title}
{sub.badge && (
{sub.badge}
)}
))}
);
};
function checkIsActive(href: string, item: NavItem, mainNav = false) {
return (
href === item.url || // /endpint?search=param
href.split("?")[0] === item.url || // endpoint
!!item?.items?.filter((i) => i.url === href).length || // if child nav is active
(mainNav &&
href.split("/")[1] !== "" &&
href.split("/")[1] === item?.url?.split("/")[1])
);
}