'use client'; import { useSearchParams, useRouter, usePathname } from 'next/navigation'; import { Loader2 } from 'lucide-react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; export interface DetailTab { id: string; label: string; content: React.ReactNode; badge?: string | number; } interface DetailLayoutProps { header: React.ReactNode; tabs: DetailTab[]; defaultTab?: string; isLoading?: boolean; actions?: React.ReactNode; } export function DetailLayout({ header, tabs, defaultTab, isLoading, actions, }: DetailLayoutProps) { const searchParams = useSearchParams(); const router = useRouter(); const pathname = usePathname(); const activeTab = searchParams.get('tab') ?? defaultTab ?? tabs[0]?.id; function handleTabChange(tabId: string) { const params = new URLSearchParams(searchParams.toString()); params.set('tab', tabId); router.replace(`${pathname}?${params.toString()}`, { scroll: false }); } if (isLoading) { return (
); } return (
{header}
{actions &&
{actions}
}
{tabs.map((tab) => ( {tab.label} {tab.badge !== undefined && tab.badge !== null && ( {tab.badge} )} ))} {tabs.map((tab) => ( {tab.content} ))}
); }