summaryrefslogtreecommitdiff
path: root/app_expo/app.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'app_expo/app.tsx')
-rw-r--r--app_expo/app.tsx81
1 files changed, 81 insertions, 0 deletions
diff --git a/app_expo/app.tsx b/app_expo/app.tsx
new file mode 100644
index 0000000..8627efd
--- /dev/null
+++ b/app_expo/app.tsx
@@ -0,0 +1,81 @@
+/**
+ * Welcome to the main entry point of the app. In this file, we'll
+ * be kicking off our app.
+ *
+ * Most of this file is boilerplate and you shouldn't need to modify
+ * it very often. But take some time to look through and understand
+ * what is going on here.
+ *
+ * The app navigation resides in ./app/navigators, so head over there
+ * if you're interested in adding screens and navigators.
+ */
+import './i18n'
+import './utils/ignore-warnings'
+import React, { useState, useEffect, useRef } from 'react'
+import { NavigationContainerRef } from '@react-navigation/native'
+import { SafeAreaProvider, initialWindowMetrics } from 'react-native-safe-area-context'
+import { initFonts } from './theme/fonts' // expo
+import * as storage from './utils/storage'
+import {
+ useBackButtonHandler,
+ RootNavigator,
+ canExit,
+ setRootNavigation,
+ useNavigationPersistence,
+} from './navigators'
+import { RootStore, RootStoreProvider, setupRootStore } from './models'
+import { ToggleStorybook } from '../storybook/toggle-storybook'
+
+// This puts screens in a native ViewController or Activity. If you want fully native
+// stack navigation, use `createNativeStackNavigator` in place of `createStackNavigator`:
+// https://github.com/kmagiera/react-native-screens#using-native-stack-navigator
+import { enableScreens } from 'react-native-screens'
+enableScreens()
+
+export const NAVIGATION_PERSISTENCE_KEY = 'NAVIGATION_STATE'
+
+/**
+ * This is the root component of our app.
+ */
+function App() {
+ const navigationRef = useRef<NavigationContainerRef>(null)
+ const [rootStore, setRootStore] = useState<RootStore | undefined>(undefined)
+
+ setRootNavigation(navigationRef)
+ useBackButtonHandler(navigationRef, canExit)
+ const { initialNavigationState, onNavigationStateChange } = useNavigationPersistence(
+ storage,
+ NAVIGATION_PERSISTENCE_KEY,
+ )
+
+ // Kick off initial async loading actions, like loading fonts and RootStore
+ useEffect(() => {
+ ;(async () => {
+ await initFonts() // expo
+ setupRootStore().then(setRootStore)
+ })()
+ }, [])
+
+ // Before we show the app, we have to wait for our state to be ready.
+ // In the meantime, don't render anything. This will be the background
+ // color set in native by rootView's background color. You can replace
+ // with your own loading component if you wish.
+ if (!rootStore) return null
+
+ // otherwise, we're ready to render the app
+ return (
+ <ToggleStorybook>
+ <RootStoreProvider value={rootStore}>
+ <SafeAreaProvider initialMetrics={initialWindowMetrics}>
+ <RootNavigator
+ ref={navigationRef}
+ initialState={initialNavigationState}
+ onStateChange={onNavigationStateChange}
+ />
+ </SafeAreaProvider>
+ </RootStoreProvider>
+ </ToggleStorybook>
+ )
+}
+
+export default App