memoize pager view

This commit is contained in:
Samuel Newman
2025-09-03 12:28:21 +03:00
parent 42497044c9
commit 82e1bb4571
+22 -9
View File
@@ -1,7 +1,9 @@
import { import {
memo,
useCallback, useCallback,
useContext, useContext,
useImperativeHandle, useImperativeHandle,
useMemo,
useRef, useRef,
useState, useState,
} from 'react' } from 'react'
@@ -56,6 +58,7 @@ interface Props {
} }
const AnimatedPagerView = Animated.createAnimatedComponent(PagerView) const AnimatedPagerView = Animated.createAnimatedComponent(PagerView)
const MemoizedAnimatedPagerView = memo(AnimatedPagerView)
export function Pager({ export function Pager({
ref, ref,
@@ -139,10 +142,6 @@ export function Pager({
[parentOnPageScrollStateChanged], [parentOnPageScrollStateChanged],
) )
const drawerGesture = useContext(DrawerGestureContext) ?? Gesture.Native() // noop for web
const nativeGesture =
Gesture.Native().requireExternalGestureToFail(drawerGesture)
return ( return (
<View testID={testID} style={[a.flex_1, native(a.overflow_hidden)]}> <View testID={testID} style={[a.flex_1, native(a.overflow_hidden)]}>
{renderTabBar({ {renderTabBar({
@@ -151,19 +150,33 @@ export function Pager({
dragProgress, dragProgress,
dragState, dragState,
})} })}
<GestureDetector gesture={nativeGesture}> <DrawerGestureRequireFail>
<AnimatedPagerView <MemoizedAnimatedPagerView
ref={pagerView} ref={pagerView}
style={[a.flex_1]} style={a.flex_1}
initialPage={initialPage} initialPage={initialPage}
onPageScroll={handlePageScroll}> onPageScroll={handlePageScroll}>
{children} {children}
</AnimatedPagerView> </MemoizedAnimatedPagerView>
</GestureDetector> </DrawerGestureRequireFail>
</View> </View>
) )
} }
function DrawerGestureRequireFail({children}: {children: React.ReactNode}) {
const drawerGesture = useContext(DrawerGestureContext)
const nativeGesture = useMemo(() => {
const gesture = Gesture.Native()
if (drawerGesture) {
gesture.requireExternalGestureToFail(drawerGesture)
}
return gesture
}, [drawerGesture])
return <GestureDetector gesture={nativeGesture}>{children}</GestureDetector>
}
function usePagerHandlers( function usePagerHandlers(
handlers: { handlers: {
onPageScroll: (e: PagerViewOnPageScrollEventData) => void onPageScroll: (e: PagerViewOnPageScrollEventData) => void