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.

Sidebar.js 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. // @flow
  2. import * as React from 'react';
  3. import {Dimensions, FlatList, Image, Linking, Platform, StyleSheet} from 'react-native';
  4. import {Badge, Container, Left, ListItem, Right, Text} from "native-base";
  5. import i18n from "i18n-js";
  6. import CustomMaterialIcon from '../components/CustomMaterialIcon';
  7. import ThemeManager from "../utils/ThemeManager";
  8. const deviceWidth = Dimensions.get("window").width;
  9. const drawerCover = require("../assets/drawer-cover.png");
  10. type Props = {
  11. navigation: Object,
  12. };
  13. type State = {
  14. active: string,
  15. };
  16. /**
  17. * Class used to define a navigation drawer
  18. */
  19. export default class SideBar extends React.Component<Props, State> {
  20. dataSet: Array<Object>;
  21. state = {
  22. active: 'Home',
  23. };
  24. getRenderItem: Function;
  25. /**
  26. * Generate the datasets
  27. *
  28. * @param props
  29. */
  30. constructor(props: Props) {
  31. super(props);
  32. // Dataset used to render the drawer
  33. // If the link field is defined, clicking on the item will open the link
  34. this.dataSet = [
  35. {
  36. name: i18n.t('sidenav.divider1'),
  37. route: "Divider1"
  38. },
  39. {
  40. name: "Amicale",
  41. route: "AmicaleScreen",
  42. icon: "alpha-a-box",
  43. },
  44. {
  45. name: "Élus Étudiants",
  46. route: "ElusEtudScreen",
  47. icon: "alpha-e-box",
  48. },
  49. {
  50. name: "Wiketud",
  51. route: "WiketudScreen",
  52. icon: "wikipedia",
  53. },
  54. {
  55. name: "Tutor'INSA",
  56. route: "TutorInsaScreen",
  57. icon: "school",
  58. },
  59. {
  60. name: i18n.t('sidenav.divider2'),
  61. route: "Divider2"
  62. },
  63. {
  64. name: i18n.t('screens.bluemind'),
  65. route: "BlueMindScreen",
  66. icon: "email",
  67. },
  68. {
  69. name: i18n.t('screens.ent'),
  70. route: "EntScreen",
  71. icon: "notebook",
  72. },
  73. {
  74. name: i18n.t('screens.availableRooms'),
  75. route: "AvailableRoomScreen",
  76. icon: "calendar-check",
  77. },
  78. {
  79. name: i18n.t('screens.menuSelf'),
  80. route: "SelfMenuScreen",
  81. icon: "silverware-fork-knife",
  82. },
  83. {
  84. name: i18n.t('sidenav.divider3'),
  85. route: "Divider3"
  86. },
  87. {
  88. name: i18n.t('screens.settings'),
  89. route: "SettingsScreen",
  90. icon: "settings",
  91. },
  92. {
  93. name: i18n.t('screens.about'),
  94. route: "AboutScreen",
  95. icon: "information",
  96. },
  97. ];
  98. this.getRenderItem = this.getRenderItem.bind(this);
  99. }
  100. shouldComponentUpdate(nextProps: Props, nextState: State): boolean {
  101. return nextState.active !== this.state.active;
  102. }
  103. onListItemPress(item: Object) {
  104. if (item.link !== undefined)
  105. Linking.openURL(item.link).catch((err) => console.error('Error opening link', err));
  106. else
  107. this.navigateToScreen(item.route);
  108. }
  109. listKeyExtractor(item: Object) {
  110. return item.route;
  111. }
  112. getRenderItem({item}: Object) {
  113. if (item.icon !== undefined) {
  114. return (
  115. <ListItem
  116. button
  117. noBorder
  118. selected={this.state.active === item.route}
  119. onPress={this.onListItemPress.bind(this, item)}
  120. >
  121. <Left>
  122. <CustomMaterialIcon
  123. icon={item.icon}
  124. active={this.state.active === item.route}
  125. />
  126. <Text style={styles.text}>
  127. {item.name}
  128. </Text>
  129. </Left>
  130. {item.types &&
  131. <Right style={{flex: 1}}>
  132. <Badge
  133. style={{
  134. borderRadius: 3,
  135. height: 25,
  136. width: 72,
  137. backgroundColor: item.bg
  138. }}
  139. >
  140. <Text
  141. style={styles.badgeText}
  142. >{`${item.types} Types`}</Text>
  143. </Badge>
  144. </Right>}
  145. </ListItem>
  146. );
  147. } else {
  148. return (
  149. <ListItem itemDivider>
  150. <Text>{item.name}</Text>
  151. </ListItem>
  152. );
  153. }
  154. }
  155. /**
  156. * Navigate to the selected route
  157. * @param route {string} The route name to navigate to
  158. */
  159. navigateToScreen(route: string) {
  160. this.props.navigation.navigate(route);
  161. };
  162. render() {
  163. // console.log("rendering SideBar");
  164. return (
  165. <Container style={{
  166. backgroundColor: ThemeManager.getCurrentThemeVariables().sideMenuBgColor,
  167. }}>
  168. <Image source={drawerCover} style={styles.drawerCover}/>
  169. <FlatList
  170. data={this.dataSet}
  171. extraData={this.state}
  172. keyExtractor={this.listKeyExtractor}
  173. renderItem={this.getRenderItem}
  174. />
  175. </Container>
  176. );
  177. }
  178. }
  179. const styles = StyleSheet.create({
  180. drawerCover: {
  181. height: deviceWidth / 3,
  182. width: 2 * deviceWidth / 3,
  183. position: "relative",
  184. marginBottom: 10,
  185. marginTop: 20
  186. },
  187. text: {
  188. fontWeight: Platform.OS === "ios" ? "500" : "400",
  189. fontSize: 16,
  190. marginLeft: 20
  191. },
  192. badgeText: {
  193. fontSize: Platform.OS === "ios" ? 13 : 11,
  194. fontWeight: "400",
  195. textAlign: "center",
  196. marginTop: Platform.OS === "android" ? -3 : undefined
  197. }
  198. });