import React from 'react'; import Box from '../../primitives/Box'; import type { ITabsProps } from './types'; import { useThemeProps } from '../../../hooks'; import { TabsContext } from './Context'; import { Item } from '@react-stately/collections'; import { useTabsState } from '@react-stately/tabs'; import TabViews from './TabViews'; import TabBar from './TabBar'; import { useTabs } from '@react-native-aria/tabs'; import { mergeRefs } from '../../../utils'; const getTabsAndBars = (children: any) => { let bars: any = []; let views: any = []; let items = React.Children.toArray(children); let tabBarProps: any = { props: {}, ref: undefined }; let tabViewsProps = { props: {}, ref: undefined }; items.forEach((item: any) => { if (item.type) { if (item.type.displayName === 'TabBar') { bars = bars.concat(item.props.children); tabBarProps = { props: item.props, ref: item.ref }; } else if (item.type.displayName === 'TabViews') { views = views.concat(item.props.children); tabViewsProps = { props: item.props, ref: item.ref }; } } }); return { views, bars, tabViewsProps, tabBarProps }; }; const convertToCollectionItems = (children: any) => { const { views, bars } = getTabsAndBars(children); return bars.map((bar: any, index: number) => { let textValue; if (bar.props.accessibilityLabel) { textValue = bar.props.accessibilityLabel; } else if (typeof bar.props.children === 'string') { textValue = bar.props.children; } else if (__DEV__) { console.warn('Please pass accessibilityLabel into Tabs.Tab component'); } return ( {views[index]} ); }); }; const Tabs = ({ children, ...props }: ITabsProps, ref: any) => { const { onChange, activeTabStyle, inactiveTabStyle, activeIconProps, inactiveIconProps, tabBarStyle, isFitted, align, ...newProps } = useThemeProps('Tabs', props); // useTabsState needs collection children. const collectionChildren = convertToCollectionItems(children); const { tabBarProps, tabViewsProps } = getTabsAndBars(children); const mappedProps = { children: collectionChildren, defaultSelectedKey: props.defaultIndex !== undefined ? props.defaultIndex.toString() : undefined, selectedKey: props.index !== undefined ? props.index.toString() : undefined, onSelectionChange: (e: any) => onChange && onChange(parseInt(e)), keyboardActivation: props.keyboardActivation, }; // useTabsState needs collection children. let state = useTabsState(mappedProps); const setAlign = () => { switch (align) { case 'start': return 'flex-start'; case 'end': return 'flex-end'; case 'center': return 'center'; default: return 'flex-start'; } }; let tablistRef = React.useRef(); let { tabListProps, tabPanelProps } = useTabs(mappedProps, state, tablistRef); return ( {state.selectedItem && state.selectedItem.props.children} ); }; export default React.memo(React.forwardRef(Tabs));