"use client"; import { usePathname } from "next/navigation"; import { useTranslations } from "next-intl"; import Link from "@/components/link"; import { cn } from "@/lib/utils"; export interface AdminTab { href: string; label: string; /** Extra prefixes that count as active for this tab (detail routes). */ match?: string[]; /** Optional group id for multi-row strips (e.g. Radio primary/tools). */ group?: string; } function matchLength(pathname: string, prefix: string): number { if (pathname === prefix) return prefix.length + 1; // prefer exact if (pathname.startsWith(`${prefix}/`)) return prefix.length; return -1; } function TabRow({ tabs, bestIndex, globalOffset, label, }: { tabs: AdminTab[]; bestIndex: number; globalOffset: number; label?: string; }) { return (
{label ? (
{label}
) : null}
); } export function AdminSectionTabs({ tabs }: { tabs: AdminTab[] }) { const pathname = usePathname() ?? ""; const t = useTranslations("pages.admin.hubs"); let bestIndex = -1; let bestScore = -1; tabs.forEach((tab, index) => { const prefixes = tab.match ?? [tab.href]; for (const prefix of prefixes) { const score = matchLength(pathname, prefix); if (score > bestScore) { bestScore = score; bestIndex = index; } } }); const hasGroups = tabs.some((t) => t.group); if (!hasGroups) { return ; } const order: string[] = []; for (const tab of tabs) { const g = tab.group ?? "primary"; if (!order.includes(g)) order.push(g); } let offset = 0; return (
{order.map((groupId) => { const groupTabs = tabs.filter( (tab) => (tab.group ?? "primary") === groupId, ); const rowOffset = offset; offset += groupTabs.length; const label = groupId === "tools" ? t("tabs.toolsGroup") : undefined; return ( ); })}
); }