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.

TabNavigator.js 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. import * as React from 'react';
  2. import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
  3. import {createBottomTabNavigator} from "@react-navigation/bottom-tabs";
  4. import HomeScreen from '../screens/Home/HomeScreen';
  5. import PlanningScreen from '../screens/Planning/PlanningScreen';
  6. import PlanningDisplayScreen from '../screens/Planning/PlanningDisplayScreen';
  7. import ProxiwashScreen from '../screens/Proxiwash/ProxiwashScreen';
  8. import ProxiwashAboutScreen from '../screens/Proxiwash/ProxiwashAboutScreen';
  9. import ProximoMainScreen from '../screens/Proximo/ProximoMainScreen';
  10. import ProximoListScreen from "../screens/Proximo/ProximoListScreen";
  11. import ProximoAboutScreen from "../screens/Proximo/ProximoAboutScreen";
  12. import PlanexScreen from '../screens/Planex/PlanexScreen';
  13. import AsyncStorageManager from "../managers/AsyncStorageManager";
  14. import {useTheme} from 'react-native-paper';
  15. import {Platform} from 'react-native';
  16. import i18n from "i18n-js";
  17. import ClubDisplayScreen from "../screens/Amicale/Clubs/ClubDisplayScreen";
  18. import ScannerScreen from "../screens/Home/ScannerScreen";
  19. import FeedItemScreen from "../screens/Home/FeedItemScreen";
  20. import {createCollapsibleStack} from "react-navigation-collapsible";
  21. import GroupSelectionScreen from "../screens/Planex/GroupSelectionScreen";
  22. import CustomTabBar from "../components/Tabbar/CustomTabBar";
  23. import SelfMenuScreen from "../screens/Services/SelfMenuScreen";
  24. import AvailableRoomScreen from "../screens/Websites/AvailableRoomScreen";
  25. import BibScreen from "../screens/Websites/BibScreen";
  26. import {AmicaleWebsiteScreen} from "../screens/Websites/AmicaleWebsiteScreen";
  27. import {ElusEtudiantsWebsiteScreen} from "../screens/Websites/ElusEtudiantsWebsiteScreen";
  28. import {WiketudWebsiteScreen} from "../screens/Websites/WiketudWebsiteScreen";
  29. import {TutorInsaWebsiteScreen} from "../screens/Websites/TutorInsaWebsiteScreen";
  30. import {ENTWebsiteScreen} from "../screens/Websites/ENTWebsiteScreen";
  31. import {BlueMindWebsiteScreen} from "../screens/Websites/BlueMindWebsiteScreen";
  32. import LoginScreen from "../screens/Amicale/LoginScreen";
  33. import ProfileScreen from "../screens/Amicale/ProfileScreen";
  34. import ClubListScreen from "../screens/Amicale/Clubs/ClubListScreen";
  35. import ClubAboutScreen from "../screens/Amicale/Clubs/ClubAboutScreen";
  36. import VoteScreen from "../screens/Amicale/VoteScreen";
  37. import AmicaleContactScreen from "../screens/Amicale/AmicaleContactScreen";
  38. import WebsitesHomeScreen from "../screens/Services/ServicesScreen";
  39. import ServicesSectionScreen from "../screens/Services/ServicesSectionScreen";
  40. const defaultScreenOptions = {
  41. gestureEnabled: true,
  42. cardOverlayEnabled: true,
  43. ...TransitionPresets.ScaleFromCenterAndroid,
  44. };
  45. const modalTransition = Platform.OS === 'ios' ? TransitionPresets.ModalPresentationIOS : TransitionPresets.ModalSlideFromBottomIOS;
  46. const screenTransition = Platform.OS === 'ios' ? TransitionPresets.SlideFromRightIOS : TransitionPresets.ScaleFromCenterAndroid;
  47. function createScreenCollapsibleStack(
  48. name: string,
  49. Stack: any,
  50. component: any,
  51. title: string,
  52. useNativeDriver?: boolean,
  53. options?: { [key: string]: any }) {
  54. const {colors} = useTheme();
  55. const screenOptions = options != null ? options : {};
  56. return createCollapsibleStack(
  57. <Stack.Screen
  58. name={name}
  59. component={component}
  60. options={{
  61. title: title,
  62. headerStyle: {
  63. backgroundColor: colors.surface,
  64. },
  65. ...screenOptions,
  66. }}
  67. />,
  68. {
  69. collapsedColor: 'transparent',
  70. useNativeDriver: useNativeDriver != null ? useNativeDriver : true, // native driver does not work with webview
  71. }
  72. )
  73. }
  74. function getWebsiteStack(name: string, Stack: any, component: any, title: string) {
  75. return createScreenCollapsibleStack(name, Stack, component, title, false);
  76. }
  77. const ServicesStack = createStackNavigator();
  78. function ServicesStackComponent() {
  79. return (
  80. <ServicesStack.Navigator
  81. initialRouteName="index"
  82. headerMode={"screen"}
  83. screenOptions={defaultScreenOptions}
  84. >
  85. {createScreenCollapsibleStack("index", ServicesStack, WebsitesHomeScreen, i18n.t('screens.services'))}
  86. {createScreenCollapsibleStack("services-section", ServicesStack, ServicesSectionScreen, "SECTION")}
  87. {/* INSA */}
  88. {getWebsiteStack("available-rooms", ServicesStack, AvailableRoomScreen, i18n.t('screens.availableRooms'))}
  89. {getWebsiteStack("bib", ServicesStack, BibScreen, i18n.t('screens.bib'))}
  90. {createScreenCollapsibleStack("self-menu", ServicesStack, SelfMenuScreen, i18n.t('screens.menuSelf'))}
  91. {/* STUDENTS */}
  92. {createScreenCollapsibleStack("proximo", ServicesStack, ProximoMainScreen, i18n.t('screens.proximo'))}
  93. {createScreenCollapsibleStack(
  94. "proximo-list",
  95. ServicesStack,
  96. ProximoListScreen,
  97. i18n.t('screens.proximoArticles'),
  98. true,
  99. {...screenTransition},
  100. )}
  101. <ServicesStack.Screen
  102. name="proximo-about"
  103. component={ProximoAboutScreen}
  104. options={{
  105. title: i18n.t('screens.proximo'),
  106. ...modalTransition,
  107. }}
  108. />
  109. {getWebsiteStack("amicale-website", ServicesStack, AmicaleWebsiteScreen, i18n.t('screens.amicaleWebsite'))}
  110. {getWebsiteStack("elus-etudiants", ServicesStack, ElusEtudiantsWebsiteScreen, "Élus Étudiants")}
  111. {getWebsiteStack("wiketud", ServicesStack, WiketudWebsiteScreen, "Wiketud")}
  112. {getWebsiteStack("tutorinsa", ServicesStack, TutorInsaWebsiteScreen, "Tutor'INSA")}
  113. {getWebsiteStack("ent", ServicesStack, ENTWebsiteScreen, i18n.t('screens.ent'))}
  114. {getWebsiteStack("bluemind", ServicesStack, BlueMindWebsiteScreen, i18n.t('screens.bluemind'))}
  115. {/* AMICALE */}
  116. {createScreenCollapsibleStack("login", ServicesStack, LoginScreen, i18n.t('screens.login'))}
  117. {createScreenCollapsibleStack("profile", ServicesStack, ProfileScreen, i18n.t('screens.profile'))}
  118. {createScreenCollapsibleStack("club-list", ServicesStack, ClubListScreen, i18n.t('clubs.clubList'))}
  119. <ServicesStack.Screen
  120. name="club-about"
  121. component={ClubAboutScreen}
  122. options={{
  123. title: i18n.t('screens.clubsAbout'),
  124. ...modalTransition,
  125. }}
  126. />
  127. <ServicesStack.Screen
  128. name="vote"
  129. component={VoteScreen}
  130. options={{
  131. title: i18n.t('screens.vote'),
  132. }}
  133. />
  134. <ServicesStack.Screen
  135. name="amicale-contact"
  136. component={AmicaleContactScreen}
  137. options={{
  138. title: i18n.t('screens.amicaleAbout'),
  139. }}
  140. />
  141. </ServicesStack.Navigator>
  142. );
  143. }
  144. const ProxiwashStack = createStackNavigator();
  145. function ProxiwashStackComponent() {
  146. return (
  147. <ProxiwashStack.Navigator
  148. initialRouteName="index"
  149. headerMode={"screen"}
  150. screenOptions={defaultScreenOptions}
  151. >
  152. {createScreenCollapsibleStack("index", ProxiwashStack, ProxiwashScreen, i18n.t('screens.proxiwash'))}
  153. <ProxiwashStack.Screen
  154. name="proxiwash-about"
  155. component={ProxiwashAboutScreen}
  156. options={{
  157. title: i18n.t('screens.proxiwash'),
  158. ...modalTransition,
  159. }}
  160. />
  161. </ProxiwashStack.Navigator>
  162. );
  163. }
  164. const PlanningStack = createStackNavigator();
  165. function PlanningStackComponent() {
  166. return (
  167. <PlanningStack.Navigator
  168. initialRouteName="index"
  169. headerMode={"screen"}
  170. screenOptions={defaultScreenOptions}
  171. >
  172. <PlanningStack.Screen
  173. name="planning"
  174. component={PlanningScreen}
  175. options={{
  176. title: i18n.t('screens.planning'),
  177. }}
  178. />
  179. <PlanningStack.Screen
  180. name="planning-information"
  181. component={PlanningDisplayScreen}
  182. options={{
  183. title: i18n.t('screens.planningDisplayScreen'),
  184. ...modalTransition,
  185. }}
  186. />
  187. </PlanningStack.Navigator>
  188. );
  189. }
  190. const HomeStack = createStackNavigator();
  191. function HomeStackComponent(initialRoute: string | null, defaultData: { [key: string]: any }) {
  192. let params = undefined;
  193. if (initialRoute != null)
  194. params = {data: defaultData, nextScreen: initialRoute, shouldOpen: true};
  195. const {colors} = useTheme();
  196. return (
  197. <HomeStack.Navigator
  198. initialRouteName={"index"}
  199. headerMode={"screen"}
  200. screenOptions={defaultScreenOptions}
  201. >
  202. {createCollapsibleStack(
  203. <HomeStack.Screen
  204. name="index"
  205. component={HomeScreen}
  206. options={{
  207. title: i18n.t('screens.home'),
  208. headerStyle: {
  209. backgroundColor: colors.surface,
  210. },
  211. }}
  212. initialParams={params}
  213. />,
  214. {
  215. collapsedColor: 'transparent',
  216. useNativeDriver: true,
  217. }
  218. )}
  219. <HomeStack.Screen
  220. name="scanner"
  221. component={ScannerScreen}
  222. options={{
  223. title: i18n.t('screens.scanner'),
  224. ...modalTransition,
  225. }}
  226. />
  227. <HomeStack.Screen
  228. name="club-information"
  229. component={ClubDisplayScreen}
  230. options={{
  231. title: i18n.t('screens.clubDisplayScreen'),
  232. ...modalTransition,
  233. }}
  234. />
  235. <HomeStack.Screen
  236. name="feed-information"
  237. component={FeedItemScreen}
  238. options={{
  239. title: i18n.t('screens.feedDisplayScreen'),
  240. ...modalTransition,
  241. }}
  242. />
  243. <HomeStack.Screen
  244. name="planning-information"
  245. component={PlanningDisplayScreen}
  246. options={{
  247. title: i18n.t('screens.planningDisplayScreen'),
  248. ...modalTransition,
  249. }}
  250. />
  251. {createScreenCollapsibleStack("self-menu", HomeStack, SelfMenuScreen, i18n.t('screens.menuSelf'), true, {...modalTransition})}
  252. {createScreenCollapsibleStack("login", HomeStack, LoginScreen, i18n.t('screens.login'))}
  253. </HomeStack.Navigator>
  254. );
  255. }
  256. const PlanexStack = createStackNavigator();
  257. function PlanexStackComponent() {
  258. return (
  259. <PlanexStack.Navigator
  260. initialRouteName="index"
  261. headerMode={"screen"}
  262. screenOptions={defaultScreenOptions}
  263. >
  264. {getWebsiteStack("index", PlanexStack, PlanexScreen, "Planex")}
  265. {createScreenCollapsibleStack(
  266. "group-select",
  267. PlanexStack,
  268. GroupSelectionScreen,
  269. "GROUP SELECT",
  270. true,
  271. {...modalTransition})}
  272. </PlanexStack.Navigator>
  273. );
  274. }
  275. const Tab = createBottomTabNavigator();
  276. type Props = {
  277. defaultHomeRoute: string | null,
  278. defaultHomeData: { [key: string]: any }
  279. }
  280. export default class TabNavigator extends React.Component<Props> {
  281. createHomeStackComponent: () => HomeStackComponent;
  282. defaultRoute: string;
  283. constructor(props) {
  284. super(props);
  285. if (props.defaultHomeRoute != null)
  286. this.defaultRoute = 'home';
  287. else
  288. this.defaultRoute = AsyncStorageManager.getInstance().preferences.defaultStartScreen.current.toLowerCase();
  289. this.createHomeStackComponent = () => HomeStackComponent(props.defaultHomeRoute, props.defaultHomeData);
  290. }
  291. render() {
  292. return (
  293. <Tab.Navigator
  294. initialRouteName={this.defaultRoute}
  295. tabBar={props => <CustomTabBar {...props} />}
  296. >
  297. <Tab.Screen
  298. name="services"
  299. option
  300. component={ServicesStackComponent}
  301. options={{title: i18n.t('screens.services')}}
  302. />
  303. <Tab.Screen
  304. name="proxiwash"
  305. component={ProxiwashStackComponent}
  306. options={{title: i18n.t('screens.proxiwash')}}
  307. />
  308. <Tab.Screen
  309. name="home"
  310. component={this.createHomeStackComponent}
  311. options={{title: i18n.t('screens.home')}}
  312. />
  313. <Tab.Screen
  314. name="planning"
  315. component={PlanningStackComponent}
  316. options={{title: i18n.t('screens.planning')}}
  317. />
  318. <Tab.Screen
  319. name="planex"
  320. component={PlanexStackComponent}
  321. options={{title: "Planex"}}
  322. />
  323. </Tab.Navigator>
  324. );
  325. }
  326. }