import React, { useContext, useEffect, useRef, useState } from 'react'; import { SafeAreaProvider, useSafeAreaInsets, } from 'react-native-safe-area-context'; import { NavigationContainer as ReactNavigationContainer, NavigationIndependentTree, } from '@react-navigation/native'; import { createStackNavigator, StackNavigationOptions, TransitionPresets, } from '@react-navigation/stack'; import { DeviceEventEmitter } from 'react-native'; import StackScreen from './StackScreen'; import ModalScreen from './ModalScreen'; import Navigator from './Navigator'; import { getModalOptions, getStackOptions } from './utils'; import { NavigationContainerProps } from './types'; import { ApplicationContext, MiniAppContext } from '../Context'; import Localize from './Localize'; import { Colors, defaultTheme } from '../Consts'; import { HeaderLeft } from './Components/HeaderLeft'; import { HeaderRight } from './Components/HeaderRight'; import { HeaderTitle } from './Components/HeaderTitle'; import { HeaderBackground } from './Components/HeaderBackground'; const Stack = createStackNavigator(); const NavigationContainer: React.FC = ({ screen, theme = defaultTheme, options, maxApi, initialParams, localize = new Localize({ vi: {}, en: {} }), features = { enableBottomTabAnimation: true, enableHapticDialog: true, enableForceFoundationList: false, enableHapticBottomTab: true, }, }) => { const context = useContext(MiniAppContext); const [currentContext, setCurrentContext] = useState({}); return ( ); }; const Navigation: React.FC = ({ screen, theme = defaultTheme, options, maxApi, initialParams, setCurrentContext, localize = new Localize({ vi: {}, en: {} }), }) => { const context = useContext(MiniAppContext); const navigationRef = useRef(null); const isReady = useRef(false); const navigator = useRef(new Navigator(navigationRef, isReady)); const [showGrid, setShowGrid] = useState(false); const insets = useSafeAreaInsets(); let headerBackground = context?.designSystemConfig?.config?.headerBar; let headerGradient = theme.colors?.gradient; if (theme.assets?.headerBackground) { headerBackground = theme.assets?.headerBackground; } if (context?.designSystemConfig?.config?.headerGradient) { headerGradient = context?.designSystemConfig?.config?.headerGradient; } /** * inject data for navigator */ navigator.current.maxApi = maxApi; /** * handle mini language & listen change * engine only shake to enable grid view */ useEffect(() => { const subscription = DeviceEventEmitter.addListener( 'onChangeGrid', enable => { setShowGrid(!!enable); }, ); return () => { subscription?.remove?.(); }; }, []); /** * translate context method * @param data */ const translate = (data?: string | { vi: string; en: string }) => { if (data && typeof data !== 'string') { return localize?.translateData(data); } return localize?.translate(data as string); }; navigator.current.setCurrentContext = setCurrentContext; return ( { isReady.current = true; }} > , presentation: 'transparentModal', gestureEnabled: false, cardStyle: { backgroundColor: theme.colors.background.default, }, headerLeft: (props: any) => , headerBackground: (props: any) => ( ), headerRight: (props: any) => , headerTintColor: Colors.black_17, ...TransitionPresets.ModalTransition, }} initialParams={{ screen }} /> ); }; export { ApplicationContext, NavigationContainer };