import cx from 'clsx'; import { isEqual, isNil } from 'lodash-es'; import { useCallback, useEffect, useState } from 'react'; import styles from './Tab.module.css'; type TabOption = { title: string; id: string; }; type TabProps = { tabs: TabOption[]; activeTab?: unknown; onActive?: (id: TabOption['id']) => void; disabled?: Record; }; export function Tab({ tabs = [], activeTab, onActive, disabled }: TabProps) { const [active, setActive] = useState(() => isNil(activeTab) ? 0 : tabs.findIndex((tab) => isEqual(tab.id, activeTab)), ); const handleActivate = useCallback( (index: number) => { if (disabled?.[tabs[index].id] ?? false) return; setActive(index); onActive?.(tabs[index].id); }, [tabs, onActive, disabled], ); useEffect(() => { const activeIndex = tabs.findIndex((tab) => isEqual(tab.id, activeTab)); if (!isNil(activeIndex) && !isEqual(activeIndex, -1) && !isEqual(activeIndex, active)) { setActive(activeIndex); } }, [activeTab]); return (
{tabs.map((tab, index) => (
handleActivate(index)}> {tab.title}
))}
); }