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

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