import React, {forwardRef} from 'react' import {Animated, View} from 'react-native' import PagerView, {PagerViewOnPageSelectedEvent} from 'react-native-pager-view' import {s} from 'lib/styles' export type PageSelectedEvent = PagerViewOnPageSelectedEvent const AnimatedPagerView = Animated.createAnimatedComponent(PagerView) export interface PagerRef { setPage: (index: number) => void } export interface RenderTabBarFnProps { selectedPage: number onSelect?: (index: number) => void } export type RenderTabBarFn = (props: RenderTabBarFnProps) => JSX.Element interface Props { tabBarPosition?: 'top' | 'bottom' initialPage?: number renderTabBar: RenderTabBarFn onPageSelected?: (index: number) => void testID?: string } export const Pager = forwardRef>( ( { children, tabBarPosition = 'top', initialPage = 0, renderTabBar, onPageSelected, testID, }: React.PropsWithChildren, ref, ) => { const [selectedPage, setSelectedPage] = React.useState(0) const pagerView = React.useRef() React.useImperativeHandle(ref, () => ({ setPage: (index: number) => pagerView.current?.setPage(index), })) const onPageSelectedInner = React.useCallback( (e: PageSelectedEvent) => { setSelectedPage(e.nativeEvent.position) onPageSelected?.(e.nativeEvent.position) }, [setSelectedPage, onPageSelected], ) const onTabBarSelect = React.useCallback( (index: number) => { pagerView.current?.setPage(index) }, [pagerView], ) return ( {tabBarPosition === 'top' && renderTabBar({ selectedPage, onSelect: onTabBarSelect, })} {children} {tabBarPosition === 'bottom' && renderTabBar({ selectedPage, onSelect: onTabBarSelect, })} ) }, )