'use client'; import { EllipsisDropdown } from '@/components/blocks/collapsed-breadcrumb/collapsed-breadcrumb-ellipsis'; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { Fragment } from 'react'; interface BreadcrumbsProps { maxVisibleItems?: number; className?: string; hideRoot?: boolean; } interface BreadcrumbItemBase { label: string; href?: string; } type BreadcrumbItemType = BreadcrumbItemBase | (BreadcrumbItemBase & { items: BreadcrumbItemBase[] }); function BreadcrumbItemContent({ item }: { item: BreadcrumbItemType }) { if ('items' in item) { return ; } if (item.href) { return ( {item.label} ); } return {item.label}; } const SPLITTER = /[-_]/; export default function CollapsedBreadcrumbs({ maxVisibleItems = 3, hideRoot = false, className }: BreadcrumbsProps) { const _maxVisibleItems = maxVisibleItems + (hideRoot ? 1 : 0); const pathname = usePathname(); const routeSegments = pathname.split('/').filter(Boolean).slice(0, -1); if (!routeSegments.length) { return null; } const items = routeSegments.map((route, index) => ({ label: route .split(SPLITTER) .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) .join(' '), href: `/${routeSegments.slice(0, index + 1).join('/')}`, })); const visibleItems = items.length <= _maxVisibleItems ? items : [ items[0], { label: '...', items: items.slice(1, -_maxVisibleItems + 1) }, ...items.slice(-_maxVisibleItems + 1), ]; return ( {visibleItems .filter((item) => { if (hideRoot) { return item !== items[0]; } return true; }) .map((item, index) => ( {index > 0 && } ))} ); }