-
Notifications
You must be signed in to change notification settings - Fork 4
/
GiftedVirtualizedList.js
88 lines (78 loc) · 2.27 KB
/
GiftedVirtualizedList.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import React from 'react'
import PropTypes from 'prop-types'
import InfiniteVirtualizedList from './InfiniteVirtualizedList'
export default class GiftedVirtualizedList extends React.PureComponent {
static propTypes = {
onFetch: PropTypes.func.isRequired,
rowView: PropTypes.func.isRequired,
paginationWaitingView: PropTypes.func.isRequired,
emptyView: PropTypes.func,
paginationAllLoadedView: PropTypes.func.isRequired,
refreshable: PropTypes.bool.isRequired,
enableEmptySections: PropTypes.bool.isRequired,
pagination: PropTypes.bool.isRequired,
removeRow: PropTypes.func,
}
state = {
list: [],
page: 1,
refreshing: false,
}
componentDidMount() {
this.loadNextPage()
}
loadNextPage = () => {
const { onFetch } = this.props
this.setState({
isNextPageLoading: true,
})
onFetch(this.state.page, (items, { allLoaded }) => {
this.setState(({ list, page }) => ({
isNextPageLoading: false,
hasNextPage: !allLoaded,
list: list.concat(Array.isArray(items) ? items : []),
page: page + 1,
refreshing: false,
}))
})
}
refresh = () => {
this.setState({
list: [],
page: 1,
refreshing: true,
}, this.loadNextPage )
}
_refresh = () => {
this.refresh()
}
removeItem = (row) => {
this.setState(({list}, {removeRow = l => l}) => ({
list: removeRow(list, row)
}))
}
renderItem = ({ item, index }) => {
return this.props.rowView(item, index)
}
render() {
const { list, hasNextPage, isNextPageLoading, refreshing } = this.state
const { emptyView, paginationWaitingView, headerView, refreshable, ...otherProps } = this.props
if (emptyView && list.length === 0) return emptyView()
return (
<InfiniteVirtualizedList
data={list}
hasNextPage={hasNextPage}
isNextPageLoading={isNextPageLoading}
loadNextPage={this.loadNextPage}
renderItem={this.renderItem}
paginationWaitingView={paginationWaitingView}
getItem={(data, index) => list[index]}
getItemCount={() => list.length}
ListHeaderComponent={headerView}
onRefresh={refreshable ? this.refresh : null}
refreshing={refreshing}
{...otherProps}
/>
)
}
}