import React from "react"; import type { Navigator, NavigatorType, Screen } from "./types"; import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; import { createStackNavigator } from "@react-navigation/stack"; import { createMaterialBottomTabNavigator } from "@react-navigation/material-bottom-tabs"; import ScreenImpl from "./Screen"; import IoniconImpl from "./Ionicon"; const Stack = createStackNavigator(); const BottomTab = createBottomTabNavigator(); const MaterialBottomTab = createMaterialBottomTabNavigator(); const configureScreenOptions = ( route: string, navigatorType: NavigatorType, screens?: Screen[] ) => { switch (navigatorType) { case "stack": return { headerShown: true, }; case "material-bottom-tab": return { tabBarIcon: ({ focused }: { focused: boolean }) => { const screen = screens?.find((screen) => screen.name === route); if (focused && screen?.tabBarFocusedIcon) { return ; } if (screen?.tabBarIcon) { return ; } return null; }, }; case "bottom-tab": return { tabBarIcon: ({ focused }: { focused: boolean }) => { const screen = screens?.find((screen) => screen.name === route); if (focused && screen?.tabBarFocusedIcon) { return ; } if (screen?.tabBarIcon) { return ; } return null; }, headerShown: false, }; default: return {}; } }; const NavigatorImpl: React.FC = (props: Navigator) => { const { navigatorType, screens } = props; const [NavigatorType, setNavigatorType] = React.useState(null); React.useEffect(() => { switch (navigatorType) { case "stack": setNavigatorType(Stack); break; case "bottom-tab": setNavigatorType(BottomTab); break; case "material-bottom-tab": setNavigatorType(MaterialBottomTab); break; default: setNavigatorType(Stack); } }, [navigatorType]); return NavigatorType ? ( { return configureScreenOptions(route.name, navigatorType, screens); }} > {screens?.map((screen, index) => { return ( ); })} ) : null; }; export default NavigatorImpl;