import { createBottomTabNavigator } from '@react-navigation/bottom-tabs' import { getFocusedRouteNameFromRoute, RouteProp, useNavigation, useRoute, } from '@react-navigation/native' import { NativeStackNavigationOptions } from '@react-navigation/native-stack' import { StackNavigationProp } from '@react-navigation/stack' import { Icon } from '@ui-kitten/components' import React, { useEffect } from 'react' import { StyleProp, TextProps } from 'react-native' import { defaultStackStyling } from '../design/navigationThemes' import { useFeature } from '../hooks/useFeature' import { studentName } from '../utils/peopleHelpers' import { translate } from '../utils/translation' import { Calendar } from './calendar.component' import { ChildProvider } from './childContext.component' import { Classmates } from './classmates.component' import { Menu } from './menu.component' import { RootStackParamList } from './navigation.component' import { NavigationTitle } from './navigationTitle.component' import { NewsList } from './newsList.component' import { NotificationsList } from './notificationsList.component' import { TabBarLabel } from './tabBarLabel.component' type ChildNavigationProp = StackNavigationProp type ChildRouteProps = RouteProp export type ChildTabParamList = { News: undefined Notifications: undefined Calendar: undefined Menu: undefined Classmates: undefined } interface TabTitleProps { children: string style?: StyleProp } const { Navigator, Screen } = createBottomTabNavigator() const NewsScreen = () => const NotificationsScreen = () => const CalendarScreen = () => const MenuScreen = () => const ClassmatesScreen = () => interface ScreenSettings { NEWS_SCREEN: boolean NOTIFICATIONS_SCREEN: boolean CALENDER_SCREEN: boolean MENU_SCREEN: boolean CLASSMATES_SCREEN: boolean } const TabNavigator = ({ initialRouteName = 'News', screenSettings, }: { initialRouteName?: keyof ChildTabParamList screenSettings: ScreenSettings }) => ( { return { tabBarLabel: ({ focused }) => ( ), tabBarIcon: ({ focused, color }) => { let iconName = 'news' if (route.name === 'News') iconName = focused ? 'book-open' : 'book-open-outline' else if (route.name === 'Notifications') iconName = focused ? 'alert-circle' : 'alert-circle-outline' else if (route.name === 'Calendar') iconName = focused ? 'calendar' : 'calendar-outline' else if (route.name === 'Menu') iconName = focused ? 'clipboard' : 'clipboard-outline' else if (route.name === 'Classmates') iconName = focused ? 'people' : 'people-outline' return }, } }} > {screenSettings.NEWS_SCREEN && ( )} {screenSettings.NOTIFICATIONS_SCREEN && ( )} {screenSettings.CALENDER_SCREEN && ( )} {screenSettings.MENU_SCREEN && ( )} {screenSettings.CLASSMATES_SCREEN && ( )} ) const getHeaderTitle = (route: any) => { const routeName = getFocusedRouteNameFromRoute(route) ?? 'News' return getRouteTitleFromName(routeName) } const getRouteTitleFromName = (routeName: string) => { switch (routeName) { case 'News': return translate('navigation.news') case 'Notifications': return translate('navigation.notifications') case 'Calendar': return translate('navigation.calender') case 'Menu': return translate('navigation.menu') case 'Classmates': return translate('navigation.classmates') default: return '' } } export const childRouteOptions = (darkMode: boolean) => ({ route, }: { route: RouteProp }): NativeStackNavigationOptions => { const { child } = route.params return { ...defaultStackStyling(darkMode), headerTitle: () => ( ), } } export const Child = () => { const route = useRoute() const { child, initialRouteName } = route.params const useFoodMenu = useFeature('FOOD_MENU') const useClassList = useFeature('CLASS_LIST') const navigation = useNavigation() useEffect(() => { navigation.setOptions({ title: getHeaderTitle(route) }) }, [navigation, route]) const screenSettings: ScreenSettings = { NEWS_SCREEN: true, NOTIFICATIONS_SCREEN: true, CALENDER_SCREEN: true, MENU_SCREEN: useFoodMenu, CLASSMATES_SCREEN: useClassList, } return ( ) }