Add onPageScroll prop to Pager

This commit is contained in:
Dan Abramov
2023-10-13 20:38:58 +01:00
parent bf7e127cfb
commit 62ac40cb39
2 changed files with 30 additions and 2 deletions
+25 -2
View File
@@ -1,6 +1,7 @@
import React, {forwardRef} from 'react' import React, {forwardRef} from 'react'
import {Animated, View} from 'react-native' import {View} from 'react-native'
import PagerView, {PagerViewOnPageSelectedEvent} from 'react-native-pager-view' import PagerView, {PagerViewOnPageSelectedEvent} from 'react-native-pager-view'
import Animated, { useHandler, useEvent } from 'react-native-reanimated';
import {s} from 'lib/styles' import {s} from 'lib/styles'
export type PageSelectedEvent = PagerViewOnPageSelectedEvent export type PageSelectedEvent = PagerViewOnPageSelectedEvent
@@ -20,9 +21,11 @@ interface Props {
tabBarPosition?: 'top' | 'bottom' tabBarPosition?: 'top' | 'bottom'
initialPage?: number initialPage?: number
renderTabBar: RenderTabBarFn renderTabBar: RenderTabBarFn
onPageScroll?: (e: any) => void
onPageSelected?: (index: number) => void onPageSelected?: (index: number) => void
testID?: string testID?: string
} }
export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>( export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>(
function PagerImpl( function PagerImpl(
{ {
@@ -30,6 +33,7 @@ export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>(
tabBarPosition = 'top', tabBarPosition = 'top',
initialPage = 0, initialPage = 0,
renderTabBar, renderTabBar,
onPageScroll,
onPageSelected, onPageSelected,
testID, testID,
}: React.PropsWithChildren<Props>, }: React.PropsWithChildren<Props>,
@@ -57,6 +61,7 @@ export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>(
[pagerView], [pagerView],
) )
const handlePageScroll = usePageScrollHandler({ onPageScroll });
return ( return (
<View testID={testID}> <View testID={testID}>
{tabBarPosition === 'top' && {tabBarPosition === 'top' &&
@@ -68,7 +73,8 @@ export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>(
ref={pagerView} ref={pagerView}
style={s.h100pct} style={s.h100pct}
initialPage={initialPage} initialPage={initialPage}
onPageSelected={onPageSelectedInner}> onPageSelected={onPageSelectedInner}
onPageScroll={handlePageScroll}>
{children} {children}
</AnimatedPagerView> </AnimatedPagerView>
{tabBarPosition === 'bottom' && {tabBarPosition === 'bottom' &&
@@ -80,3 +86,20 @@ export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>(
) )
}, },
) )
function usePageScrollHandler(handlers, dependencies) {
const { context, doDependenciesDiffer } = useHandler(handlers, dependencies);
const subscribeForEvents = ['onPageScroll'];
return useEvent(
(event) => {
'worklet';
const { onPageScroll } = handlers;
if (onPageScroll && event.eventName.endsWith('onPageScroll')) {
onPageScroll(event, context);
}
},
subscribeForEvents,
doDependenciesDiffer
);
}
+5
View File
@@ -111,6 +111,11 @@ export const HomeScreen = withAuthRequired(
ref={pagerRef} ref={pagerRef}
testID="homeScreen" testID="homeScreen"
onPageSelected={onPageSelected} onPageSelected={onPageSelected}
onPageScroll={(e) => {
'worklet'
const progress = (e.offset + e.position) / customFeeds.length;
console.log(progress)
}}
renderTabBar={renderTabBar} renderTabBar={renderTabBar}
tabBarPosition="top"> tabBarPosition="top">
<FeedPage <FeedPage