-
Notifications
You must be signed in to change notification settings - Fork 0
/
App.tsx
111 lines (99 loc) · 3.3 KB
/
App.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import "@expo/metro-runtime";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { NavigationContainer } from "@react-navigation/native";
import { StatusBar } from "expo-status-bar";
import "intl-pluralrules";
import { useContext, useEffect, useState } from "react";
import {
ActivityIndicator,
Linking,
Platform,
StyleSheet,
View,
} from "react-native";
import "react-native-gesture-handler";
import { PaperProvider } from "react-native-paper";
import "react-native-reanimated";
import { SafeAreaProvider } from "react-native-safe-area-context";
import { AppNavigation } from "@common/AppNavigation";
import { UsecasesContext } from "@common/UsecasesContext";
import { AppTheme } from "./AppTheme";
import "./logger.config";
import "./src/view/translations/i18n";
// NB : plausible removed because of Android build error:
// ReferenceError: Property 'history' doesn't exist, js engine: hermes
// import { plausible } from "./plausible";
const PERSISTENCE_KEY = "NAVIGATION_STATE_V1";
const App = () => {
const [isReady, setIsReady] = useState(!__DEV__);
const [initialState, setInitialState] = useState();
const { useUpdateActions } = useContext(UsecasesContext);
const { updateActions } = useUpdateActions();
useEffect(() => {
const restoreState = async () => {
try {
const initialUrl = await Linking.getInitialURL();
if (__DEV__ || (Platform.OS !== "web" && initialUrl == null)) {
// Only restore state if there's no deep link and we're not on web
const savedStateString = await AsyncStorage.getItem(PERSISTENCE_KEY);
const state = savedStateString
? JSON.parse(savedStateString)
: undefined;
if (state !== undefined) setInitialState(state);
}
} finally {
setIsReady(true);
}
};
if (!isReady) {
restoreState();
updateActions();
}
}, [isReady]);
if (!isReady) return <ActivityIndicator />;
return (
<SafeAreaProvider>
<StatusBar style="light" />
<PaperProvider theme={AppTheme}>
<NavigationContainer
theme={AppTheme}
initialState={initialState}
onStateChange={(state) => {
AsyncStorage.setItem(PERSISTENCE_KEY, JSON.stringify(state));
// const route = state?.routes[state.index];
// if (route === undefined) return;
// NB : plausible removed because of Android build error (cf. top of file)
// if (route.state && route.state.index !== undefined) {
// const subroute = route.state.routes[route.state.index];
// plausible.trackEvent("Navigation", {
// props: { page: subroute.name },
// });
// } else {
// plausible.trackEvent("Navigation", {
// props: { page: route.name },
// });
// }
}}
>
<View style={styles.container}>
<View style={styles.content}>
<AppNavigation />
</View>
</View>
</NavigationContainer>
</PaperProvider>
</SafeAreaProvider>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: "center",
},
content: {
flex: 1,
width: "100%",
maxWidth: 1024,
},
});
export default App;