import * as React from 'react'; import { StatusBar, Platform } from 'react-native'; import { NavigationContainer, DefaultNavigatorOptions, NavigationContainerRef, NavigationAction, NavigationState } from '@react-navigation/native'; import { createStackNavigator, StackNavigationOptions, CardStyleInterpolators, HeaderStyleInterpolators } from '@react-navigation/stack'; import { createBottomTabNavigator,BottomTabNavigationOptions } from '@react-navigation/bottom-tabs'; import { BottomTabNavigationConfig } from '@react-navigation/bottom-tabs/lib/typescript/src/types'; import CaiNiao from '../icon/CaiNiao'; import { ParamList, Config, authorityConfig, loginConfig } from './config'; import { color } from '../constants'; import { getScreenTitle, getHeaderShown } from './utils'; import useCheckToken from './hook'; type NavigatorProp = Omit, 'children'>, 'initialRouteName'>; type TabNavigatorProp = NavigatorProp & BottomTabNavigationConfig; const Stack = createStackNavigator(); const Tab = createBottomTabNavigator(); const Main:React.FC = () => ( { authorityConfig .filter(cfg => cfg.isTab) .map(cfg => ) } ) export interface AppContextProps { forceNavigationUpdate: React.Dispatch; appToken: string; } export const AppContext = React.createContext({ forceNavigationUpdate: () => {}, appToken: '' }); const AppNavigation:React.FC = () => { const [appToken, forceNavigationUpdate] = useCheckToken(); return ( { appToken ? <> { authorityConfig .filter(cfg => !cfg.isTab) .map(cfg => ) } : } ) } const navigationRef:React.RefObject = React.createRef(); export function navigate(name:string, params?: any) { navigationRef.current?.navigate(name, params); } export function goBack() { navigationRef.current?.goBack(); } export function navigationDispatch(action:NavigationAction | ((state: NavigationState) => NavigationAction)) { return navigationRef.current?.dispatch(action) } const authorityContainerConfig:Config = { name: 'Main', key: 'Main', component: Main, options({route}) { return { headerTitle: getScreenTitle(route), headerShown: getHeaderShown(route), headerStatusBarHeight: Platform.OS === 'android' ? 0 : StatusBar.currentHeight, cardStyleInterpolator: CardStyleInterpolators.forVerticalIOS } } }; const defaultStackProps:NavigatorProp = { screenOptions: { cardStyleInterpolator: CardStyleInterpolators.forHorizontalIOS, headerStyleInterpolator: HeaderStyleInterpolators.forSlideLeft, headerStyle: { backgroundColor: color.brandColor, height: 44 }, headerTintColor: color.tintColor, headerTitleAlign: 'center' } }; const iconNameMap:{[key: string]: Array} = { 'InspectContainer': ['jiankongshexiangtou-xianxing', 'jiankongshexiangtou'], 'History': ['danju-xianxing', 'danju'], 'Account': ['yonghu-xianxing', 'yonghu'] } const defaultTabProps:TabNavigatorProp = { tabBarOptions: { style: { elevation:0, borderTopColor:color.borderColorBase, paddingBottom:2 }, labelStyle: { marginTop:-4 }, activeTintColor: color.brandColor, inactiveTintColor: '#cecece', safeAreaInsets: Platform.OS === 'android' ? { bottom: 0 } : {} }, screenOptions({ route }:any) { return { tabBarIcon({ focused, color, size }:any) { return } } } }; export default AppNavigation;