import { Accordion } from "@heroui/react"; import type { Key } from "@react-types/shared"; import { useEffect, useMemo, useState } from "react"; import { NavLink, Outlet, useLocation } from "react-router-dom"; import { NETWORK_NAV, type NetworkNavGroupId } from "../../config/networkNav"; import { useI18n } from "../../i18n"; import { prefetchCutoverPages } from "./cutoverPrefetch"; function groupContainsPath(groupId: NetworkNavGroupId, pathname: string): boolean { const group = NETWORK_NAV.find((g) => g.id === groupId); if (!group) return false; return group.items.some( (item) => pathname === item.path || pathname.startsWith(`${item.path}/`), ); } function groupsForPath(pathname: string): Set { const keys = new Set(); for (const g of NETWORK_NAV) { if (groupContainsPath(g.id, pathname)) keys.add(g.id); } return keys; } export function NetworkLayout() { const { t } = useI18n(); const { pathname } = useLocation(); const [expandedKeys, setExpandedKeys] = useState>(() => groupsForPath(pathname)); useEffect(() => { setExpandedKeys((prev) => { const routeKeys = groupsForPath(pathname); if ([...routeKeys].every((k) => prev.has(k))) return prev; const next = new Set(prev); for (const k of routeKeys) next.add(k); return next; }); }, [pathname]); // Warm cutover page chunks as soon as that nav group is open / in use. useEffect(() => { if (pathname.startsWith("/network/cutover") || expandedKeys.has("cutoverCompare")) { prefetchCutoverPages(); } }, [pathname, expandedKeys]); const activeGroupIds = useMemo(() => { const ids = new Set(); for (const g of NETWORK_NAV) { if (groupContainsPath(g.id, pathname)) ids.add(g.id); } return ids; }, [pathname]); return (
); }