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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 {Linking, 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. navigatorRef: Object;
  37. defaultRoute: Array<string>;
  38. defaultData: Object;
  39. createDrawerNavigator: Function;
  40. constructor() {
  41. super();
  42. LocaleManager.initTranslations();
  43. this.onIntroDone = this.onIntroDone.bind(this);
  44. this.onUpdateTheme = this.onUpdateTheme.bind(this);
  45. SplashScreen.preventAutoHide();
  46. this.navigatorRef = React.createRef();
  47. this.defaultRoute = [];
  48. this.defaultData = {};
  49. // this.defaultRoute = ["main", "home", "club-information"];
  50. // this.defaultData = {clubId: 0};
  51. this.handleUrls();
  52. }
  53. handleUrls() {
  54. console.log(Linking.makeUrl('main/home/club-information', {clubId: 1}));
  55. Linking.addEventListener('url', this.onUrl);
  56. Linking.parseInitialURLAsync().then(this.onParsedUrl);
  57. }
  58. onUrl = (url: string) => {
  59. this.onParsedUrl(Linking.parse(url));
  60. };
  61. onParsedUrl = ({path, queryParams}: Object) => {
  62. if (path !== null) {
  63. let pathArray = path.split('/');
  64. if (this.isClubInformationLink(pathArray))
  65. this.handleClubInformationUrl(queryParams);
  66. else if (this.isPlanningInformationLink(pathArray))
  67. this.handlePlanningInformationUrl(queryParams);
  68. }
  69. };
  70. isClubInformationLink(pathArray: Array<string>) {
  71. return pathArray[0] === "main" && pathArray[1] === "home" && pathArray[2] === "club-information";
  72. }
  73. isPlanningInformationLink(pathArray: Array<string>) {
  74. return pathArray[0] === "main" && pathArray[1] === "home" && pathArray[2] === "planning-information";
  75. }
  76. handleClubInformationUrl(params: Object) {
  77. if (params !== undefined && params.clubId !== undefined) {
  78. let id = parseInt(params.clubId);
  79. if (!isNaN(id)) {
  80. this.defaultRoute = ["main", "home", "club-information"];
  81. this.defaultData = {clubId: id};
  82. }
  83. }
  84. }
  85. handlePlanningInformationUrl(params: Object) {
  86. if (params !== undefined && params.eventId !== undefined) {
  87. let id = parseInt(params.eventId);
  88. if (!isNaN(id)) {
  89. this.defaultRoute = ["main", "home", "planning-information"];
  90. this.defaultData = {eventId: id};
  91. }
  92. }
  93. }
  94. /**
  95. * Updates the theme
  96. */
  97. onUpdateTheme() {
  98. this.setState({
  99. currentTheme: ThemeManager.getCurrentTheme()
  100. });
  101. this.setupStatusBar();
  102. }
  103. setupStatusBar() {
  104. if (ThemeManager.getNightMode()) {
  105. StatusBar.setBarStyle('light-content', true);
  106. } else {
  107. StatusBar.setBarStyle('dark-content', true);
  108. }
  109. }
  110. /**
  111. * Callback when user ends the intro. Save in preferences to avaoid showing back the introSlides
  112. */
  113. onIntroDone() {
  114. this.setState({
  115. showIntro: false,
  116. showUpdate: false,
  117. showAprilFools: false,
  118. });
  119. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showIntro.key, '0');
  120. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.updateNumber.key, Update.number.toString());
  121. AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.key, '0');
  122. }
  123. async componentDidMount() {
  124. await this.loadAssetsAsync();
  125. }
  126. async loadAssetsAsync() {
  127. // Wait for custom fonts to be loaded before showing the app
  128. await AsyncStorageManager.getInstance().loadPreferences();
  129. ThemeManager.getInstance().setUpdateThemeCallback(this.onUpdateTheme);
  130. await initExpoToken();
  131. try {
  132. await ConnectionManager.getInstance().recoverLogin();
  133. } catch (e) {
  134. }
  135. this.createDrawerNavigator = () => <DrawerNavigator defaultPath={this.defaultRoute} defaultData={this.defaultData}/>;
  136. this.onLoadFinished();
  137. }
  138. onLoadFinished() {
  139. // console.log("finished");
  140. // Only show intro if this is the first time starting the app
  141. this.setState({
  142. isLoading: false,
  143. currentTheme: ThemeManager.getCurrentTheme(),
  144. showIntro: AsyncStorageManager.getInstance().preferences.showIntro.current === '1',
  145. showUpdate: AsyncStorageManager.getInstance().preferences.updateNumber.current !== Update.number.toString(),
  146. showAprilFools: AprilFoolsManager.getInstance().isAprilFoolsEnabled() && AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.current === '1',
  147. });
  148. // Status bar goes dark if set too fast on ios
  149. if (Platform.OS === 'ios')
  150. setTimeout(this.setupStatusBar, 1000);
  151. else
  152. this.setupStatusBar();
  153. SplashScreen.hide();
  154. }
  155. /**
  156. * Renders the app based on loading state
  157. */
  158. render() {
  159. if (this.state.isLoading) {
  160. return null;
  161. } else if (this.state.showIntro || this.state.showUpdate || this.state.showAprilFools) {
  162. return <CustomIntroSlider
  163. onDone={this.onIntroDone}
  164. isUpdate={this.state.showUpdate && !this.state.showIntro}
  165. isAprilFools={this.state.showAprilFools && !this.state.showIntro}
  166. />;
  167. } else {
  168. return (
  169. <PaperProvider theme={this.state.currentTheme}>
  170. <NavigationContainer theme={this.state.currentTheme} ref={this.navigatorRef}>
  171. <Stack.Navigator headerMode="none">
  172. <Stack.Screen name="Root" component={this.createDrawerNavigator}/>
  173. </Stack.Navigator>
  174. </NavigationContainer>
  175. </PaperProvider>
  176. );
  177. }
  178. }
  179. }