forked from crater-invoice-inc/crater-mobile
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
96 lines (81 loc) · 2.46 KB
/
index.js
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
import React, {Component, useState, useEffect} from 'react';
import {AppState, LogBox} from 'react-native';
import {Provider} from 'react-redux';
import {PersistGate} from 'redux-persist/integration/react';
import {Appearance, AppearanceProvider} from 'react-native-appearance';
import {ThemeProvider} from 'styled-components/native';
import {SafeAreaProvider} from 'react-native-safe-area-context';
import {store, persistor} from '@/stores';
import {ApplicationNavigator} from './navigation';
import {switchTheme} from './constants';
import {colors, loadFonts} from './styles';
import {darkTheme} from './theme/dark';
import {lightTheme} from './theme/light';
import {FlashMessage, Loading} from '@/components';
console.warn = () => {};
LogBox.ignoreLogs(['Warning: ...']);
LogBox.ignoreAllLogs();
interface IState {
theme: any;
}
class App extends Component<{}, IState> {
constructor(props) {
super(props);
this.state = {theme: null};
}
componentDidMount() {
this.switchCurrentTheme(Appearance.getColorScheme());
AppState?.addEventListener?.('change', this.handleAppStateChange);
}
componentWillUnmount() {
AppState?.removeEventListener?.('change', this.handleAppStateChange);
}
handleAppStateChange = nextAppState => {
try {
if (nextAppState !== 'active') {
return;
}
const newColorScheme = Appearance.getColorScheme();
const oldColorScheme = this.state?.theme?.mode;
newColorScheme !== oldColorScheme &&
this.switchCurrentTheme(newColorScheme);
} catch (e) {}
};
switchCurrentTheme = colorScheme => {
const theme = colorScheme === 'dark' ? darkTheme : lightTheme;
this.setState({theme});
store?.dispatch?.(switchTheme(theme));
};
render() {
const {theme} = this.state;
if (!theme) {
return <Loading color={colors.primaryLight} />;
}
return (
<ThemeProvider theme={theme}>
<SafeAreaProvider>
<FlashMessage position="top" />
<ApplicationNavigator />
</SafeAreaProvider>
</ThemeProvider>
);
}
}
export default () => {
const [fontLoaded, setFontLoaded] = useState(false);
useEffect(() => {
loadFonts(() => setFontLoaded(true));
return () => {};
}, []);
return (
<Provider store={store}>
<PersistGate persistor={persistor}>
{fontLoaded && (
<AppearanceProvider>
<App />
</AppearanceProvider>
)}
</PersistGate>
</Provider>
);
};