-
Notifications
You must be signed in to change notification settings - Fork 1
/
App.js
94 lines (75 loc) · 3.31 KB
/
App.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
import React, {Component} from 'react';
import {
BackHandler,
Alert,
View,
Text,
ActivityIndicator,
NativeModules,
StatusBar,
} from 'react-native';
import { Provider as PaperProvider } from 'react-native-paper';
import FlashMessage, { showMessage } from "react-native-flash-message";
import MainApp from './src/index'
import theme from './src/components/theme'
import RNRestart from 'react-native-restart';
import {setJSExceptionHandler} from 'react-native-exception-handler';
import Utils from './src/logic/Utils';
import styles from './src/components/styles';
NativeModules.ExceptionsManager = null; //hides stupid red screen of death
const errorHandler = (e, isFatal) => {
if (isFatal) {
Alert.alert(
'Unexpected error occurred',
`\n\nOpps! Appologies! Tap here to get rid of it\n\nDetailed account of error:\nName: ${e.name}\nMessage: ${e.message}`,
[{
text: 'Get rid of it',
onPress: () => {
RNRestart.Restart();
}
}],
{ cancelable: false }
);
} else {
console.log(e, 'Non fatal '); // So that we can see it in the ADB logs in case of Android if needed
}
};
setJSExceptionHandler(errorHandler, true);
const backgroundColor = Utils.randomColors.random()
const SplashScreen = <View style={{ backgroundColor: backgroundColor, height: '100%' , width: '100%', ...styles.CENTER }}>
<StatusBar backgroundColor={backgroundColor} />
<Text style={{ ...styles.CENTER, fontSize: 30, color: Utils.randomColors.random()}}>Welcome.</Text>
<Text style={{ ...styles.CENTER, fontSize: 30, color: Utils.randomColors.random()}}>أهلاً و سهلاً</Text>
<Text style={{ ...styles.CENTER, fontSize: 30, color: Utils.randomColors.random()}}> خوش آمديد</Text>
<Text style={{ ...styles.CENTER, fontSize: 30, color: Utils.randomColors.random()}}>Willkommen.</Text>
<Text style={{ ...styles.CENTER, fontSize: 30, color: Utils.randomColors.random()}}>Bienvenue.</Text>
<ActivityIndicator size="large" color={ Utils.randomColors.random() } />
</View>
export default class App extends Component {
constructor(props){
super(props)
this.state = {
themeLoaded: false
}
}
async componentDidMount() {
let savedTheme = await theme.getTheme()
theme.current = savedTheme ? savedTheme.current : theme.current
Utils.sleep(1).then( res => this.setState({ themeLoaded: true }) )
}
render() {
// the main app cannot be used the same way as SplashScreen because it
// will then be initialised then with the value even though it will not
// render so to only initialise and render when have correct value as
// in theme set then it has to be done like this
if (this.state.themeLoaded) {
const AppWithNavigation = MainApp.mainNavigation( theme.current )
return (
<PaperProvider theme={theme[theme.current]}>
<AppWithNavigation />
<FlashMessage position="top" />
</PaperProvider>
)
} else return SplashScreen
}
}