Application Android et IOS pour l'amicale des élèves
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

ProximoListScreen.js 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import React from 'react';
  2. import {Container, Text, Content, ListItem, Left, Thumbnail, Right, Button, Icon} from 'native-base';
  3. import CustomHeader from "../../components/CustomHeader";
  4. import {AsyncStorage, FlatList, View} from "react-native";
  5. import Touchable from 'react-native-platform-touchable';
  6. import Menu, {MenuItem, MenuDivider} from 'react-native-material-menu';
  7. import i18n from "i18n-js";
  8. const IMG_URL = "https://etud.insa-toulouse.fr/~vergnet/appli-amicale/img/";
  9. const defaultImage = require('../../assets/image-missing.png');
  10. const sortMode = {
  11. price: "0",
  12. name: '1',
  13. };
  14. function sortPrice(a, b) {
  15. return a.price - b.price;
  16. }
  17. function sortPriceReverse(a, b) {
  18. return b.price - a.price;
  19. }
  20. function sortName(a, b) {
  21. if (a.name < b.name)
  22. return -1;
  23. if (a.name > b.name)
  24. return 1;
  25. return 0;
  26. }
  27. function sortNameReverse(a, b) {
  28. if (a.name < b.name)
  29. return 1;
  30. if (a.name > b.name)
  31. return -1;
  32. return 0;
  33. }
  34. export default class ProximoMainScreen extends React.Component {
  35. constructor(props) {
  36. super(props);
  37. this.state = {
  38. navData: this.props.navigation.getParam('data', []).sort(sortPrice),
  39. currentSortMode: sortMode.price,
  40. isSortReversed: false,
  41. sortPriceIcon: '',
  42. sortNameIcon: '',
  43. };
  44. }
  45. setMenuRef = ref => {
  46. this._menu = ref;
  47. };
  48. toggleSortMode(mode) {
  49. let isReverse = this.state.isSortReversed;
  50. if (mode === this.state.currentSortMode) // reverse mode
  51. isReverse = !isReverse; // this.state not updating on this function cycle
  52. else
  53. isReverse = false;
  54. this.setSortMode(mode, isReverse);
  55. }
  56. setSortMode(mode, isReverse) {
  57. this.setState({
  58. currentSortMode: mode,
  59. isSortReversed: isReverse
  60. });
  61. let data = this.state.navData;
  62. switch (mode) {
  63. case sortMode.price:
  64. if (isReverse) {
  65. data.sort(sortPriceReverse);
  66. } else {
  67. data.sort(sortPrice);
  68. }
  69. break;
  70. case sortMode.name:
  71. if (isReverse) {
  72. data.sort(sortNameReverse);
  73. } else {
  74. data.sort(sortName);
  75. }
  76. break;
  77. }
  78. this.setState({
  79. navData: data,
  80. });
  81. this.setupSortIcons(mode, isReverse);
  82. this._menu.hide();
  83. }
  84. componentDidMount() {
  85. this.setSortMode(this.state.currentSortMode, this.state.isSortReversed);
  86. }
  87. setupSortIcons(mode, isReverse) {
  88. const downSortIcon =
  89. <Icon
  90. active
  91. name={'sort-descending'}
  92. type={'MaterialCommunityIcons'}/>;
  93. const upSortIcon =
  94. <Icon
  95. active
  96. name={'sort-ascending'}
  97. type={'MaterialCommunityIcons'}/>;
  98. switch (mode) {
  99. case sortMode.price:
  100. this.setState({sortNameIcon: ''});
  101. if (isReverse) {
  102. this.setState({sortPriceIcon: upSortIcon});
  103. } else {
  104. this.setState({sortPriceIcon: downSortIcon});
  105. }
  106. break;
  107. case sortMode.name:
  108. this.setState({sortPriceIcon: ''});
  109. if (isReverse) {
  110. this.setState({sortNameIcon: upSortIcon});
  111. } else {
  112. this.setState({sortNameIcon: downSortIcon});
  113. }
  114. break;
  115. }
  116. }
  117. render() {
  118. const nav = this.props.navigation;
  119. const navType = nav.getParam('type', 'Empty');
  120. return (
  121. <Container>
  122. <CustomHeader backButton={true} navigation={nav} title={navType} rightMenu={
  123. <Right>
  124. <Menu
  125. ref={this.setMenuRef}
  126. button={
  127. <Touchable
  128. style={{padding: 6}}
  129. onPress={() =>
  130. this._menu.show()
  131. }>
  132. <Icon
  133. style={{color: "#fff"}}
  134. name="sort"
  135. type={'MaterialCommunityIcons'}/>
  136. </Touchable>
  137. }
  138. >
  139. <MenuItem
  140. onPress={() => this.toggleSortMode(sortMode.name)}>
  141. {this.state.sortNameIcon}
  142. {i18n.t('proximoScreen.sortName')}
  143. </MenuItem>
  144. <MenuItem
  145. onPress={() => this.toggleSortMode(sortMode.price)}>
  146. {this.state.sortPriceIcon}
  147. {i18n.t('proximoScreen.sortPrice')}
  148. </MenuItem>
  149. </Menu>
  150. </Right>
  151. }/>
  152. <Content>
  153. <FlatList
  154. data={this.state.navData}
  155. extraData={this.state.navData}
  156. keyExtractor={(item, index) => item.name}
  157. style={{minHeight: 300, width: '100%'}}
  158. renderItem={({item}) =>
  159. <ListItem
  160. thumbnail
  161. onPress={() => {
  162. console.log(IMG_URL + item.name + '.jpg')
  163. }}
  164. >
  165. <Left>
  166. <Thumbnail square source={{uri: IMG_URL + item.name + '.jpg'}}/>
  167. <Text style={{marginLeft: 20}}>
  168. {item.name}
  169. </Text>
  170. </Left>
  171. <Right style={{flex: 1}}>
  172. <Text>
  173. {item.price}€
  174. </Text>
  175. </Right>
  176. </ListItem>}
  177. />
  178. </Content>
  179. </Container>
  180. );
  181. }
  182. }