import React, { useCallback, useEffect, useImperativeHandle, useRef, } from "react"; import { NavigationState, SceneRendererProps, TabBar, TabView, TabViewProps, } from "react-native-tab-view"; import { GestureContainer, GestureContainerRef } from "./gesture-container"; import type { CollapsibleHeaderProps, Route, TabViewCustomRenders, } from "./types"; export type CollapsibleTabViewRef = {}; export type CollapsibleTabViewProps = Partial< TabViewProps > & Pick, "onIndexChange" | "navigationState" | "renderScene"> & CollapsibleHeaderProps; export type ForwardTabViewProps = CollapsibleTabViewProps & { forwardedRef: React.ForwardedRef; Component: React.PropsWithRef; }; export function createCollapsibleTabsComponent( Component: React.PropsWithRef ) { return React.forwardRef>( function tabView(props, ref) { return ( ); } ); } function CollapsibleHeaderTabView({ forwardedRef, ...props }: ForwardTabViewProps) { const gestureContainerRef = useRef(null); const initialPageRef = useRef(props.navigationState.index); useEffect(() => { gestureContainerRef.current?.setCurrentIndex(props.navigationState.index); }, [props.navigationState.index]); useImperativeHandle( forwardedRef, () => ({ // Todo: add snapTo tab view content method }), [] ); const renderTabBar = useCallback( ( tabbarProps: SceneRendererProps & { navigationState: NavigationState; } ) => { return props?.renderTabBar ? ( props.renderTabBar(tabbarProps) ) : ( ); }, [props] ); const renderTabView = (e: TabViewCustomRenders) => { const { Component, renderScene, ...restProps } = props; return ( ; } ) => e.renderTabBarContainer(renderTabBar(tabbarProps))} renderScene={(props: any) => e.renderSceneHeader(renderScene(props), props) } /> ); }; return ( //@ts-ignore ); }