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 { ModeToggle } from '@/components/mode-toggle' import { SidebarTrigger } from '@evofw/ui/components/sidebar' export interface RouteBreadcrumbLoaderData { breadcrumb?: string } const routeTitles: Record = { '/': 'Панель управления', '/agents': 'Агенты', '/lists': 'Списки IP', '/rules': 'Правила', '/stats': 'Статистика', '/settings': 'Настройки', } function getBreadcrumbs( pathname: string, dynamicLabels: Record, ) { if (pathname === '/') { return [{ label: 'Панель управления', href: '/' }] } if (pathname.match(/^\/agents\/[^/]+$/)) { return [ { label: 'Агенты', href: '/agents' }, { label: dynamicLabels[pathname] ?? 'Агент', href: pathname }, ] } const title = routeTitles[pathname] if (title) { return [{ label: title, href: pathname }] } return [{ label: 'Панель управления', 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 + ModeToggle (EvoBGP etalon). */ 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} )} ) })}
) }