Skip to content

Commit

Permalink
Merge pull request #23879 from Parshvi16/issue16200-migrate-ScrollVie…
Browse files Browse the repository at this point in the history
…wWithContext.js

migrated ScrollViewWithContext to a functional component
  • Loading branch information
madmax330 authored Aug 1, 2023
2 parents 9dc5f19 + 3fd0ead commit 9ca08e9
Showing 1 changed file with 31 additions and 39 deletions.
70 changes: 31 additions & 39 deletions src/components/ScrollViewWithContext.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React from 'react';
import React, {useState, useRef} from 'react';
import {ScrollView} from 'react-native';

const MIN_SMOOTH_SCROLL_EVENT_THROTTLE = 16;
Expand All @@ -15,47 +15,40 @@ const propTypes = ScrollView.propTypes;
* Using this wrapper will automatically handle scrolling to the picker's <TextInput />
* when the picker modal is opened
*/
class ScrollViewWithContext extends React.Component {
constructor(props) {
super(props);

this.state = {
contentOffsetY: 0,
};
this.scrollViewRef = this.props.innerRef || React.createRef(null);

this.setContextScrollPosition = this.setContextScrollPosition.bind(this);
}

setContextScrollPosition(event) {
if (this.props.onScroll) {
this.props.onScroll(event);
function ScrollViewWithContext({onScroll, scrollEventThrottle, children, innerRef, ...restProps}) {
const [contentOffsetY, setContentOffsetY] = useState(0);
const defaultScrollViewRef = useRef();
const scrollViewRef = innerRef || defaultScrollViewRef;

const setContextScrollPosition = (event) => {
if (onScroll) {
onScroll(event);
}
this.setState({contentOffsetY: event.nativeEvent.contentOffset.y});
}

render() {
return (
<ScrollView
// eslint-disable-next-line react/jsx-props-no-spreading
{...this.props}
ref={this.scrollViewRef}
onScroll={this.setContextScrollPosition}
scrollEventThrottle={this.props.scrollEventThrottle || MIN_SMOOTH_SCROLL_EVENT_THROTTLE}
setContentOffsetY(event.nativeEvent.contentOffset.y);
};

return (
<ScrollView
// eslint-disable-next-line react/jsx-props-no-spreading
{...restProps}
ref={scrollViewRef}
onScroll={setContextScrollPosition}
scrollEventThrottle={scrollEventThrottle || MIN_SMOOTH_SCROLL_EVENT_THROTTLE}
>
<ScrollContext.Provider
value={{
scrollViewRef,
contentOffsetY,
}}
>
<ScrollContext.Provider
value={{
scrollViewRef: this.scrollViewRef,
contentOffsetY: this.state.contentOffsetY,
}}
>
{this.props.children}
</ScrollContext.Provider>
</ScrollView>
);
}
{children}
</ScrollContext.Provider>
</ScrollView>
);
}

ScrollViewWithContext.propTypes = propTypes;
ScrollViewWithContext.displayName = 'ScrollViewWithContext';

export default React.forwardRef((props, ref) => (
<ScrollViewWithContext
Expand All @@ -64,5 +57,4 @@ export default React.forwardRef((props, ref) => (
innerRef={ref}
/>
));

export {ScrollContext};

0 comments on commit 9ca08e9

Please sign in to comment.