100 lines
2.4 KiB
TypeScript
100 lines
2.4 KiB
TypeScript
'use client'
|
|
|
|
import {
|
|
SidebarGroup,
|
|
SidebarGroupContent,
|
|
SidebarGroupLabel,
|
|
SidebarMenu,
|
|
SidebarMenuButton,
|
|
SidebarMenuItem,
|
|
useSidebar
|
|
} from '@repo/ui/components/ui/sidebar'
|
|
import { useIsMobile } from '@repo/ui/hooks/use-mobile'
|
|
|
|
import { type LucideIcon } from 'lucide-react'
|
|
import { NavLink, useParams } from 'react-router'
|
|
|
|
type NavItem = {
|
|
title: string
|
|
url: string
|
|
icon?: LucideIcon
|
|
}
|
|
|
|
export function NavMain({
|
|
data
|
|
}: {
|
|
data: {
|
|
navMain: NavItem[]
|
|
navUser: NavItem[]
|
|
navEnrollment: NavItem[]
|
|
}
|
|
}) {
|
|
return (
|
|
<>
|
|
<SidebarGroup>
|
|
<SidebarGroupContent>
|
|
<SidebarMenu>
|
|
{data.navMain.map((props, idx) => (
|
|
<SidebarMenuItemLink key={idx} {...props} />
|
|
))}
|
|
</SidebarMenu>
|
|
</SidebarGroupContent>
|
|
</SidebarGroup>
|
|
|
|
<SidebarGroup>
|
|
<SidebarGroupContent>
|
|
<SidebarMenu>
|
|
<SidebarGroupLabel className="uppercase">
|
|
Colaboradores
|
|
</SidebarGroupLabel>
|
|
{data.navUser.map((props, idx) => (
|
|
<SidebarMenuItemLink key={idx} {...props} />
|
|
))}
|
|
</SidebarMenu>
|
|
</SidebarGroupContent>
|
|
</SidebarGroup>
|
|
|
|
<SidebarGroup>
|
|
<SidebarGroupContent>
|
|
<SidebarMenu>
|
|
<SidebarGroupLabel className="uppercase">
|
|
Gestão de matrículas
|
|
</SidebarGroupLabel>
|
|
{data.navEnrollment.map((props, idx) => (
|
|
<SidebarMenuItemLink key={idx} {...props} />
|
|
))}
|
|
</SidebarMenu>
|
|
</SidebarGroupContent>
|
|
</SidebarGroup>
|
|
</>
|
|
)
|
|
}
|
|
|
|
function SidebarMenuItemLink({ title, url, icon: Icon }: NavItem) {
|
|
const { orgid } = useParams()
|
|
const { toggleSidebar } = useSidebar()
|
|
const isMobile = useIsMobile()
|
|
|
|
const onToggle = () => (isMobile ? toggleSidebar() : null)
|
|
|
|
return (
|
|
<SidebarMenuItem key={title} onClick={onToggle}>
|
|
<NavLink to={`/${orgid}${url}`}>
|
|
{({ isActive, isPending }) => (
|
|
<SidebarMenuButton
|
|
asChild
|
|
className="data-[active=true]:text-lime-500"
|
|
isActive={isActive}
|
|
tooltip={title}
|
|
>
|
|
<span>
|
|
{Icon ? <Icon /> : null}
|
|
<span>{title}</span>
|
|
</span>
|
|
</SidebarMenuButton>
|
|
)}
|
|
</NavLink>
|
|
</SidebarMenuItem>
|
|
)
|
|
}
|