'use client'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { Fragment } from 'react'; import { ChevronRight } from 'lucide-react'; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; import { usePortContext } from '@/providers/port-provider'; // Human-readable labels for route segments const SEGMENT_LABELS: Record = { dashboard: 'Dashboard', clients: 'Clients', interests: 'Interests', berths: 'Berths', documents: 'Documents', files: 'Files', expenses: 'Expenses', invoices: 'Invoices', email: 'Email', reminders: 'Reminders', settings: 'Settings', admin: 'Administration', reports: 'Reports', new: 'New', edit: 'Edit', profile: 'Profile', }; // UUID v4-ish (or any 36-char hex+dash) — used to skip entity-id segments // from the breadcrumbs since the page H1 already shows the entity name. const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; function isIdSegment(segment: string): boolean { return UUID_RE.test(segment); } function formatSegment(segment: string): string { return ( SEGMENT_LABELS[segment] ?? segment.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()) ); } export function Breadcrumbs() { const pathname = usePathname(); const { currentPort, currentPortSlug } = usePortContext(); // Split pathname and filter empty segments const rawSegments = pathname.split('/').filter(Boolean); // Remove the portSlug segment and any UUID-ish entity-id segments — the // page H1 already shows the entity name, no need to leak the raw id. const segments = ( currentPortSlug ? rawSegments.filter((seg) => seg !== currentPortSlug) : rawSegments ).filter((seg) => !isIdSegment(seg)); if (segments.length === 0) { return ( {currentPort?.name ?? 'Port Nimara CRM'} ); } // Build href for each segment const crumbs = segments.map((segment, index) => { const segmentsUpToHere = rawSegments.slice(0, rawSegments.indexOf(segment, index) + 1); const href = '/' + segmentsUpToHere.join('/'); const label = formatSegment(segment); const isLast = index === segments.length - 1; return { label, href, isLast }; }); return ( {currentPort && ( <> {currentPort.name} {crumbs.length > 0 && ( )} )} {crumbs.map((crumb, _index) => ( {crumb.isLast ? ( {crumb.label} ) : ( {crumb.label} )} {!crumb.isLast && ( )} ))} ); }