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,
};