Add onPageScroll prop to Pager
This commit is contained in:
@@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user