mirror of
https://github.com/zhigang1992/react-navigation.git
synced 2026-02-13 17:47:32 +08:00
76 lines
1.9 KiB
JavaScript
76 lines
1.9 KiB
JavaScript
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,
|
|
};
|