import { Link, useMatches, useRouterState } from '@tanstack/react-router' import { useMemo } from 'react' import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from '@evofw/ui/components/breadcrumb' import { Separator } from '@evofw/ui/components/separator' import { SystemMonitorPopover } from '@/components/layout/system-monitor-popover' import { AppsMenu } from '@/components/layout/apps-menu' import { SidebarTrigger } from '@evofw/ui/components/sidebar' import { navLabel, navParentForDetail } from '@/lib/nav' export interface RouteBreadcrumbLoaderData { breadcrumb?: string } function getBreadcrumbs( pathname: string, dynamicLabels: Record, ) { if (pathname === '/') { return [{ label: navLabel('/') ?? 'Панель управления', href: '/' }] } const parentTo = navParentForDetail(pathname) if (parentTo) { const parentLabel = navLabel(parentTo) const fallback = parentTo === '/agents' ? 'Агент' : parentTo === '/lists' ? 'Список' : 'Набор' return [ { label: parentLabel ?? parentTo, href: parentTo }, { label: dynamicLabels[pathname] ?? fallback, href: pathname }, ] } const title = navLabel(pathname) if (title) { return [{ label: title, href: pathname }] } return [{ label: navLabel('/') ?? 'Панель управления', href: '/' }] } function useDynamicBreadcrumbLabels() { const matches = useMatches() return useMemo(() => { const labels: Record = {} for (const match of matches) { const data = match.loaderData as RouteBreadcrumbLoaderData | undefined if (data?.breadcrumb && match.pathname) { labels[match.pathname] = data.breadcrumb } } return labels }, [matches]) } /** Header chrome — AppsMenu + SystemMonitor; theme in NavUser. */ export function SiteHeader() { const pathname = useRouterState({ select: (s) => s.location.pathname }) const dynamicLabels = useDynamicBreadcrumbLabels() const crumbs = getBreadcrumbs(pathname, dynamicLabels) return (
{crumbs.map((crumb, index) => { const isLast = index === crumbs.length - 1 return ( {index > 0 && ( )} {isLast ? ( {crumb.label} ) : ( }> {crumb.label} )} ) })}
) }