"use client"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuAction, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, } from "@/components/ui/sidebar"; import { getAvatarSrc } from "@/lib/pagadores/utils"; import { RiArrowRightSLine, RiStackshareLine, type RemixiconComponentType, } from "@remixicon/react"; import Link from "next/link"; import { usePathname, useSearchParams } from "next/navigation"; import * as React from "react"; type NavItem = { title: string; url: string; icon: RemixiconComponentType; isActive?: boolean; items?: { title: string; url: string; avatarUrl?: string | null; isShared?: boolean; key?: string; }[]; }; type NavSection = { title: string; items: NavItem[]; }; export function NavMain({ sections }: { sections: NavSection[] }) { const pathname = usePathname(); const searchParams = useSearchParams(); const periodParam = searchParams.get(MONTH_PERIOD_PARAM); const isLinkActive = React.useCallback( (url: string) => { const normalizedPathname = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname; const normalizedUrl = url.endsWith("/") && url !== "/" ? url.slice(0, -1) : url; // Verifica se é exatamente igual ou se o pathname começa com a URL return ( normalizedPathname === normalizedUrl || normalizedPathname.startsWith(normalizedUrl + "/") ); }, [pathname] ); const buildHrefWithPeriod = React.useCallback( (url: string) => { if (!periodParam) { return url; } const [rawPathname, existingSearch = ""] = url.split("?"); const normalizedPathname = rawPathname.endsWith("/") && rawPathname !== "/" ? rawPathname.slice(0, -1) : rawPathname; if (!PERIOD_AWARE_PATHS.has(normalizedPathname)) { return url; } const params = new URLSearchParams(existingSearch); params.set(MONTH_PERIOD_PARAM, periodParam); const queryString = params.toString(); return queryString ? `${normalizedPathname}?${queryString}` : normalizedPathname; }, [periodParam] ); const activeLinkClasses = "data-[active=true]:bg-dark! shadow-md data-[active=true]:text-dark-foreground! hover:bg-primary/10! hover:text-primary!"; return ( <> {sections.map((section) => ( {section.title} {section.items.map((item) => { const itemIsActive = isLinkActive(item.url); return ( {item.title} {item.items?.length ? ( <> Toggle {item.items?.map((subItem) => { const subItemIsActive = isLinkActive( subItem.url ); const avatarSrc = getAvatarSrc( subItem.avatarUrl ); const initial = subItem.title.charAt(0).toUpperCase() || "?"; return ( {subItem.avatarUrl !== undefined ? ( {initial} ) : null} {subItem.title} {subItem.isShared ? ( ) : null} ); })} ) : null} ); })} ))} ); } const MONTH_PERIOD_PARAM = "periodo"; const PERIOD_AWARE_PATHS = new Set([ "/dashboard", "/lancamentos", "/orcamentos", ]);