"use client"; import { useTranslations } from "next-intl"; import { Fragment, useState } from "react"; import { ChevronDownIcon } from "lucide-react"; import { useIsMobile } from "../../utils"; import { usePageUrlGenerator } from "../../hooks"; import { BreadcrumbItemData } from "../../interfaces"; import { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbList, BreadcrumbSeparator, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Link, Breadcrumb as UIBreadcrumb, } from "../../shadcnui"; type BreadcrumbProps = { items: BreadcrumbItemData[]; rootLabel?: string }; const ITEMS_TO_DISPLAY = 4; function BreadcrumbDesktop({ items, generateUrl, rootLabel, }: { items: BreadcrumbItemData[]; generateUrl: ReturnType; rootLabel: string; }) { const [open, setOpen] = useState(false); return ( {rootLabel} {items.length > 0 && } {items.length > ITEMS_TO_DISPLAY ? ( <> {items[0].href ? ( {items[0].name} ) : ( <>{items[0].name} )} {items.slice(1, -ITEMS_TO_DISPLAY + 2).map((item, index) => ( {item.name} ))} {items.slice(-ITEMS_TO_DISPLAY + 2).map((item, index) => ( {item.href ? ( {item.name} ) : ( <>{item.name} )} {index < items.slice(-ITEMS_TO_DISPLAY + 2).length - 1 && } ))} ) : ( <> {items.map((item, index) => ( {item.href ? ( {item.name} ) : ( <>{item.name} )} {index < items.length - 1 && } ))} )} ); } function BreadcrumbMobile({ items, generateUrl, rootLabel, }: { items: BreadcrumbItemData[]; generateUrl: ReturnType; rootLabel: string; }) { const [open, setOpen] = useState(false); const lastItem = items[items.length - 1]; const allItems = [{ name: rootLabel, href: generateUrl({ page: `/` }) }, ...items]; if (!lastItem && items.length === 0) { return ( {rootLabel} ); } return ( {lastItem?.name} {allItems.map((item, index) => ( {item.href ? ( {item.name} ) : ( <>{item.name} )} ))} ); } export function BreadcrumbNavigation({ items, rootLabel }: BreadcrumbProps) { const generateUrl = usePageUrlGenerator(); const t = useTranslations(); const isMobile = useIsMobile(); const root = rootLabel?.trim() ? rootLabel : t(`common.home`); if (isMobile) { return ; } return ; }