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.

DrawerNavigator.js 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. // @flow
  2. import * as React from 'react';
  3. import {createDrawerNavigator} from '@react-navigation/drawer';
  4. import TabNavigator from './MainTabNavigator';
  5. import SettingsScreen from '../screens/Other/SettingsScreen';
  6. import AboutScreen from '../screens/About/AboutScreen';
  7. import AboutDependenciesScreen from '../screens/About/AboutDependenciesScreen';
  8. import SelfMenuScreen from '../screens/Other/SelfMenuScreen';
  9. import AvailableRoomScreen from "../screens/Websites/AvailableRoomScreen";
  10. import BibScreen from "../screens/Websites/BibScreen";
  11. import TetrisScreen from "../screens/Tetris/TetrisScreen";
  12. import DebugScreen from '../screens/About/DebugScreen';
  13. import Sidebar from "../components/Sidebar/Sidebar";
  14. import {createStackNavigator, TransitionPresets} from "@react-navigation/stack";
  15. import i18n from "i18n-js";
  16. import LoginScreen from "../screens/Amicale/LoginScreen";
  17. import ProfileScreen from "../screens/Amicale/ProfileScreen";
  18. import ClubListScreen from "../screens/Amicale/Clubs/ClubListScreen";
  19. import ClubDisplayScreen from "../screens/Amicale/Clubs/ClubDisplayScreen";
  20. import ClubAboutScreen from "../screens/Amicale/Clubs/ClubAboutScreen";
  21. import VoteScreen from "../screens/Amicale/VoteScreen";
  22. import AmicaleContactScreen from "../screens/Amicale/AmicaleContactScreen";
  23. import MaterialHeaderButtons, {Item} from "../components/Overrides/CustomHeaderButton";
  24. import {AmicaleWebsiteScreen} from "../screens/Websites/AmicaleWebsiteScreen";
  25. import {TutorInsaWebsiteScreen} from "../screens/Websites/TutorInsaWebsiteScreen";
  26. import {WiketudWebsiteScreen} from "../screens/Websites/WiketudWebsiteScreen";
  27. import {ElusEtudiantsWebsiteScreen} from "../screens/Websites/ElusEtudiantsWebsiteScreen";
  28. import {createCollapsibleStack} from "react-navigation-collapsible";
  29. import {useTheme} from "react-native-paper";
  30. const defaultScreenOptions = {
  31. gestureEnabled: true,
  32. cardOverlayEnabled: true,
  33. ...TransitionPresets.SlideFromRightIOS,
  34. };
  35. function getDrawerButton(navigation: Object) {
  36. return (
  37. <MaterialHeaderButtons left={true}>
  38. <Item title="menu" iconName="menu" onPress={navigation.openDrawer}/>
  39. </MaterialHeaderButtons>
  40. );
  41. }
  42. const AboutStack = createStackNavigator();
  43. function AboutStackComponent() {
  44. return (
  45. <AboutStack.Navigator
  46. initialRouteName="about"
  47. headerMode="float"
  48. screenOptions={defaultScreenOptions}
  49. >
  50. <AboutStack.Screen
  51. name="about"
  52. component={AboutScreen}
  53. options={({navigation}) => {
  54. const openDrawer = getDrawerButton.bind(this, navigation);
  55. return {
  56. title: i18n.t('screens.about'),
  57. headerLeft: openDrawer
  58. };
  59. }}
  60. />
  61. <AboutStack.Screen
  62. name="dependencies"
  63. component={AboutDependenciesScreen}
  64. options={{
  65. title: i18n.t('aboutScreen.libs')
  66. }}
  67. />
  68. <AboutStack.Screen
  69. name="debug"
  70. component={DebugScreen}
  71. options={{
  72. title: i18n.t('aboutScreen.debug')
  73. }}
  74. />
  75. </AboutStack.Navigator>
  76. );
  77. }
  78. const SettingsStack = createStackNavigator();
  79. function SettingsStackComponent() {
  80. return (
  81. <SettingsStack.Navigator
  82. initialRouteName="settings"
  83. headerMode="float"
  84. screenOptions={defaultScreenOptions}
  85. >
  86. <SettingsStack.Screen
  87. name="settings"
  88. component={SettingsScreen}
  89. options={({navigation}) => {
  90. const openDrawer = getDrawerButton.bind(this, navigation);
  91. return {
  92. title: i18n.t('screens.settings'),
  93. headerLeft: openDrawer
  94. };
  95. }}
  96. />
  97. </SettingsStack.Navigator>
  98. );
  99. }
  100. const SelfMenuStack = createStackNavigator();
  101. function SelfMenuStackComponent() {
  102. const {colors} = useTheme();
  103. return (
  104. <SelfMenuStack.Navigator
  105. initialRouteName="self-menu"
  106. headerMode="float"
  107. screenOptions={defaultScreenOptions}
  108. >
  109. {createCollapsibleStack(
  110. <SelfMenuStack.Screen
  111. name="self-menu"
  112. component={SelfMenuScreen}
  113. options={({navigation}) => {
  114. const openDrawer = getDrawerButton.bind(this, navigation);
  115. return {
  116. title: i18n.t('screens.menuSelf'),
  117. headerLeft: openDrawer,
  118. headerStyle: {
  119. backgroundColor: colors.surface,
  120. },
  121. };
  122. }}
  123. />,
  124. {
  125. collapsedColor: 'transparent',
  126. useNativeDriver: true,
  127. }
  128. )}
  129. </SelfMenuStack.Navigator>
  130. );
  131. }
  132. const AvailableRoomStack = createStackNavigator();
  133. function AvailableRoomStackComponent() {
  134. const {colors} = useTheme();
  135. return (
  136. <AvailableRoomStack.Navigator
  137. initialRouteName="available-rooms"
  138. headerMode="float"
  139. screenOptions={defaultScreenOptions}
  140. >
  141. {createCollapsibleStack(
  142. <AvailableRoomStack.Screen
  143. name="available-rooms"
  144. component={AvailableRoomScreen}
  145. options={({navigation}) => {
  146. const openDrawer = getDrawerButton.bind(this, navigation);
  147. return {
  148. title: i18n.t('screens.availableRooms'),
  149. headerLeft: openDrawer,
  150. headerStyle: {
  151. backgroundColor: colors.surface,
  152. },
  153. };
  154. }}
  155. />,
  156. {
  157. collapsedColor: 'transparent',
  158. useNativeDriver: false, // native driver does not work with webview
  159. }
  160. )}
  161. </AvailableRoomStack.Navigator>
  162. );
  163. }
  164. const BibStack = createStackNavigator();
  165. function BibStackComponent() {
  166. const {colors} = useTheme();
  167. return (
  168. <BibStack.Navigator
  169. initialRouteName="bib"
  170. headerMode="float"
  171. screenOptions={defaultScreenOptions}
  172. >
  173. {createCollapsibleStack(
  174. <BibStack.Screen
  175. name="bib"
  176. component={BibScreen}
  177. options={({navigation}) => {
  178. const openDrawer = getDrawerButton.bind(this, navigation);
  179. return {
  180. title: i18n.t('screens.bib'),
  181. headerLeft: openDrawer,
  182. headerStyle: {
  183. backgroundColor: colors.surface,
  184. },
  185. };
  186. }}
  187. />,
  188. {
  189. collapsedColor: 'transparent',
  190. useNativeDriver: false, // native driver does not work with webview
  191. }
  192. )}
  193. </BibStack.Navigator>
  194. );
  195. }
  196. const AmicaleWebsiteStack = createStackNavigator();
  197. function AmicaleWebsiteStackComponent() {
  198. const {colors} = useTheme();
  199. return (
  200. <AmicaleWebsiteStack.Navigator
  201. initialRouteName="amicale-website"
  202. headerMode="float"
  203. screenOptions={defaultScreenOptions}
  204. >
  205. {createCollapsibleStack(
  206. <AmicaleWebsiteStack.Screen
  207. name="amicale-website"
  208. component={AmicaleWebsiteScreen}
  209. options={({navigation}) => {
  210. const openDrawer = getDrawerButton.bind(this, navigation);
  211. return {
  212. title: "Amicale",
  213. headerLeft: openDrawer,
  214. headerStyle: {
  215. backgroundColor: colors.surface,
  216. },
  217. };
  218. }}
  219. />,
  220. {
  221. collapsedColor: 'transparent',
  222. useNativeDriver: false, // native driver does not work with webview
  223. }
  224. )}
  225. </AmicaleWebsiteStack.Navigator>
  226. );
  227. }
  228. const ElusEtudiantsStack = createStackNavigator();
  229. function ElusEtudiantsStackComponent() {
  230. const {colors} = useTheme();
  231. return (
  232. <ElusEtudiantsStack.Navigator
  233. initialRouteName="elus-etudiants"
  234. headerMode="float"
  235. screenOptions={defaultScreenOptions}
  236. >
  237. {createCollapsibleStack(
  238. <ElusEtudiantsStack.Screen
  239. name="elus-etudiants"
  240. component={ElusEtudiantsWebsiteScreen}
  241. options={({navigation}) => {
  242. const openDrawer = getDrawerButton.bind(this, navigation);
  243. return {
  244. title: "Élus Étudiants",
  245. headerLeft: openDrawer,
  246. headerStyle: {
  247. backgroundColor: colors.surface,
  248. },
  249. };
  250. }}
  251. />,
  252. {
  253. collapsedColor: 'transparent',
  254. useNativeDriver: false, // native driver does not work with webview
  255. }
  256. )}
  257. </ElusEtudiantsStack.Navigator>
  258. );
  259. }
  260. const WiketudStack = createStackNavigator();
  261. function WiketudStackComponent() {
  262. const {colors} = useTheme();
  263. return (
  264. <WiketudStack.Navigator
  265. initialRouteName="wiketud"
  266. headerMode="float"
  267. screenOptions={defaultScreenOptions}
  268. >
  269. {createCollapsibleStack(
  270. <WiketudStack.Screen
  271. name="wiketud"
  272. component={WiketudWebsiteScreen}
  273. options={({navigation}) => {
  274. const openDrawer = getDrawerButton.bind(this, navigation);
  275. return {
  276. title: "Wiketud",
  277. headerLeft: openDrawer,
  278. headerStyle: {
  279. backgroundColor: colors.surface,
  280. },
  281. };
  282. }}
  283. />,
  284. {
  285. collapsedColor: 'transparent',
  286. useNativeDriver: false, // native driver does not work with webview
  287. }
  288. )}
  289. </WiketudStack.Navigator>
  290. );
  291. }
  292. const TutorInsaStack = createStackNavigator();
  293. function TutorInsaStackComponent() {
  294. const {colors} = useTheme();
  295. return (
  296. <TutorInsaStack.Navigator
  297. initialRouteName="tutorinsa"
  298. headerMode="float"
  299. screenOptions={defaultScreenOptions}
  300. >
  301. {createCollapsibleStack(
  302. <TutorInsaStack.Screen
  303. name="tutorinsa"
  304. component={TutorInsaWebsiteScreen}
  305. options={({navigation}) => {
  306. const openDrawer = getDrawerButton.bind(this, navigation);
  307. return {
  308. title: "Tutor'INSA",
  309. headerLeft: openDrawer,
  310. headerStyle: {
  311. backgroundColor: colors.surface,
  312. },
  313. };
  314. }}
  315. />,
  316. {
  317. collapsedColor: 'transparent',
  318. useNativeDriver: false, // native driver does not work with webview
  319. }
  320. )}
  321. </TutorInsaStack.Navigator>
  322. );
  323. }
  324. const TetrisStack = createStackNavigator();
  325. function TetrisStackComponent() {
  326. return (
  327. <TetrisStack.Navigator
  328. initialRouteName="tetris"
  329. headerMode="float"
  330. screenOptions={defaultScreenOptions}
  331. >
  332. <TetrisStack.Screen
  333. name="tetris"
  334. component={TetrisScreen}
  335. options={({navigation}) => {
  336. const openDrawer = getDrawerButton.bind(this, navigation);
  337. return {
  338. title: i18n.t("game.title"),
  339. headerLeft: openDrawer
  340. };
  341. }}
  342. />
  343. </TetrisStack.Navigator>
  344. );
  345. }
  346. const LoginStack = createStackNavigator();
  347. function LoginStackComponent() {
  348. return (
  349. <LoginStack.Navigator
  350. initialRouteName="login"
  351. headerMode="float"
  352. screenOptions={defaultScreenOptions}
  353. >
  354. <LoginStack.Screen
  355. name="login"
  356. component={LoginScreen}
  357. options={({navigation}) => {
  358. const openDrawer = getDrawerButton.bind(this, navigation);
  359. return {
  360. title: i18n.t('screens.login'),
  361. headerLeft: openDrawer
  362. };
  363. }}
  364. />
  365. </LoginStack.Navigator>
  366. );
  367. }
  368. const ProfileStack = createStackNavigator();
  369. function ProfileStackComponent() {
  370. return (
  371. <ProfileStack.Navigator
  372. initialRouteName="profile"
  373. headerMode="float"
  374. screenOptions={defaultScreenOptions}
  375. >
  376. <ProfileStack.Screen
  377. name="profile"
  378. component={ProfileScreen}
  379. options={({navigation}) => {
  380. const openDrawer = getDrawerButton.bind(this, navigation);
  381. return {
  382. title: i18n.t('screens.profile'),
  383. headerLeft: openDrawer
  384. };
  385. }}
  386. />
  387. <ClubStack.Screen
  388. name="club-information"
  389. component={ClubDisplayScreen}
  390. options={({navigation}) => {
  391. return {
  392. title: i18n.t('screens.clubDisplayScreen'),
  393. ...TransitionPresets.ModalSlideFromBottomIOS,
  394. };
  395. }}
  396. />
  397. </ProfileStack.Navigator>
  398. );
  399. }
  400. const VoteStack = createStackNavigator();
  401. function VoteStackComponent() {
  402. return (
  403. <VoteStack.Navigator
  404. initialRouteName="vote"
  405. headerMode="float"
  406. screenOptions={defaultScreenOptions}
  407. >
  408. <VoteStack.Screen
  409. name="vote"
  410. component={VoteScreen}
  411. options={({navigation}) => {
  412. const openDrawer = getDrawerButton.bind(this, navigation);
  413. return {
  414. title: i18n.t('screens.vote'),
  415. headerLeft: openDrawer
  416. };
  417. }}
  418. />
  419. </VoteStack.Navigator>
  420. );
  421. }
  422. const AmicaleContactStack = createStackNavigator();
  423. function AmicaleContactStackComponent() {
  424. return (
  425. <AmicaleContactStack.Navigator
  426. initialRouteName="amicale-contact"
  427. headerMode="float"
  428. screenOptions={defaultScreenOptions}
  429. >
  430. <AmicaleContactStack.Screen
  431. name="amicale-contact"
  432. component={AmicaleContactScreen}
  433. options={({navigation}) => {
  434. const openDrawer = getDrawerButton.bind(this, navigation);
  435. return {
  436. title: i18n.t('screens.amicaleAbout'),
  437. headerLeft: openDrawer
  438. };
  439. }}
  440. />
  441. </AmicaleContactStack.Navigator>
  442. );
  443. }
  444. const ClubStack = createStackNavigator();
  445. function ClubStackComponent() {
  446. const {colors} = useTheme();
  447. return (
  448. <ClubStack.Navigator
  449. initialRouteName={"club-list"}
  450. headerMode="float"
  451. screenOptions={defaultScreenOptions}
  452. >
  453. {createCollapsibleStack(
  454. <ClubStack.Screen
  455. name="club-list"
  456. component={ClubListScreen}
  457. options={({navigation}) => {
  458. const openDrawer = getDrawerButton.bind(this, navigation);
  459. return {
  460. title: i18n.t('clubs.clubList'),
  461. headerLeft: openDrawer,
  462. headerStyle: {
  463. backgroundColor: colors.surface,
  464. },
  465. };
  466. }}
  467. />,
  468. {
  469. collapsedColor: 'transparent',
  470. useNativeDriver: true,
  471. }
  472. )}
  473. <ClubStack.Screen
  474. name="club-information"
  475. component={ClubDisplayScreen}
  476. options={({navigation}) => {
  477. return {
  478. title: i18n.t('screens.clubDisplayScreen'),
  479. ...TransitionPresets.ModalSlideFromBottomIOS,
  480. };
  481. }}
  482. />
  483. <ClubStack.Screen
  484. name="club-about"
  485. component={ClubAboutScreen}
  486. options={({navigation}) => {
  487. return {
  488. title: i18n.t('screens.clubsAbout'),
  489. ...TransitionPresets.ModalSlideFromBottomIOS,
  490. };
  491. }}
  492. />
  493. </ClubStack.Navigator>
  494. );
  495. }
  496. const Drawer = createDrawerNavigator();
  497. function getDrawerContent(props) {
  498. return <Sidebar {...props}/>
  499. }
  500. type Props = {
  501. defaultRoute: string | null,
  502. defaultData: Object
  503. }
  504. export default class DrawerNavigator extends React.Component<Props> {
  505. createTabNavigator: Object;
  506. constructor(props: Object) {
  507. super(props);
  508. this.createTabNavigator = () => <TabNavigator defaultRoute={props.defaultRoute}
  509. defaultData={props.defaultData}/>
  510. }
  511. render() {
  512. return (
  513. <Drawer.Navigator
  514. initialRouteName={'Main'}
  515. headerMode={'float'}
  516. backBehavior={'initialRoute'}
  517. drawerType={'front'}
  518. drawerContent={(props) => getDrawerContent(props)}
  519. screenOptions={defaultScreenOptions}
  520. >
  521. <Drawer.Screen
  522. name="main"
  523. component={this.createTabNavigator}
  524. >
  525. </Drawer.Screen>
  526. <Drawer.Screen
  527. name="settings"
  528. component={SettingsStackComponent}
  529. />
  530. <Drawer.Screen
  531. name="about"
  532. component={AboutStackComponent}
  533. />
  534. <Drawer.Screen
  535. name="self-menu"
  536. component={SelfMenuStackComponent}
  537. />
  538. <Drawer.Screen
  539. name="available-rooms"
  540. component={AvailableRoomStackComponent}
  541. />
  542. <Drawer.Screen
  543. name="bib"
  544. component={BibStackComponent}
  545. />
  546. <Drawer.Screen
  547. name="amicale-website"
  548. component={AmicaleWebsiteStackComponent}
  549. />
  550. <Drawer.Screen
  551. name="elus-etudiants"
  552. component={ElusEtudiantsStackComponent}
  553. />
  554. <Drawer.Screen
  555. name="wiketud"
  556. component={WiketudStackComponent}
  557. />
  558. <Drawer.Screen
  559. name="tutorinsa"
  560. component={TutorInsaStackComponent}
  561. />
  562. <Drawer.Screen
  563. name="tetris"
  564. component={TetrisStackComponent}
  565. />
  566. <Drawer.Screen
  567. name="login"
  568. component={LoginStackComponent}
  569. />
  570. <Drawer.Screen
  571. name="profile"
  572. component={ProfileStackComponent}
  573. />
  574. <Drawer.Screen
  575. name="club-list"
  576. component={ClubStackComponent}
  577. />
  578. <Drawer.Screen
  579. name="vote"
  580. component={VoteStackComponent}
  581. />
  582. <Drawer.Screen
  583. name="amicale-contact"
  584. component={AmicaleContactStackComponent}
  585. />
  586. </Drawer.Navigator>
  587. );
  588. }
  589. }