Files
tonePage/tone-page-web/components/nav-main.tsx
2025-06-19 14:55:58 +08:00

96 lines
2.8 KiB
TypeScript

"use client"
import { ChevronRight, type LucideIcon } from "lucide-react"
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible"
import {
SidebarGroup,
SidebarGroupLabel,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
SidebarMenuSub,
SidebarMenuSubButton,
SidebarMenuSubItem,
} from "@/components/ui/sidebar"
import Link from "next/link"
import { Skeleton } from "./ui/skeleton"
export function NavMain({
items,
}: {
items: null | {
title: string
url: string
icon?: LucideIcon
isActive?: boolean
isHidden?: boolean
items?: {
title: string
url: string
isHidden?: boolean
}[]
}[]
}) {
return (
<SidebarGroup>
<SidebarGroupLabel></SidebarGroupLabel>
<SidebarMenu>
{
!items && Array(5).fill(null).map((_, i) => (
<Skeleton key={i} className="w-full h-7 mt-1" />
))
}
{items && items.filter(i => !i.isHidden).map((item) => (
(item.items && item.items.length > 0)
? (
<Collapsible
key={item.title}
asChild
defaultOpen={item.isActive}
className="group/collapsible"
>
<SidebarMenuItem>
<CollapsibleTrigger asChild>
<SidebarMenuButton tooltip={item.title}>
{item.icon && <item.icon />}
<span>{item.title}</span>
<ChevronRight className="ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" />
</SidebarMenuButton>
</CollapsibleTrigger>
<CollapsibleContent>
<SidebarMenuSub>
{item.items.filter(i => !i.isHidden).map((subItem) => (
<SidebarMenuSubItem key={subItem.title}>
<SidebarMenuSubButton asChild>
<Link href={subItem.url}>
<span>{subItem.title}</span>
</Link>
</SidebarMenuSubButton>
</SidebarMenuSubItem>
))}
</SidebarMenuSub>
</CollapsibleContent>
</SidebarMenuItem>
</Collapsible>
) : (
<SidebarMenuItem key={item.title}>
<SidebarMenuButton tooltip={item.title} asChild>
<Link href={item.url}>
{item.icon && <item.icon />}
<span>{item.title}</span>
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
)
))}
</SidebarMenu>
</SidebarGroup>
)
}