-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathApp.tsx
114 lines (99 loc) · 3.38 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
112
113
114
import React, { FunctionComponent, useState, useEffect } from "react"
import "array-flat-polyfill"
import env from "react-native-config"
import SplashScreen from "react-native-splash-screen"
import FlashMessage from "react-native-flash-message"
import Matomo from "react-native-matomo-sdk"
import MainNavigator from "./src/navigation/MainNavigator"
import { ErrorBoundary } from "./src/ErrorBoundaries"
import { ExposureProvider } from "./src/ExposureContext"
import {
OnboardingProvider,
determineIsOnboardingComplete,
} from "./src/OnboardingContext"
import { ConfigurationProvider } from "./src/ConfigurationContext"
import { PermissionsProvider } from "./src/Device/PermissionsContext"
import { initializei18next, loadUserLocale } from "./src/locales/languages"
import Logger from "./src/logger"
import {
ProductAnalyticsClient,
ProductAnalyticsProvider,
} from "./src/ProductAnalytics/Context"
import { SymptomHistoryProvider } from "./src/SymptomHistory/SymptomHistoryContext"
import { CovidDataContextProvider } from "./src/CovidData/Context"
Logger.start()
const App: FunctionComponent = () => {
const [isLoading, setIsLoading] = useState(true)
const [isOnboardingComplete, setIsOnboardingComplete] = useState(true)
useEffect(() => {
initializei18next()
loadUserLocale()
determineIsOnboardingComplete()
.then((result) => {
setIsOnboardingComplete(result)
})
.finally(() => {
setIsLoading(false)
SplashScreen.hide()
})
}, [])
const initializeMatomo = () => {
const matomoUrl = env.MATOMO_URL
const matomoSiteId = parseInt(env.MATOMO_SITE_ID)
const isValid = (siteUrl: string, siteId: number) => {
return siteUrl && !isNaN(siteId)
}
if (isValid(matomoUrl, matomoSiteId)) {
Matomo.initialize(matomoUrl, matomoSiteId)
return Matomo
} else {
throw new Error("Must provide valid url and site id for Matomo SDK")
}
}
const initializeProductAnalytics = () => {
const displayAnalytics = env.ENABLE_PRODUCT_ANALYTICS === "true"
const nullClient = {
trackEvent: async (_category: string, _action: string) => {},
trackView: async (_routes: string[]) => {},
}
if (displayAnalytics) {
const client = initializeMatomo()
return {
trackEvent: client.trackEvent,
trackView: client.trackView,
}
} else {
return nullClient
}
}
const productAnalyticsClient: ProductAnalyticsClient = initializeProductAnalytics()
return (
<>
{!isLoading ? (
<ErrorBoundary>
<ConfigurationProvider>
<OnboardingProvider
userHasCompletedOnboarding={isOnboardingComplete}
>
<ProductAnalyticsProvider
productAnalyticsClient={productAnalyticsClient}
>
<ExposureProvider>
<PermissionsProvider>
<SymptomHistoryProvider>
<CovidDataContextProvider>
<MainNavigator />
<FlashMessage />
</CovidDataContextProvider>
</SymptomHistoryProvider>
</PermissionsProvider>
</ExposureProvider>
</ProductAnalyticsProvider>
</OnboardingProvider>
</ConfigurationProvider>
</ErrorBoundary>
) : null}
</>
)
}
export default App