-
Notifications
You must be signed in to change notification settings - Fork 990
/
Copy pathapp.component.tsx
74 lines (67 loc) · 2.84 KB
/
app.component.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
import React from 'react';
import { AppearanceProvider } from 'react-native-appearance';
import * as eva from '@eva-design/eva';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { ApplicationProvider, IconRegistry } from '@ui-kitten/components';
import { EvaIconsPack } from '@ui-kitten/eva-icons';
import { AppLoading, LoadFontsTask, Task } from './app-loading.component';
import { appMappings, appThemes } from './app-theming';
import { AppIconsPack } from './app-icons-pack';
import { StatusBar } from '../components/status-bar.component';
import { SplashImage } from '../components/splash-image.component';
import { AppNavigator } from '../navigation/app.navigator';
import { AppStorage } from '../services/app-storage.service';
import { Mapping, Theme, Theming } from '../services/theme.service';
const loadingTasks: Task[] = [
// Should be used it when running Expo.
// In Bare RN Project this is configured by react-native.config.js
() => LoadFontsTask({
'OpenSans-Regular': require('../assets/fonts/OpenSans-Regular.ttf'),
'OpenSans-SemiBold': require('../assets/fonts/OpenSans-SemiBold.ttf'),
'OpenSans-Bold': require('../assets/fonts/OpenSans-Bold.ttf'),
'Roboto-Regular': require('../assets/fonts/Roboto-Regular.ttf'),
'Roboto-Medium': require('../assets/fonts/Roboto-Medium.ttf'),
'Roboto-Bold': require('../assets/fonts/Roboto-Bold.ttf'),
}),
() => AppStorage.getMapping(defaultConfig.mapping).then(result => ['mapping', result]),
() => AppStorage.getTheme(defaultConfig.theme).then(result => ['theme', result]),
];
const defaultConfig: { mapping: Mapping, theme: Theme } = {
mapping: 'eva',
theme: 'light',
};
const App = ({ mapping, theme }): React.ReactElement => {
const [mappingContext, currentMapping] = Theming.useMapping(appMappings, mapping);
const [themeContext, currentTheme] = Theming.useTheming(appThemes, mapping, theme);
return (
<React.Fragment>
<IconRegistry icons={[EvaIconsPack, AppIconsPack]}/>
<AppearanceProvider>
<ApplicationProvider {...eva} {...currentMapping} theme={currentTheme}>
<Theming.MappingContext.Provider value={mappingContext}>
<Theming.ThemeContext.Provider value={themeContext}>
<SafeAreaProvider>
<StatusBar/>
<AppNavigator/>
</SafeAreaProvider>
</Theming.ThemeContext.Provider>
</Theming.MappingContext.Provider>
</ApplicationProvider>
</AppearanceProvider>
</React.Fragment>
);
};
const Splash = ({ loading }): React.ReactElement => (
<SplashImage
loading={loading}
source={require('../assets/images/image-splash.png')}
/>
);
export default (): React.ReactElement => (
<AppLoading
tasks={loadingTasks}
initialConfig={defaultConfig}
placeholder={Splash}>
{props => <App {...props}/>}
</AppLoading>
);