Application Android et IOS pour l'amicale des élèves https://play.google.com/store/apps/details?id=fr.amicaleinsat.application
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 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. // @flow
  2. import * as React from 'react';
  3. import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
  4. import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
  5. import {Title, useTheme} from 'react-native-paper';
  6. import {Platform} from 'react-native';
  7. import i18n from 'i18n-js';
  8. import {createCollapsibleStack} from 'react-navigation-collapsible';
  9. import {View} from 'react-native-animatable';
  10. import HomeScreen from '../screens/Home/HomeScreen';
  11. import PlanningScreen from '../screens/Planning/PlanningScreen';
  12. import PlanningDisplayScreen from '../screens/Planning/PlanningDisplayScreen';
  13. import ProxiwashScreen from '../screens/Proxiwash/ProxiwashScreen';
  14. import ProxiwashAboutScreen from '../screens/Proxiwash/ProxiwashAboutScreen';
  15. import PlanexScreen from '../screens/Planex/PlanexScreen';
  16. import AsyncStorageManager from '../managers/AsyncStorageManager';
  17. import ClubDisplayScreen from '../screens/Amicale/Clubs/ClubDisplayScreen';
  18. import ScannerScreen from '../screens/Home/ScannerScreen';
  19. import FeedItemScreen from '../screens/Home/FeedItemScreen';
  20. import GroupSelectionScreen from '../screens/Planex/GroupSelectionScreen';
  21. import CustomTabBar from '../components/Tabbar/CustomTabBar';
  22. import WebsitesHomeScreen from '../screens/Services/ServicesScreen';
  23. import ServicesSectionScreen from '../screens/Services/ServicesSectionScreen';
  24. import AmicaleContactScreen from '../screens/Amicale/AmicaleContactScreen';
  25. import {
  26. createScreenCollapsibleStack,
  27. getWebsiteStack,
  28. } from '../utils/CollapsibleUtils';
  29. import Mascot, {MASCOT_STYLE} from '../components/Mascot/Mascot';
  30. const modalTransition =
  31. Platform.OS === 'ios'
  32. ? TransitionPresets.ModalPresentationIOS
  33. : TransitionPresets.ModalTransition;
  34. const defaultScreenOptions = {
  35. gestureEnabled: true,
  36. cardOverlayEnabled: true,
  37. ...modalTransition,
  38. };
  39. const ServicesStack = createStackNavigator();
  40. function ServicesStackComponent(): React.Node {
  41. return (
  42. <ServicesStack.Navigator
  43. initialRouteName="index"
  44. headerMode="screen"
  45. screenOptions={defaultScreenOptions}>
  46. {createScreenCollapsibleStack(
  47. 'index',
  48. ServicesStack,
  49. WebsitesHomeScreen,
  50. i18n.t('screens.services.title'),
  51. )}
  52. {createScreenCollapsibleStack(
  53. 'services-section',
  54. ServicesStack,
  55. ServicesSectionScreen,
  56. 'SECTION',
  57. )}
  58. {createScreenCollapsibleStack(
  59. 'amicale-contact',
  60. ServicesStack,
  61. AmicaleContactScreen,
  62. i18n.t('screens.amicaleAbout.title'),
  63. )}
  64. </ServicesStack.Navigator>
  65. );
  66. }
  67. const ProxiwashStack = createStackNavigator();
  68. function ProxiwashStackComponent(): React.Node {
  69. return (
  70. <ProxiwashStack.Navigator
  71. initialRouteName="index"
  72. headerMode="screen"
  73. screenOptions={defaultScreenOptions}>
  74. {createScreenCollapsibleStack(
  75. 'index',
  76. ProxiwashStack,
  77. ProxiwashScreen,
  78. i18n.t('screens.proxiwash.title'),
  79. )}
  80. {createScreenCollapsibleStack(
  81. 'proxiwash-about',
  82. ProxiwashStack,
  83. ProxiwashAboutScreen,
  84. i18n.t('screens.proxiwash.title'),
  85. )}
  86. </ProxiwashStack.Navigator>
  87. );
  88. }
  89. const PlanningStack = createStackNavigator();
  90. function PlanningStackComponent(): React.Node {
  91. return (
  92. <PlanningStack.Navigator
  93. initialRouteName="index"
  94. headerMode="screen"
  95. screenOptions={defaultScreenOptions}>
  96. <PlanningStack.Screen
  97. name="index"
  98. component={PlanningScreen}
  99. options={{title: i18n.t('screens.planning.title')}}
  100. />
  101. {createScreenCollapsibleStack(
  102. 'planning-information',
  103. PlanningStack,
  104. PlanningDisplayScreen,
  105. i18n.t('screens.planning.eventDetails'),
  106. )}
  107. </PlanningStack.Navigator>
  108. );
  109. }
  110. const HomeStack = createStackNavigator();
  111. function HomeStackComponent(
  112. initialRoute: string | null,
  113. defaultData: {[key: string]: string},
  114. ): React.Node {
  115. let params;
  116. if (initialRoute != null)
  117. params = {data: defaultData, nextScreen: initialRoute, shouldOpen: true};
  118. const {colors} = useTheme();
  119. return (
  120. <HomeStack.Navigator
  121. initialRouteName="index"
  122. headerMode="screen"
  123. screenOptions={defaultScreenOptions}>
  124. {createCollapsibleStack(
  125. <HomeStack.Screen
  126. name="index"
  127. component={HomeScreen}
  128. options={{
  129. title: i18n.t('screens.home.title'),
  130. headerStyle: {
  131. backgroundColor: colors.surface,
  132. },
  133. headerTitle: (): React.Node => (
  134. <View style={{flexDirection: 'row'}}>
  135. <Mascot
  136. style={{
  137. width: 50,
  138. }}
  139. emotion={MASCOT_STYLE.RANDOM}
  140. animated
  141. entryAnimation={{
  142. animation: 'bounceIn',
  143. duration: 1000,
  144. }}
  145. loopAnimation={{
  146. animation: 'pulse',
  147. duration: 2000,
  148. iterationCount: 'infinite',
  149. }}
  150. />
  151. <Title
  152. style={{
  153. marginLeft: 10,
  154. marginTop: 'auto',
  155. marginBottom: 'auto',
  156. }}>
  157. {i18n.t('screens.home.title')}
  158. </Title>
  159. </View>
  160. ),
  161. }}
  162. initialParams={params}
  163. />,
  164. {
  165. collapsedColor: colors.surface,
  166. useNativeDriver: true,
  167. },
  168. )}
  169. <HomeStack.Screen
  170. name="scanner"
  171. component={ScannerScreen}
  172. options={{title: i18n.t('screens.scanner.title')}}
  173. />
  174. {createScreenCollapsibleStack(
  175. 'club-information',
  176. HomeStack,
  177. ClubDisplayScreen,
  178. i18n.t('screens.clubs.details'),
  179. )}
  180. {createScreenCollapsibleStack(
  181. 'feed-information',
  182. HomeStack,
  183. FeedItemScreen,
  184. i18n.t('screens.home.feed'),
  185. )}
  186. {createScreenCollapsibleStack(
  187. 'planning-information',
  188. HomeStack,
  189. PlanningDisplayScreen,
  190. i18n.t('screens.planning.eventDetails'),
  191. )}
  192. </HomeStack.Navigator>
  193. );
  194. }
  195. const PlanexStack = createStackNavigator();
  196. function PlanexStackComponent(): React.Node {
  197. return (
  198. <PlanexStack.Navigator
  199. initialRouteName="index"
  200. headerMode="screen"
  201. screenOptions={defaultScreenOptions}>
  202. {getWebsiteStack(
  203. 'index',
  204. PlanexStack,
  205. PlanexScreen,
  206. i18n.t('screens.planex.title'),
  207. )}
  208. {createScreenCollapsibleStack(
  209. 'group-select',
  210. PlanexStack,
  211. GroupSelectionScreen,
  212. '',
  213. )}
  214. </PlanexStack.Navigator>
  215. );
  216. }
  217. const Tab = createBottomTabNavigator();
  218. type PropsType = {
  219. defaultHomeRoute: string | null,
  220. defaultHomeData: {[key: string]: string},
  221. };
  222. export default class TabNavigator extends React.Component<PropsType> {
  223. createHomeStackComponent: () => React.Node;
  224. defaultRoute: string;
  225. constructor(props: PropsType) {
  226. super(props);
  227. if (props.defaultHomeRoute != null) this.defaultRoute = 'home';
  228. else
  229. this.defaultRoute = AsyncStorageManager.getString(
  230. AsyncStorageManager.PREFERENCES.defaultStartScreen.key,
  231. ).toLowerCase();
  232. this.createHomeStackComponent = (): React.Node =>
  233. HomeStackComponent(props.defaultHomeRoute, props.defaultHomeData);
  234. }
  235. render(): React.Node {
  236. return (
  237. <Tab.Navigator
  238. initialRouteName={this.defaultRoute}
  239. // eslint-disable-next-line react/jsx-props-no-spreading
  240. tabBar={(props: {...}): React.Node => <CustomTabBar {...props} />}>
  241. <Tab.Screen
  242. name="services"
  243. option
  244. component={ServicesStackComponent}
  245. options={{title: i18n.t('screens.services.title')}}
  246. />
  247. <Tab.Screen
  248. name="proxiwash"
  249. component={ProxiwashStackComponent}
  250. options={{title: i18n.t('screens.proxiwash.title')}}
  251. />
  252. <Tab.Screen
  253. name="home"
  254. component={this.createHomeStackComponent}
  255. options={{title: i18n.t('screens.home.title')}}
  256. />
  257. <Tab.Screen
  258. name="planning"
  259. component={PlanningStackComponent}
  260. options={{title: i18n.t('screens.planning.title')}}
  261. />
  262. <Tab.Screen
  263. name="planex"
  264. component={PlanexStackComponent}
  265. options={{title: i18n.t('screens.planex.title')}}
  266. />
  267. </Tab.Navigator>
  268. );
  269. }
  270. }