|
1 | 1 | import React, { PureComponent } from 'react'; |
2 | 2 | import PropTypes from 'prop-types'; |
3 | | -import { View, FlatList, Image } from 'react-native'; |
| 3 | +import { ViewPropTypes, View, FlatList } from 'react-native'; |
4 | 4 |
|
5 | | -import { width, horizontal } from '../../themes'; |
| 5 | +import { width } from '../../themes'; |
6 | 6 |
|
7 | 7 | import styles from './styles'; |
8 | 8 |
|
9 | | -const space = horizontal.xxSmall; |
10 | 9 | const calcGridDimension = numColumns => ({ |
11 | | - height: width / numColumns - space, |
12 | | - width: width / numColumns - space, |
| 10 | + height: width / numColumns, |
| 11 | + width: width / numColumns, |
13 | 12 | }); |
14 | 13 |
|
15 | 14 | export default class ListGrid extends PureComponent { |
16 | 15 | static propTypes = { |
17 | 16 | data: PropTypes.array.isRequired, |
18 | 17 | numColumns: PropTypes.number.isRequired, |
| 18 | + renderItem: PropTypes.func.isRequired, |
| 19 | + showSeparator: PropTypes.bool, |
| 20 | + itemStyle: ViewPropTypes.style, |
19 | 21 | }; |
20 | 22 |
|
21 | 23 | static defaultProps = { |
22 | 24 | numColumns: 3, |
23 | | - }; |
24 | | - |
25 | | - state = { |
26 | | - index: 0, |
| 25 | + itemStyle: {}, |
| 26 | + showSeparator: false, |
27 | 27 | }; |
28 | 28 |
|
29 | 29 | itemDimension = calcGridDimension(this.props.numColumns); |
30 | 30 |
|
31 | | - keyExtractor = item => item.id; |
| 31 | + _keyExtractor = (item, index) => index; |
32 | 32 |
|
33 | | - renderItem = ({ item, index }) => { |
34 | | - const { numColumns } = this.props; |
35 | | - const position = index % numColumns; |
36 | | - let style = styles.imageCenter; |
37 | | - if (position === 0) { |
38 | | - style = styles.imageRight; |
39 | | - } else if (position === numColumns - 1) { |
40 | | - style = styles.imageLeft; |
| 33 | + _renderItem = ({ item, index }) => { |
| 34 | + const { showSeparator, renderItem, numColumns, itemStyle } = this.props; |
| 35 | + let style = {}; |
| 36 | + if (showSeparator) { |
| 37 | + const position = index % numColumns; |
| 38 | + if (position === 0 && numColumns !== 1) { |
| 39 | + style = styles.imageLeft; |
| 40 | + } else if (position === numColumns - 1) { |
| 41 | + style = styles.imageRight; |
| 42 | + } else { |
| 43 | + style = styles.imageCenter; |
| 44 | + } |
41 | 45 | } |
42 | 46 | return ( |
43 | | - <View style={style}> |
44 | | - <Image |
45 | | - style={[styles.image, this.itemDimension]} |
46 | | - source={item.thumbnail} |
47 | | - resizeMethod="resize" |
48 | | - /> |
| 47 | + <View style={[style, this.itemDimension, itemStyle]}> |
| 48 | + {renderItem({ item, index })} |
49 | 49 | </View> |
50 | 50 | ); |
51 | 51 | }; |
52 | 52 |
|
53 | 53 | render() { |
54 | | - const { data, numColumns } = this.props; |
| 54 | + const { showSeparator, ...props } = this.props; |
55 | 55 | return ( |
56 | 56 | <FlatList |
57 | | - numColumns={numColumns} |
58 | | - data={data} |
59 | | - keyExtractor={this.keyExtractor} |
60 | | - renderItem={this.renderItem} |
| 57 | + contentContainerStyle={styles.container} |
| 58 | + keyExtractor={this._keyExtractor} |
| 59 | + ItemSeparatorComponent={() => |
| 60 | + showSeparator ? <View style={styles.separator} /> : null |
| 61 | + } |
61 | 62 | showsVerticalScrollIndicator={false} |
62 | | - ItemSeparatorComponent={() => <View style={styles.separator} />} |
| 63 | + {...props} |
| 64 | + renderItem={this._renderItem} |
63 | 65 | /> |
64 | 66 | ); |
65 | 67 | } |
|
0 commit comments