'use client'; import {usePathname} from 'next/navigation'; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; import {Skeleton} from "@/components/ui/skeleton"; import React, {useEffect, useState} from 'react'; import {getBreadcrumbs} from '@/services/navigation/breadcrumb-utils'; import {breadcrumbResolvers} from "@/lib/navigation/breadcrumb-map"; interface ResolvedBreadcrumb { href: string; label: string; isCurrentPage: boolean; } export function DynamicBreadcrumb() { const pathname = usePathname(); const [resolvedBreadcrumbs, setResolvedBreadcrumbs] = useState([]); const [isLoading, setIsLoading] = useState(true); // Get initial segments count for skeleton const pathSegments = pathname.split('/').filter(Boolean); useEffect(() => { const resolveDynamicLabels = async () => { setIsLoading(true); const raw = getBreadcrumbs(pathname); const enhanced = await Promise.all( raw.map(async (b) => { const pathSegments = b.href.split('/').filter(Boolean); const lastSegment = pathSegments[pathSegments.length - 1]; const parentSegment = pathSegments[pathSegments.length - 2]; const isUUID = /^[0-9a-fA-F-]{36}$/.test(lastSegment); const resolve = breadcrumbResolvers[parentSegment]; if (isUUID && resolve) { try { const dynamicLabel = await resolve(lastSegment); return { href: b.href, label: dynamicLabel, isCurrentPage: b.isCurrentPage ?? false, }; } catch { return { href: b.href, label: lastSegment, isCurrentPage: b.isCurrentPage ?? false, }; } } return { href: b.href, label: b.label, isCurrentPage: b.isCurrentPage ?? false, }; }) ); setResolvedBreadcrumbs(enhanced); setIsLoading(false); }; resolveDynamicLabels(); }, [pathname]); if (isLoading) { return ( {/* Always show Home for empty path */} {pathSegments.length > 0 && } {/* Show skeleton for each path segment */} {pathSegments.map((_, index) => ( {index < pathSegments.length - 1 && ( )} ))} ); } return ( {resolvedBreadcrumbs.map((breadcrumb, index) => ( {breadcrumb.isCurrentPage ? ( {breadcrumb.label} ) : ( {breadcrumb.label} )} {index < resolvedBreadcrumbs.length - 1 && ( )} ))} ); }