'use client'; import Link from 'next/link'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { type ReactNode, useCallback, useMemo } from 'react'; import type { LucideIcon } from 'lucide-react'; import { ArrowLeft } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { Button } from '@/components/ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { cn } from '@/lib/utils'; import { NodeKpiCard } from './node-detail-primitives'; import { NodeStatusBadge } from './node-status-badge'; import type { StatusTone } from './node-utils'; export type NodeDetailTabId = 'overview' | 'manage'; export type NodeDetailTabConfig = { id: NodeDetailTabId; label: string; icon?: LucideIcon; }; export type NodeDetailKpi = { label: string; value: ReactNode; icon?: LucideIcon; }; const TAB_IDS: NodeDetailTabId[] = ['overview', 'manage']; function resolveTab(value: string | null): NodeDetailTabId | null { if (value === 'overview' || value === 'dashboard') { return 'overview'; } if (value === 'manage') { return 'manage'; } return null; } export function NodeDetailShell({ title, typeLabel, typeTone = 'info', statusBadges, actions, kpis, overview, manage, defaultTab = 'overview', }: { title: string; typeLabel: string; typeTone?: StatusTone; statusBadges: Array<{ label: string; tone: StatusTone }>; actions: ReactNode; kpis: NodeDetailKpi[]; overview: ReactNode; manage: ReactNode; defaultTab?: NodeDetailTabId; }) { const t = useTranslations('nodes'); const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const activeTab = useMemo(() => { const tab = searchParams.get('tab'); return resolveTab(tab) ?? defaultTab; }, [defaultTab, searchParams]); const setActiveTab = useCallback( (tab: NodeDetailTabId) => { const params = new URLSearchParams(searchParams.toString()); params.set('tab', tab); router.replace(`${pathname}?${params.toString()}`, { scroll: false }); }, [pathname, router, searchParams], ); const handleTabChange = useCallback( (value: string) => { const tab = resolveTab(value); if (tab) { setActiveTab(tab); } }, [setActiveTab], ); return (