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.

MainTabNavigator.js 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import * as React from 'react';
  2. import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
  3. import {createMaterialBottomTabNavigator} from "@react-navigation/material-bottom-tabs";
  4. import HomeScreen from '../screens/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/Websites/PlanexScreen';
  13. import {MaterialCommunityIcons} from "@expo/vector-icons";
  14. import AsyncStorageManager from "../managers/AsyncStorageManager";
  15. import HeaderButton from "../components/Custom/HeaderButton";
  16. import {withTheme} from 'react-native-paper';
  17. import i18n from "i18n-js";
  18. import ClubDisplayScreen from "../screens/Amicale/Clubs/ClubDisplayScreen";
  19. const TAB_ICONS = {
  20. home: 'triangle',
  21. planning: 'calendar-range',
  22. proxiwash: 'tshirt-crew',
  23. proximo: 'cart',
  24. planex: 'clock',
  25. };
  26. const defaultScreenOptions = {
  27. gestureEnabled: true,
  28. cardOverlayEnabled: true,
  29. ...TransitionPresets.SlideFromRightIOS,
  30. };
  31. function getDrawerButton(navigation: Object) {
  32. return (
  33. <HeaderButton icon={'menu'} onPress={navigation.openDrawer}/>
  34. );
  35. }
  36. const ProximoStack = createStackNavigator();
  37. function ProximoStackComponent() {
  38. return (
  39. <ProximoStack.Navigator
  40. initialRouteName="index"
  41. headerMode="float"
  42. screenOptions={defaultScreenOptions}
  43. >
  44. <ProximoStack.Screen
  45. name="index"
  46. options={({navigation}) => {
  47. const openDrawer = getDrawerButton.bind(this, navigation);
  48. return {
  49. title: 'Proximo',
  50. headerLeft: openDrawer
  51. };
  52. }}
  53. component={ProximoMainScreen}
  54. />
  55. <ProximoStack.Screen
  56. name="proximo-list"
  57. options={{
  58. title: 'Articles'
  59. }}
  60. component={ProximoListScreen}
  61. />
  62. <ProximoStack.Screen
  63. name="proximo-about"
  64. component={ProximoAboutScreen}
  65. options={{
  66. title: 'Proximo',
  67. ...TransitionPresets.ModalSlideFromBottomIOS,
  68. }}
  69. />
  70. </ProximoStack.Navigator>
  71. );
  72. }
  73. const ProxiwashStack = createStackNavigator();
  74. function ProxiwashStackComponent() {
  75. return (
  76. <ProxiwashStack.Navigator
  77. initialRouteName="index"
  78. headerMode='float'
  79. screenOptions={defaultScreenOptions}
  80. >
  81. <ProxiwashStack.Screen
  82. name="index"
  83. component={ProxiwashScreen}
  84. options={({navigation}) => {
  85. const openDrawer = getDrawerButton.bind(this, navigation);
  86. return {
  87. title: 'Proxiwash',
  88. headerLeft: openDrawer
  89. };
  90. }}
  91. />
  92. <ProxiwashStack.Screen
  93. name="proxiwash-about"
  94. component={ProxiwashAboutScreen}
  95. options={{
  96. title: 'Proxiwash',
  97. ...TransitionPresets.ModalSlideFromBottomIOS,
  98. }}
  99. />
  100. </ProxiwashStack.Navigator>
  101. );
  102. }
  103. const PlanningStack = createStackNavigator();
  104. function PlanningStackComponent() {
  105. return (
  106. <PlanningStack.Navigator
  107. initialRouteName="index"
  108. headerMode='float'
  109. screenOptions={defaultScreenOptions}
  110. >
  111. <PlanningStack.Screen
  112. name="index"
  113. component={PlanningScreen}
  114. options={({navigation}) => {
  115. const openDrawer = getDrawerButton.bind(this, navigation);
  116. return {
  117. title: 'Planning',
  118. headerLeft: openDrawer
  119. };
  120. }}
  121. />
  122. <PlanningStack.Screen
  123. name="planning-information"
  124. component={PlanningDisplayScreen}
  125. options={{
  126. title: 'Details',
  127. ...TransitionPresets.ModalSlideFromBottomIOS,
  128. }}
  129. />
  130. </PlanningStack.Navigator>
  131. );
  132. }
  133. const HomeStack = createStackNavigator();
  134. function HomeStackComponent(initialRoute: string | null, defaultData: Object) {
  135. let data;
  136. if (initialRoute !== null)
  137. data = {data: defaultData, nextScreen: initialRoute, shouldOpen: true};
  138. return (
  139. <HomeStack.Navigator
  140. initialRouteName={"index"}
  141. headerMode="float"
  142. screenOptions={defaultScreenOptions}
  143. >
  144. <HomeStack.Screen
  145. name="index"
  146. component={HomeScreen}
  147. options={({navigation}) => {
  148. const openDrawer = getDrawerButton.bind(this, navigation);
  149. return {
  150. title: i18n.t('screens.home'),
  151. headerLeft: openDrawer
  152. };
  153. }}
  154. initialParams={data}
  155. />
  156. <HomeStack.Screen
  157. name="planning-information"
  158. component={PlanningDisplayScreen}
  159. options={{
  160. title: 'Details',
  161. ...TransitionPresets.ModalSlideFromBottomIOS,
  162. }}
  163. />
  164. <HomeStack.Screen
  165. name="club-information"
  166. component={ClubDisplayScreen}
  167. options={({navigation}) => {
  168. return {
  169. title: "",
  170. ...TransitionPresets.ModalSlideFromBottomIOS,
  171. };
  172. }}
  173. />
  174. </HomeStack.Navigator>
  175. );
  176. }
  177. const PlanexStack = createStackNavigator();
  178. function PlanexStackComponent() {
  179. return (
  180. <PlanexStack.Navigator
  181. initialRouteName="index"
  182. headerMode="float"
  183. screenOptions={defaultScreenOptions}
  184. >
  185. <PlanexStack.Screen
  186. name="index"
  187. component={PlanexScreen}
  188. options={({navigation}) => {
  189. const openDrawer = getDrawerButton.bind(this, navigation);
  190. return {
  191. title: 'Planex',
  192. headerLeft: openDrawer
  193. };
  194. }}
  195. />
  196. </PlanexStack.Navigator>
  197. );
  198. }
  199. const Tab = createMaterialBottomTabNavigator();
  200. type Props = {
  201. defaultRoute: string | null,
  202. defaultData: Object
  203. }
  204. class TabNavigator extends React.Component<Props>{
  205. createHomeStackComponent: Object;
  206. colors: Object;
  207. defaultRoute: string;
  208. constructor(props) {
  209. super(props);
  210. this.colors = props.theme.colors;
  211. this.defaultRoute = AsyncStorageManager.getInstance().preferences.defaultStartScreen.current.toLowerCase();
  212. if (props.defaultRoute !== null)
  213. this.defaultRoute = 'home';
  214. this.createHomeStackComponent = () => HomeStackComponent(props.defaultRoute, props.defaultData);
  215. }
  216. render() {
  217. return (
  218. <Tab.Navigator
  219. initialRouteName={this.defaultRoute}
  220. barStyle={{backgroundColor: this.colors.surface}}
  221. screenOptions={({route}) => ({
  222. tabBarIcon: ({focused, color, size}) => {
  223. let icon = TAB_ICONS[route.name];
  224. // tintColor is ignoring activeColor and inactiveColor for some reason
  225. icon = focused ? icon : icon + ('-outline');
  226. return <MaterialCommunityIcons name={icon} color={color} size={26}/>;
  227. },
  228. })}
  229. activeColor={this.colors.primary}
  230. inactiveColor={this.colors.tabIcon}
  231. >
  232. <Tab.Screen
  233. name="proximo"
  234. component={ProximoStackComponent}
  235. />
  236. <Tab.Screen
  237. name="planning"
  238. component={PlanningStackComponent}
  239. />
  240. <Tab.Screen
  241. name="home"
  242. component={this.createHomeStackComponent}
  243. options={{title: i18n.t('screens.home')}}
  244. />
  245. <Tab.Screen
  246. name="proxiwash"
  247. component={ProxiwashStackComponent}
  248. />
  249. <Tab.Screen
  250. name="planex"
  251. component={PlanexStackComponent}
  252. />
  253. </Tab.Navigator>
  254. );
  255. }
  256. }
  257. export default withTheme(TabNavigator);