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.

MainNavigator.tsx 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. * Copyright (c) 2019 - 2020 Arnaud Vergnet.
  3. *
  4. * This file is part of Campus INSAT.
  5. *
  6. * Campus INSAT is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Campus INSAT is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Campus INSAT. If not, see <https://www.gnu.org/licenses/>.
  18. */
  19. import * as React from 'react';
  20. import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
  21. import i18n from 'i18n-js';
  22. import {Platform} from 'react-native';
  23. import SettingsScreen from '../screens/Other/Settings/SettingsScreen';
  24. import AboutScreen from '../screens/About/AboutScreen';
  25. import AboutDependenciesScreen from '../screens/About/AboutDependenciesScreen';
  26. import DebugScreen from '../screens/About/DebugScreen';
  27. import TabNavigator from './TabNavigator';
  28. import GameMainScreen from '../screens/Game/screens/GameMainScreen';
  29. import VoteScreen from '../screens/Amicale/VoteScreen';
  30. import LoginScreen from '../screens/Amicale/LoginScreen';
  31. import SelfMenuScreen from '../screens/Services/SelfMenuScreen';
  32. import ProximoMainScreen from '../screens/Services/Proximo/ProximoMainScreen';
  33. import ProximoListScreen from '../screens/Services/Proximo/ProximoListScreen';
  34. import ProximoAboutScreen from '../screens/Services/Proximo/ProximoAboutScreen';
  35. import ProfileScreen from '../screens/Amicale/ProfileScreen';
  36. import ClubListScreen from '../screens/Amicale/Clubs/ClubListScreen';
  37. import ClubAboutScreen from '../screens/Amicale/Clubs/ClubAboutScreen';
  38. import ClubDisplayScreen from '../screens/Amicale/Clubs/ClubDisplayScreen';
  39. import {
  40. CreateScreenCollapsibleStack,
  41. getWebsiteStack,
  42. } from '../utils/CollapsibleUtils';
  43. import BugReportScreen from '../screens/Other/FeedbackScreen';
  44. import WebsiteScreen from '../screens/Services/WebsiteScreen';
  45. import EquipmentScreen, {
  46. DeviceType,
  47. } from '../screens/Amicale/Equipment/EquipmentListScreen';
  48. import EquipmentLendScreen from '../screens/Amicale/Equipment/EquipmentRentScreen';
  49. import EquipmentConfirmScreen from '../screens/Amicale/Equipment/EquipmentConfirmScreen';
  50. import DashboardEditScreen from '../screens/Other/Settings/DashboardEditScreen';
  51. import GameStartScreen from '../screens/Game/screens/GameStartScreen';
  52. import ImageGalleryScreen from '../screens/Media/ImageGalleryScreen';
  53. export enum MainRoutes {
  54. Main = 'main',
  55. Gallery = 'gallery',
  56. Settings = 'settings',
  57. DashboardEdit = 'dashboard-edit',
  58. About = 'about',
  59. Dependencies = 'dependencies',
  60. Debug = 'debug',
  61. GameStart = 'game-start',
  62. GameMain = 'game-main',
  63. Login = 'login',
  64. SelfMenu = 'self-menu',
  65. Proximo = 'proximo',
  66. ProximoList = 'proximo-list',
  67. ProximoAbout = 'proximo-about',
  68. Profile = 'profile',
  69. ClubList = 'club-list',
  70. ClubInformation = 'club-information',
  71. ClubAbout = 'club-about',
  72. EquipmentList = 'equipment-list',
  73. EquipmentRent = 'equipment-rent',
  74. EquipmentConfirm = 'equipment-confirm',
  75. Vote = 'vote',
  76. Feedback = 'feedback',
  77. }
  78. type DefaultParams = {[key in MainRoutes]: object | undefined};
  79. export interface FullParamsList extends DefaultParams {
  80. login: {nextScreen: string};
  81. 'equipment-confirm': {
  82. item?: DeviceType;
  83. dates: [string, string];
  84. };
  85. 'equipment-rent': {item?: DeviceType};
  86. gallery: {images: Array<{url: string}>};
  87. }
  88. // Don't know why but TS is complaining without this
  89. // See: https://stackoverflow.com/questions/63652687/interface-does-not-satisfy-the-constraint-recordstring-object-undefined
  90. export type MainStackParamsList = FullParamsList &
  91. Record<string, object | undefined>;
  92. const modalTransition =
  93. Platform.OS === 'ios'
  94. ? TransitionPresets.ModalPresentationIOS
  95. : TransitionPresets.ModalTransition;
  96. const defaultScreenOptions = {
  97. gestureEnabled: true,
  98. cardOverlayEnabled: true,
  99. ...TransitionPresets.SlideFromRightIOS,
  100. };
  101. const MainStack = createStackNavigator<MainStackParamsList>();
  102. function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) {
  103. const {createTabNavigator} = props;
  104. return (
  105. <MainStack.Navigator
  106. initialRouteName={MainRoutes.Main}
  107. headerMode="screen"
  108. screenOptions={defaultScreenOptions}>
  109. <MainStack.Screen
  110. name={MainRoutes.Main}
  111. component={createTabNavigator}
  112. options={{
  113. headerShown: false,
  114. title: i18n.t('screens.home.title'),
  115. }}
  116. />
  117. <MainStack.Screen
  118. name={MainRoutes.Gallery}
  119. component={ImageGalleryScreen}
  120. options={{
  121. headerShown: false,
  122. ...modalTransition,
  123. }}
  124. />
  125. {CreateScreenCollapsibleStack(
  126. MainRoutes.Settings,
  127. MainStack,
  128. SettingsScreen,
  129. i18n.t('screens.settings.title'),
  130. )}
  131. {CreateScreenCollapsibleStack(
  132. MainRoutes.DashboardEdit,
  133. MainStack,
  134. DashboardEditScreen,
  135. i18n.t('screens.settings.dashboardEdit.title'),
  136. )}
  137. {CreateScreenCollapsibleStack(
  138. MainRoutes.About,
  139. MainStack,
  140. AboutScreen,
  141. i18n.t('screens.about.title'),
  142. )}
  143. {CreateScreenCollapsibleStack(
  144. MainRoutes.Dependencies,
  145. MainStack,
  146. AboutDependenciesScreen,
  147. i18n.t('screens.about.libs'),
  148. )}
  149. {CreateScreenCollapsibleStack(
  150. MainRoutes.Debug,
  151. MainStack,
  152. DebugScreen,
  153. i18n.t('screens.about.debug'),
  154. )}
  155. {CreateScreenCollapsibleStack(
  156. MainRoutes.GameStart,
  157. MainStack,
  158. GameStartScreen,
  159. i18n.t('screens.game.title'),
  160. true,
  161. undefined,
  162. 'transparent',
  163. )}
  164. <MainStack.Screen
  165. name={MainRoutes.GameMain}
  166. component={GameMainScreen}
  167. options={{
  168. title: i18n.t('screens.game.title'),
  169. }}
  170. />
  171. {CreateScreenCollapsibleStack(
  172. MainRoutes.Login,
  173. MainStack,
  174. LoginScreen,
  175. i18n.t('screens.login.title'),
  176. true,
  177. {headerTintColor: '#fff'},
  178. 'transparent',
  179. )}
  180. {getWebsiteStack('website', MainStack, WebsiteScreen, '')}
  181. {CreateScreenCollapsibleStack(
  182. MainRoutes.SelfMenu,
  183. MainStack,
  184. SelfMenuScreen,
  185. i18n.t('screens.menu.title'),
  186. )}
  187. {CreateScreenCollapsibleStack(
  188. MainRoutes.Proximo,
  189. MainStack,
  190. ProximoMainScreen,
  191. i18n.t('screens.proximo.title'),
  192. )}
  193. {CreateScreenCollapsibleStack(
  194. MainRoutes.ProximoList,
  195. MainStack,
  196. ProximoListScreen,
  197. i18n.t('screens.proximo.articleList'),
  198. )}
  199. {CreateScreenCollapsibleStack(
  200. MainRoutes.ProximoAbout,
  201. MainStack,
  202. ProximoAboutScreen,
  203. i18n.t('screens.proximo.title'),
  204. true,
  205. {...modalTransition},
  206. )}
  207. {CreateScreenCollapsibleStack(
  208. MainRoutes.Profile,
  209. MainStack,
  210. ProfileScreen,
  211. i18n.t('screens.profile.title'),
  212. )}
  213. {CreateScreenCollapsibleStack(
  214. MainRoutes.ClubList,
  215. MainStack,
  216. ClubListScreen,
  217. i18n.t('screens.clubs.title'),
  218. )}
  219. {CreateScreenCollapsibleStack(
  220. MainRoutes.ClubInformation,
  221. MainStack,
  222. ClubDisplayScreen,
  223. i18n.t('screens.clubs.details'),
  224. true,
  225. {...modalTransition},
  226. )}
  227. {CreateScreenCollapsibleStack(
  228. MainRoutes.ClubAbout,
  229. MainStack,
  230. ClubAboutScreen,
  231. i18n.t('screens.clubs.title'),
  232. true,
  233. {...modalTransition},
  234. )}
  235. {CreateScreenCollapsibleStack(
  236. MainRoutes.EquipmentList,
  237. MainStack,
  238. EquipmentScreen,
  239. i18n.t('screens.equipment.title'),
  240. )}
  241. {CreateScreenCollapsibleStack(
  242. MainRoutes.EquipmentRent,
  243. MainStack,
  244. EquipmentLendScreen,
  245. i18n.t('screens.equipment.book'),
  246. )}
  247. {CreateScreenCollapsibleStack(
  248. MainRoutes.EquipmentConfirm,
  249. MainStack,
  250. EquipmentConfirmScreen,
  251. i18n.t('screens.equipment.confirm'),
  252. )}
  253. {CreateScreenCollapsibleStack(
  254. MainRoutes.Vote,
  255. MainStack,
  256. VoteScreen,
  257. i18n.t('screens.vote.title'),
  258. )}
  259. {CreateScreenCollapsibleStack(
  260. MainRoutes.Feedback,
  261. MainStack,
  262. BugReportScreen,
  263. i18n.t('screens.feedback.title'),
  264. )}
  265. </MainStack.Navigator>
  266. );
  267. }
  268. type PropsType = {
  269. defaultHomeRoute: string | null;
  270. defaultHomeData: {[key: string]: string};
  271. };
  272. export default function MainNavigator(props: PropsType) {
  273. return <MainStackComponent createTabNavigator={() => TabNavigator(props)} />;
  274. }