import React from 'react'; import { ScrollView, Platform, FlatList, SectionList, RefreshControl, } from 'react-native'; import { ScrollView as GHScrollView } from 'react-native-gesture-handler'; import createNavigationAwareScrollable from './createNavigationAwareScrollable'; import invariant from './utils/invariant'; let WrappedScrollView; if (Platform.OS === 'android') { // @todo: use GHScrollView again when // https://github.com/kmagiera/react-native-gesture-handler/issues/560 has // been fixed. WrappedScrollView = createNavigationAwareScrollable(ScrollView); } else { WrappedScrollView = createNavigationAwareScrollable(GHScrollView); } function propsMaybeWithRefreshControl(props) { const onRefresh = props.onRefresh; if (onRefresh) { invariant( typeof props.refreshing === 'boolean', '`refreshing` prop must be set as a boolean in order to use `onRefresh`, but got `' + JSON.stringify(props.refreshing) + '`' ); return { ...props, refreshControl: props.refreshControl == null ? ( <RefreshControl refreshing={props.refreshing} onRefresh={onRefresh} progressViewOffset={props.progressViewOffset} /> ) : ( props.refreshControl ), }; } else { return props; } } const WrappedFlatList = React.forwardRef((props, ref) => ( <FlatList ref={ref} {...props} renderScrollComponent={props => ( <WrappedScrollView {...propsMaybeWithRefreshControl(props)} /> )} /> )); const WrappedSectionList = React.forwardRef((props, ref) => ( <SectionList ref={ref} {...props} renderScrollComponent={props => ( <WrappedScrollView {...propsMaybeWithRefreshControl(props)} /> )} /> )); // eslint-disable-next-line import/no-commonjs module.exports = { ScrollView: WrappedScrollView, FlatList: WrappedFlatList, SectionList: WrappedSectionList, };