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.6KB

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