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 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // @flow
  2. import * as React from 'react';
  3. import {Platform, StatusBar} from 'react-native';
  4. import LocaleManager from './src/managers/LocaleManager';
  5. import AsyncStorageManager from "./src/managers/AsyncStorageManager";
  6. import CustomIntroSlider from "./src/components/Custom/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. type Props = {};
  18. type State = {
  19. isLoading: boolean,
  20. showIntro: boolean,
  21. showUpdate: boolean,
  22. showAprilFools: boolean,
  23. currentTheme: ?Object,
  24. };
  25. const Stack = createStackNavigator();
  26. export default class App extends React.Component<Props, State> {
  27. state = {
  28. isLoading: true,
  29. showIntro: true,
  30. showUpdate: true,
  31. showAprilFools: false,
  32. currentTheme: null,
  33. };
  34. onIntroDone: Function;
  35. onUpdateTheme: Function;
  36. constructor() {
  37. super();
  38. LocaleManager.initTranslations();
  39. this.onIntroDone = this.onIntroDone.bind(this);
  40. this.onUpdateTheme = this.onUpdateTheme.bind(this);
  41. SplashScreen.preventAutoHide();
  42. }
  43. /**
  44. * Updates the theme
  45. */
  46. onUpdateTheme() {
  47. this.setState({
  48. currentTheme: ThemeManager.getCurrentTheme()
  49. });
  50. this.setupStatusBar();
  51. }
  52. setupStatusBar() {
  53. if (ThemeManager.getNightMode()) {
  54. StatusBar.setBarStyle('light-content', true);
  55. } else {
  56. StatusBar.setBarStyle('dark-content', true);
  57. }
  58. }
  59. /**
  60. * Callback when user ends the intro. Save in preferences to avaoid showing back the introSlides
  61. */
  62. onIntroDone() {
  63. this.setState({
  64. showIntro: false,
  65. showUpdate: false,
  66. showAprilFools: false,
  67. });
  68. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showIntro.key, '0');
  69. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.updateNumber.key, Update.number.toString());
  70. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.key, '0');
  71. }
  72. async componentDidMount() {
  73. await this.loadAssetsAsync();
  74. }
  75. async loadAssetsAsync() {
  76. // Wait for custom fonts to be loaded before showing the app
  77. await AsyncStorageManager.getInstance().loadPreferences();
  78. ThemeManager.getInstance().setUpdateThemeCallback(this.onUpdateTheme);
  79. await initExpoToken();
  80. try {
  81. await ConnectionManager.getInstance().recoverLogin();
  82. } catch (e) {}
  83. this.onLoadFinished();
  84. }
  85. onLoadFinished() {
  86. // console.log("finished");
  87. // Only show intro if this is the first time starting the app
  88. this.setState({
  89. isLoading: false,
  90. currentTheme: ThemeManager.getCurrentTheme(),
  91. showIntro: AsyncStorageManager.getInstance().preferences.showIntro.current === '1',
  92. showUpdate: AsyncStorageManager.getInstance().preferences.updateNumber.current !== Update.number.toString(),
  93. showAprilFools: AprilFoolsManager.getInstance().isAprilFoolsEnabled() && AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.current === '1',
  94. });
  95. // Status bar goes dark if set too fast on ios
  96. if (Platform.OS === 'ios')
  97. setTimeout(this.setupStatusBar, 1000);
  98. else
  99. this.setupStatusBar();
  100. SplashScreen.hide();
  101. }
  102. /**
  103. * Renders the app based on loading state
  104. */
  105. render() {
  106. if (this.state.isLoading) {
  107. return null;
  108. } else if (this.state.showIntro || this.state.showUpdate || this.state.showAprilFools) {
  109. return <CustomIntroSlider
  110. onDone={this.onIntroDone}
  111. isUpdate={this.state.showUpdate && !this.state.showIntro}
  112. isAprilFools={this.state.showAprilFools && !this.state.showIntro}
  113. />;
  114. } else {
  115. return (
  116. <PaperProvider theme={this.state.currentTheme}>
  117. <NavigationContainer theme={this.state.currentTheme}>
  118. <Stack.Navigator headerMode="none">
  119. <Stack.Screen name="Root" component={DrawerNavigator}/>
  120. </Stack.Navigator>
  121. </NavigationContainer>
  122. </PaperProvider>
  123. );
  124. }
  125. }
  126. }