-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInfiniteScroll.js
60 lines (55 loc) · 1.48 KB
/
InfiniteScroll.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
import React, { useState, useCallback } from 'react';
import { FlatList, ActivityIndicator, View, StyleSheet, RefreshControl, Text } from 'react-native';
const InfiniteScroll = ({
data,
renderItem,
keyExtractor,
loadMore,
hasMore,
loaderComponent = <ActivityIndicator size="small" color="#0000ff" />,
listEmptyComponent = null,
onRefresh,
isRefreshing = false,
error = null,
errorComponent = <Text style={styles.errorText}>Something went wrong. Please try again.</Text>,
...flatListProps
}) => {
const [isLoading, setIsLoading] = useState(false);
const handleLoadMore = useCallback(async () => {
if (!isLoading && hasMore && !error) {
setIsLoading(true);
await loadMore();
setIsLoading(false);
}
}, [isLoading, hasMore, loadMore, error]);
return (
<FlatList
data={data}
renderItem={renderItem}
keyExtractor={keyExtractor}
onEndReached={handleLoadMore}
onEndReachedThreshold={0.5}
ListFooterComponent={
isLoading ? loaderComponent : error ? errorComponent : null
}
ListEmptyComponent={listEmptyComponent}
refreshControl={
onRefresh ? (
<RefreshControl refreshing={isRefreshing} onRefresh={onRefresh} />
) : undefined
}
{...flatListProps}
/>
);
};
const styles = StyleSheet.create({
loader: {
marginVertical: 20,
},
errorText: {
textAlign: 'center',
color: 'red',
marginVertical: 20,
},
});
export default InfiniteScroll;