-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathApp.tsx
More file actions
79 lines (69 loc) · 2.52 KB
/
App.tsx
File metadata and controls
79 lines (69 loc) · 2.52 KB
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
import 'react-native-gesture-handler';
import { StatusBar } from 'expo-status-bar';
import * as NavigationBar from 'expo-navigation-bar';
import { useCallback, useMemo, useState, useEffect } from 'react';
import { useColorScheme } from 'react-native';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { NavigationContainer } from '@react-navigation/native';
import { Provider as PaperProvider } from 'react-native-paper';
import { enGB, fr, registerTranslation } from 'react-native-paper-dates';
import useCachedResources from '@/hooks/useCachedResources';
import Routes from '@/routes/Routes';
import { AuthProvider } from '@/contexts/AuthContext';
import { PreferencesContext } from './contexts/PreferencesContext';
import { setItem, getItem } from '@/utils/asyncStore';
import themes from '@/themes';
registerTranslation('en', enGB);
registerTranslation('fr', fr);
export default function App() {
const [loaded, error] = useCachedResources();
const colorScheme = useColorScheme();
const [isThemeDark, setIsThemeDark] = useState(false);
const theme = isThemeDark ? themes.dark : themes.light;
useEffect(() => {
getItem('isThemeDark').then((value) => {
if (value) {
setIsThemeDark(JSON.parse(value));
} else {
setIsThemeDark(colorScheme === 'dark');
}
});
}, [colorScheme]);
const toggleTheme = useCallback(async () => {
const value = !isThemeDark;
await setItem('isThemeDark', JSON.stringify(value));
return setIsThemeDark(value);
}, [isThemeDark]);
const preferences = useMemo(
() => ({
toggleTheme,
isThemeDark,
}),
[toggleTheme, isThemeDark],
);
useEffect(() => {
NavigationBar.setButtonStyleAsync(isThemeDark ? 'light' : 'dark');
NavigationBar.setBackgroundColorAsync(theme.paper.colors.surface);
NavigationBar.setVisibilityAsync('hidden');
NavigationBar.setBehaviorAsync('overlay-swipe');
}, [isThemeDark, theme]);
if (!loaded || error) return null;
return (
<SafeAreaProvider>
<AuthProvider>
<PreferencesContext.Provider value={preferences}>
<PaperProvider theme={theme.paper}>
<NavigationContainer theme={theme.navigation}>
<StatusBar
style={isThemeDark ? 'light' : 'dark'}
translucent
backgroundColor="transparent"
/>
<Routes />
</NavigationContainer>
</PaperProvider>
</PreferencesContext.Provider>
</AuthProvider>
</SafeAreaProvider>
);
}