import { atom, useAtom } from "jotai"; import React, { useEffect, useMemo } from "react"; import Sticky from "react-stickynode"; export const selectedIndexAtom = atom(-1); const TabList = (props: { children?: React.ReactNode; defaultIndex?: number; parentKey?: string; sticky?: boolean; tabWidth?: string; }) => { const { tabs } = useTab(props.children); const [index, setIndex] = useAtom(selectedIndexAtom); useEffect(() => { props.defaultIndex ? setIndex(props.defaultIndex) : setIndex(0); }, []); return (
    {tabs.map((tab, i) => React.cloneElement(tab, { key: `tab-${i}`, selected: i === index, parentKey: props.parentKey, onClick: () => { setIndex(i); }, tabWidth: props.tabWidth, }) )}
); }; const useTab = (children: React.ReactNode) => { const tabs = useMemo(() => { const tabs: React.ReactElement[] = []; React.Children.toArray(children).map((x) => { if ((x as any).props.__TYPE === "Tab") { tabs.push(x as React.ReactElement); } }); return tabs; }, [children]); return { tabs, }; }; TabList.defaultProps = { __TYPE: "TabList", }; export default TabList;