import { createNavigatorFactory, type NavigatorTypeBagBase, type ParamListBase, StackActions, type StaticConfig, type TabActionHelpers, type TabNavigationState, TabRouter, type TabRouterOptions, type TypedNavigator, useNavigationBuilder, } from '@react-navigation/native'; import * as React from 'react'; import { NativeBottomTabView } from './NativeBottomTabView.native'; import type { NativeBottomTabNavigationEventMap, NativeBottomTabNavigationOptions, NativeBottomTabNavigationProp, NativeBottomTabNavigatorProps, } from './types'; function NativeBottomTabNavigator({ id, initialRouteName, backBehavior, children, layout, screenListeners, screenOptions, screenLayout, UNSTABLE_router, UNSTABLE_routeNamesChangeBehavior, ...rest }: NativeBottomTabNavigatorProps) { const { state, navigation, descriptors, NavigationContent } = useNavigationBuilder< TabNavigationState, TabRouterOptions, TabActionHelpers, NativeBottomTabNavigationOptions, NativeBottomTabNavigationEventMap >(TabRouter, { id, initialRouteName, backBehavior, children, layout, screenListeners, screenOptions, screenLayout, UNSTABLE_router, UNSTABLE_routeNamesChangeBehavior, }); const focusedRouteKey = state.routes[state.index].key; const previousRouteKeyRef = React.useRef(focusedRouteKey); React.useEffect(() => { const previousRouteKey = previousRouteKeyRef.current; if ( previousRouteKey !== focusedRouteKey && descriptors[previousRouteKey]?.options.popToTopOnBlur ) { const prevRoute = state.routes.find( (route) => route.key === previousRouteKey ); if (prevRoute?.state?.type === 'stack' && prevRoute.state.key) { const popToTopAction = { ...StackActions.popToTop(), target: prevRoute.state.key, }; navigation.dispatch(popToTopAction); } } previousRouteKeyRef.current = focusedRouteKey; }, [descriptors, focusedRouteKey, navigation, state.index, state.routes]); return ( ); } export function createNativeBottomTabNavigator< const ParamList extends ParamListBase, const NavigatorID extends string | undefined = string | undefined, const TypeBag extends NavigatorTypeBagBase = { ParamList: ParamList; NavigatorID: NavigatorID; State: TabNavigationState; ScreenOptions: NativeBottomTabNavigationOptions; EventMap: NativeBottomTabNavigationEventMap; NavigationList: { [RouteName in keyof ParamList]: NativeBottomTabNavigationProp< ParamList, RouteName, NavigatorID >; }; Navigator: typeof NativeBottomTabNavigator; }, const Config extends StaticConfig = StaticConfig, >(config?: Config): TypedNavigator { return createNavigatorFactory(NativeBottomTabNavigator)(config); }