import { Link, useMatches, type UIMatch } from "react-router"; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "~/client/components/ui/breadcrumb"; export interface BreadcrumbItemData { label: string; href?: string; } interface RouteHandle { breadcrumb?: (match: UIMatch) => BreadcrumbItemData[] | null; } export function AppBreadcrumb() { const matches = useMatches(); // Find the last match with a breadcrumb handler const lastMatchWithBreadcrumb = [...matches].reverse().find((match) => { const handle = match.handle as RouteHandle | undefined; return handle?.breadcrumb; }); if (!lastMatchWithBreadcrumb) { return null; } const handle = lastMatchWithBreadcrumb.handle as RouteHandle; const breadcrumbs = handle.breadcrumb?.(lastMatchWithBreadcrumb); if (!breadcrumbs || breadcrumbs.length === 0) { return null; } return ( {breadcrumbs.map((breadcrumb, index) => { const isLast = index === breadcrumbs.length - 1; return (
{isLast || !breadcrumb.href ? ( {breadcrumb.label} ) : ( {breadcrumb.label} )} {!isLast && }
); })}
); }