import { RawParams, useCurrentStateAndParams } from '@uirouter/react'; import clsx from 'clsx'; import { ReactNode } from 'react'; import { Icon } from '@@/Icon'; import { Link } from '@@/Link'; export interface Tab { name: ReactNode; icon?: ReactNode; widget: ReactNode; selectedTabParam: string; } interface Props { currentTabIndex: number; tabs: Tab[]; useContainer?: boolean; ariaLabel?: string; } export function WidgetTabs({ currentTabIndex, tabs, useContainer = true, ariaLabel = 'Section navigation', }: Props) { // ensure that the selectedTab param is always valid const invalidQueryParamValue = tabs.some( (tab) => encodeURIComponent(tab.selectedTabParam) !== tab.selectedTabParam ); if (invalidQueryParamValue) { throw new Error('Invalid query param value for tab'); } const tabsComponent = ( ); if (useContainer) { return (
{tabsComponent}
); } return tabsComponent; } // findSelectedTabIndex returns the index of the tab, or 0 if none is selected export function findSelectedTabIndex(params: RawParams, tabs: Tab[]) { const selectedTabParam = params.tab || tabs[0].selectedTabParam; const currentTabIndex = tabs.findIndex( (tab) => tab.selectedTabParam === selectedTabParam ); if (currentTabIndex === -1) { return 0; } return currentTabIndex; } export function useCurrentTabIndex(tabs: Tab[]) { const params = useCurrentStateAndParams(); const currentTabIndex = findSelectedTabIndex(params.params, tabs); return currentTabIndex; }