Application Android et IOS pour l'amicale des élèves
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

App.js 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // @flow
  2. import * as React from 'react';
  3. import {Platform, StatusBar, YellowBox} from 'react-native';
  4. import LocaleManager from './src/managers/LocaleManager';
  5. import AsyncStorageManager from "./src/managers/AsyncStorageManager";
  6. import CustomIntroSlider from "./src/components/Overrides/CustomIntroSlider";
  7. import {SplashScreen} from 'expo';
  8. import ThemeManager from './src/managers/ThemeManager';
  9. import {NavigationContainer} from '@react-navigation/native';
  10. import {createStackNavigator} from '@react-navigation/stack';
  11. import DrawerNavigator from './src/navigation/DrawerNavigator';
  12. import {initExpoToken} from "./src/utils/Notifications";
  13. import {Provider as PaperProvider} from 'react-native-paper';
  14. import AprilFoolsManager from "./src/managers/AprilFoolsManager";
  15. import Update from "./src/constants/Update";
  16. import ConnectionManager from "./src/managers/ConnectionManager";
  17. import URLHandler from "./src/utils/URLHandler";
  18. import {setSafeBounceHeight} from "react-navigation-collapsible";
  19. YellowBox.ignoreWarnings([ // collapsible headers cause this warning, just ignore as it is not an issue
  20. 'Non-serializable values were found in the navigation state',
  21. ]);
  22. type Props = {};
  23. type State = {
  24. isLoading: boolean,
  25. showIntro: boolean,
  26. showUpdate: boolean,
  27. showAprilFools: boolean,
  28. currentTheme: ?Object,
  29. };
  30. const Stack = createStackNavigator();
  31. export default class App extends React.Component<Props, State> {
  32. state = {
  33. isLoading: true,
  34. showIntro: true,
  35. showUpdate: true,
  36. showAprilFools: false,
  37. currentTheme: null,
  38. };
  39. navigatorRef: Object;
  40. defaultRoute: string | null;
  41. defaultData: Object;
  42. createDrawerNavigator: Function;
  43. urlHandler: URLHandler;
  44. constructor() {
  45. super();
  46. LocaleManager.initTranslations();
  47. SplashScreen.preventAutoHide();
  48. this.navigatorRef = React.createRef();
  49. this.defaultRoute = null;
  50. this.defaultData = {};
  51. this.urlHandler = new URLHandler(this.onInitialURLParsed, this.onDetectURL);
  52. this.urlHandler.listen();
  53. setSafeBounceHeight(Platform.OS === 'ios' ? 100 : 20);
  54. }
  55. onInitialURLParsed = ({route, data}: Object) => {
  56. this.defaultRoute = route;
  57. this.defaultData = data;
  58. };
  59. onDetectURL = ({route, data}: Object) => {
  60. // Navigate to nested navigator and pass data to the index screen
  61. this.navigatorRef.current.navigate('home', {
  62. screen: 'index',
  63. params: {nextScreen: route, data: data}
  64. });
  65. };
  66. /**
  67. * Updates the theme
  68. */
  69. onUpdateTheme = () => {
  70. this.setState({
  71. currentTheme: ThemeManager.getCurrentTheme()
  72. });
  73. this.setupStatusBar();
  74. };
  75. setupStatusBar() {
  76. if (Platform.OS === 'ios') {
  77. if (ThemeManager.getNightMode()) {
  78. StatusBar.setBarStyle('light-content', true);
  79. } else {
  80. StatusBar.setBarStyle('dark-content', true);
  81. }
  82. }
  83. // StatusBar.setTranslucent(false);
  84. // StatusBar.setBackgroundColor(ThemeManager.getCurrentTheme().colors.surface);
  85. }
  86. /**
  87. * Callback when user ends the intro. Save in preferences to avaoid showing back the introSlides
  88. */
  89. onIntroDone = () => {
  90. this.setState({
  91. showIntro: false,
  92. showUpdate: false,
  93. showAprilFools: false,
  94. });
  95. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showIntro.key, '0');
  96. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.updateNumber.key, Update.number.toString());
  97. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.key, '0');
  98. };
  99. async componentDidMount() {
  100. await this.loadAssetsAsync();
  101. }
  102. async loadAssetsAsync() {
  103. // Wait for custom fonts to be loaded before showing the app
  104. await AsyncStorageManager.getInstance().loadPreferences();
  105. ThemeManager.getInstance().setUpdateThemeCallback(this.onUpdateTheme);
  106. await initExpoToken();
  107. try {
  108. await ConnectionManager.getInstance().recoverLogin();
  109. } catch (e) {
  110. }
  111. this.createDrawerNavigator = () => <DrawerNavigator defaultRoute={this.defaultRoute}
  112. defaultData={this.defaultData}/>;
  113. this.onLoadFinished();
  114. }
  115. onLoadFinished() {
  116. // console.log("finished");
  117. // Only show intro if this is the first time starting the app
  118. this.setState({
  119. isLoading: false,
  120. currentTheme: ThemeManager.getCurrentTheme(),
  121. showIntro: AsyncStorageManager.getInstance().preferences.showIntro.current === '1',
  122. showUpdate: AsyncStorageManager.getInstance().preferences.updateNumber.current !== Update.number.toString(),
  123. showAprilFools: AprilFoolsManager.getInstance().isAprilFoolsEnabled() && AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.current === '1',
  124. });
  125. // Status bar goes dark if set too fast on ios
  126. if (Platform.OS === 'ios')
  127. setTimeout(this.setupStatusBar, 1000);
  128. else
  129. this.setupStatusBar();
  130. SplashScreen.hide();
  131. }
  132. /**
  133. * Renders the app based on loading state
  134. */
  135. render() {
  136. if (this.state.isLoading) {
  137. return null;
  138. } else if (this.state.showIntro || this.state.showUpdate || this.state.showAprilFools) {
  139. return <CustomIntroSlider
  140. onDone={this.onIntroDone}
  141. isUpdate={this.state.showUpdate && !this.state.showIntro}
  142. isAprilFools={this.state.showAprilFools && !this.state.showIntro}
  143. />;
  144. } else {
  145. return (
  146. <PaperProvider theme={this.state.currentTheme}>
  147. <NavigationContainer theme={this.state.currentTheme} ref={this.navigatorRef}>
  148. <Stack.Navigator headerMode="none">
  149. <Stack.Screen name="Root" component={this.createDrawerNavigator}/>
  150. </Stack.Navigator>
  151. </NavigationContainer>
  152. </PaperProvider>
  153. );
  154. }
  155. }
  156. }