mirror of https://github.com/abpframework/abp
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							102 lines
						
					
					
						
							3.0 KiB
						
					
					
				
			
		
		
	
	
							102 lines
						
					
					
						
							3.0 KiB
						
					
					
				| import { NavigationContainer } from '@react-navigation/native';
 | |
| import { createNativeStackNavigator } from '@react-navigation/native-stack';
 | |
| import i18n from 'i18n-js';
 | |
| import { NativeBaseProvider } from 'native-base';
 | |
| import React, { useEffect, useMemo, useState } from 'react';
 | |
| import { enableScreens } from 'react-native-screens';
 | |
| import { Provider } from 'react-redux';
 | |
| import { PersistGate } from 'redux-persist/integration/react';
 | |
| import { getEnvVars } from './Environment';
 | |
| import Loading from './src/components/Loading/Loading';
 | |
| import { LocalizationContext } from './src/contexts/LocalizationContext';
 | |
| import { initAPIInterceptor } from './src/interceptors/APIInterceptor';
 | |
| import AuthNavigator from './src/navigators/AuthNavigator';
 | |
| import DrawerNavigator from './src/navigators/DrawerNavigator';
 | |
| import { persistor, store } from './src/store';
 | |
| import AppActions from './src/store/actions/AppActions';
 | |
| import PersistentStorageActions from './src/store/actions/PersistentStorageActions';
 | |
| import { createLanguageSelector } from './src/store/selectors/AppSelectors';
 | |
| import { createTokenSelector } from './src/store/selectors/PersistentStorageSelectors';
 | |
| import { connectToRedux } from './src/utils/ReduxConnect';
 | |
| import { isTokenValid } from './src/utils/TokenUtils';
 | |
| 
 | |
| const Stack = createNativeStackNavigator();
 | |
| 
 | |
| const { localization } = getEnvVars();
 | |
| 
 | |
| i18n.defaultSeparator = '::';
 | |
| 
 | |
| const cloneT = i18n.t;
 | |
| i18n.t = (key, ...args) => {
 | |
|   if (key.slice(0, 2) === '::') {
 | |
|     key = localization.defaultResourceName + key;
 | |
|   }
 | |
|   return cloneT(key, ...args);
 | |
| };
 | |
| 
 | |
| enableScreens();
 | |
| initAPIInterceptor(store);
 | |
| 
 | |
| export default function App() {
 | |
|   const language = createLanguageSelector()(store.getState());
 | |
|   const [isReady, setIsReady] = useState(false);
 | |
| 
 | |
|   const localizationContextValue = useMemo(
 | |
|     () => ({
 | |
|       t: i18n.t,
 | |
|       locale: (language || {}).cultureName,
 | |
|     }),
 | |
|     [language]
 | |
|   );
 | |
| 
 | |
|   useEffect(() => {
 | |
|     store.dispatch(
 | |
|       AppActions.fetchAppConfigAsync({
 | |
|         callback: () => setIsReady(true),
 | |
|         showLoading: true,
 | |
|       })
 | |
|     );
 | |
|   }, []);
 | |
| 
 | |
|   return (
 | |
|     <NavigationContainer>
 | |
|       <Provider store={store}>
 | |
|         <PersistGate loading={null} persistor={persistor}>
 | |
|           <NativeBaseProvider>
 | |
|             {isReady ? (
 | |
|               <LocalizationContext.Provider value={localizationContextValue}>
 | |
|                 <ConnectedAppContainer />
 | |
|               </LocalizationContext.Provider>
 | |
|             ) : null}
 | |
|             <Loading />
 | |
|           </NativeBaseProvider>
 | |
|         </PersistGate>
 | |
|       </Provider>
 | |
|     </NavigationContainer>
 | |
|   );
 | |
| }
 | |
| 
 | |
| function AppContainer({token, setToken}) {
 | |
|   const isValid = useMemo(() => isTokenValid(token), [token]);
 | |
| 
 | |
|   useEffect(() => {
 | |
|     if (!isValid && token && token.access_token) {
 | |
|       setToken({})
 | |
|     }
 | |
|   }, [isValid]);
 | |
| 
 | |
| 
 | |
|   return isValid ? <DrawerNavigator /> : <AuthNavigator />
 | |
| }
 | |
| 
 | |
| 
 | |
| const ConnectedAppContainer = connectToRedux({
 | |
|   component: AppContainer,
 | |
|   stateProps: (state) => ({
 | |
|     token: createTokenSelector()(state),
 | |
|   }),
 | |
|   dispatchProps: {
 | |
|     setToken: PersistentStorageActions.setToken,
 | |
|   },
 | |
| });
 |