-
Notifications
You must be signed in to change notification settings - Fork 1
/
App.tsx
95 lines (85 loc) · 3.65 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
// region polyfill need Intl (because of android does not support it and iOS is missing plural function)
import '@formatjs/intl-getcanonicallocales/polyfill';
import '@formatjs/intl-locale/polyfill';
// polyfull for plural rules
import '@formatjs/intl-pluralrules/polyfill';
import '@formatjs/intl-pluralrules/locale-data/en'; // locale-data for en
import '@formatjs/intl-pluralrules/locale-data/nl'; // locale-data for nl
// polyfill for android to numberformat
import '@formatjs/intl-numberformat/polyfill';
import '@formatjs/intl-numberformat/locale-data/en'; // locale-data for en
import '@formatjs/intl-numberformat/locale-data/nl'; // locale-data for nl
// endregion
import 'core-js/stable/atob';
import './src/i18n/i18n.config';
import { ActionSheetProvider } from '@expo/react-native-action-sheet';
import { defaultTheme, Provider } from '@react-native-material/core';
import * as Sentry from '@sentry/react-native';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { addMinutes } from 'date-fns/addMinutes';
import type React from 'react';
import { useEffect } from 'react';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { SettingsProvider } from '@/store/SettingsStore';
import { REFRESH_GET_BEFORE_IN_MINUTES } from './src/api/ApiService';
import { ToastProvider } from './src/components/Toast/ToastProvider';
import Screens from './src/Screens';
import { LoginScreen } from './src/screens/LoginScreen';
import { useApiStore } from './src/store/ApiStore';
import { colors } from './src/theme';
import { globalDisableConsoleForProductionAndStaging } from './src/utils/disableConsoles';
import { inDevelopment } from './src/utils/inDevelopment';
const queryClient = new QueryClient();
// init sentry
Sentry.init({
debug: inDevelopment(),
dsn: 'https://[email protected]/25',
});
// noinspection JSUnusedGlobalSymbols
export const App: React.FC = () => {
const hasRefreshToken = useApiStore((state) => state.hasRefreshToken);
const refreshTokenValidUntil = useApiStore((state) => state.refreshTokenValidUntil);
const getNewRefreshToken = useApiStore((state) => state.getNewRefreshToken);
// region console
useEffect(() => {
globalDisableConsoleForProductionAndStaging();
}, []);
// endregion
useEffect(() => {
if (hasRefreshToken && refreshTokenValidUntil !== undefined) {
const refreshTokenTime = addMinutes(refreshTokenValidUntil, REFRESH_GET_BEFORE_IN_MINUTES + 2).getTime();
const duration = refreshTokenTime - new Date().getTime();
if (duration < 0) {
// refresh token is already expired! (should clear the store and show the login page)
getNewRefreshToken();
return;
}
// create a timer so that te
const timer = setTimeout(() => getNewRefreshToken(), duration);
return () => clearTimeout(timer);
}
}, [getNewRefreshToken, hasRefreshToken, refreshTokenValidUntil]);
return (
<QueryClientProvider client={queryClient}>
<SafeAreaProvider>
{/* @ts-ignore gives error that children is not set. But that is because it builds for React 17 */}
<Provider
theme={{
...defaultTheme,
palette: {
...defaultTheme.palette,
primary: { main: colors.primary, on: 'white' },
},
}}
>
<SettingsProvider>
<ToastProvider>
<ActionSheetProvider>{!hasRefreshToken ? <LoginScreen /> : <Screens />}</ActionSheetProvider>
</ToastProvider>
</SettingsProvider>
</Provider>
</SafeAreaProvider>
</QueryClientProvider>
);
};
export default App;