import type { ReactNode } from 'react'; import { createContext, useContext, useMemo, useState } from 'react'; type TabId = string | number; interface TabsContextOptions { selectedTabId: T | undefined; selectTab: (id: T) => void; } const TabsContext = createContext(undefined); interface TabsProviderProps { children: ReactNode; defaultSelectedTabId?: T; } export function TabsProvider(props: TabsProviderProps) { const { defaultSelectedTabId, children } = props; const [selectedTabId, setSelectedTabId] = useState( defaultSelectedTabId, ); const tabState = useMemo(() => { return { selectTab: (tabId: any) => tabId !== undefined && setSelectedTabId(tabId), selectedTabId, }; }, [selectedTabId]); return ( {children} ); } export function useTabsController() { const context = useContext(TabsContext); if (!context) { throw new Error('useTabsContext must be used within a TabsProvider'); } return context as unknown as TabsContextOptions; }