import { useState, memo, useMemo } from "react"; import { PressableHover } from "@showtime-xyz/universal.pressable-hover"; import { Text } from "@showtime-xyz/universal.text"; import { View } from "@showtime-xyz/universal.view"; import { Route } from "./"; type IndependentTabBarProps = { routes: Route[]; index: number; onPress?: (index: number) => void; tw?: string; disableScrollableBar?: boolean; }; const PADDING_X = 16; const getTextColor = (isFocus: boolean) => isFocus ? "text-black dark:text-white" : "text-gray-600 dark:text-gray-400"; export const TabBarSingle = memo( function IndependentTabBarProps({ routes, index: propIndex, onPress, tw = "", disableScrollableBar = false, }) { const [tabsWidth, setTabsWidth] = useState<{ [index: number]: number; }>({}); const outputRange = useMemo( () => routes.reduce((acc, _, i) => { if (i === 0) return [PADDING_X]; return [...acc, acc[i - 1] + tabsWidth[i - 1] + PADDING_X * 2]; }, []), [routes, tabsWidth] ); return ( {routes.map((item, index) => ( onPress?.(index)} style={{ paddingHorizontal: PADDING_X, }} key={item.key} tw={disableScrollableBar ? "flex-1" : ""} > { const tabs = Object.assign(tabsWidth, { [index]: width, }); if (Object.keys(tabsWidth).length === routes.length) { setTabsWidth({ ...tabs }); } }} tw={["py-4", disableScrollableBar ? "items-center" : ""]} > {item.title} {Boolean(item.subtitle) && ( {` ${item.subtitle}`} )} ))} ); } );