"use client"; import React from "react"; import Link from "next/link"; import { useParams, usePathname } from "next/navigation"; import { cn } from "@app/lib/cn"; import { useUserContext } from "@app/hooks/useUserContext"; import { Badge } from "@app/components/ui/badge"; import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; import { useTranslations } from "next-intl"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@app/components/ui/tooltip"; export type SidebarNavItem = { href: string; title: string; icon?: React.ReactNode; showProfessional?: boolean; }; export type SidebarNavSection = { heading: string; items: SidebarNavItem[]; }; export interface SidebarNavProps extends React.HTMLAttributes { sections: SidebarNavSection[]; disabled?: boolean; onItemClick?: () => void; isCollapsed?: boolean; } export function SidebarNav({ className, sections, disabled = false, onItemClick, isCollapsed = false, ...props }: SidebarNavProps) { const pathname = usePathname(); const params = useParams(); const orgId = params.orgId as string; const niceId = params.niceId as string; const resourceId = params.resourceId as string; const userId = params.userId as string; const apiKeyId = params.apiKeyId as string; const clientId = params.clientId as string; const { licenseStatus, isUnlocked } = useLicenseStatusContext(); const { user } = useUserContext(); const t = useTranslations(); function hydrateHref(val: string): string { return val .replace("{orgId}", orgId) .replace("{niceId}", niceId) .replace("{resourceId}", resourceId) .replace("{userId}", userId) .replace("{apiKeyId}", apiKeyId) .replace("{clientId}", clientId); } const renderNavItem = ( item: SidebarNavItem, hydratedHref: string, isActive: boolean, isDisabled: boolean ) => { const tooltipText = item.showProfessional && !isUnlocked() ? `${t(item.title)} (${t("licenseBadge")})` : t(item.title); const itemContent = ( { if (isDisabled) { e.preventDefault(); } else if (onItemClick) { onItemClick(); } }} tabIndex={isDisabled ? -1 : undefined} aria-disabled={isDisabled} > {item.icon && ( {item.icon} )} {!isCollapsed && ( <> {t(item.title)} {item.showProfessional && !isUnlocked() && ( {t("licenseBadge")} )} )} ); if (isCollapsed) { return ( {itemContent}

{tooltipText}

); } return ( {itemContent} ); }; return ( ); }