diff options
author | Samuel Newman <mozzius@protonmail.com> | 2025-09-05 18:39:28 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-05 08:39:28 -0700 |
commit | daed047bb41bcdac374398b06f87895511ea34a8 (patch) | |
tree | 559fa4d9c0d65eb4fd0c8269ee53a73e5a0d7934 /src/view/com/pager/Pager.tsx | |
parent | ee3e08393882a9d72ae9cab5f765ed2885c5a98d (diff) | |
download | voidsky-daed047bb41bcdac374398b06f87895511ea34a8.tar.zst |
[Perf] Drawer gesture perf fix + related cleanup (#8953)
* split drawer layout into own component * don't put props in dep array * memoize pager view
Diffstat (limited to 'src/view/com/pager/Pager.tsx')
-rw-r--r-- | src/view/com/pager/Pager.tsx | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/view/com/pager/Pager.tsx b/src/view/com/pager/Pager.tsx index 8cc346903..5eb7d7608 100644 --- a/src/view/com/pager/Pager.tsx +++ b/src/view/com/pager/Pager.tsx @@ -1,7 +1,9 @@ import { + memo, useCallback, useContext, useImperativeHandle, + useMemo, useRef, useState, } from 'react' @@ -56,6 +58,7 @@ interface Props { } const AnimatedPagerView = Animated.createAnimatedComponent(PagerView) +const MemoizedAnimatedPagerView = memo(AnimatedPagerView) export function Pager({ ref, @@ -139,10 +142,6 @@ export function Pager({ [parentOnPageScrollStateChanged], ) - const drawerGesture = useContext(DrawerGestureContext) ?? Gesture.Native() // noop for web - const nativeGesture = - Gesture.Native().requireExternalGestureToFail(drawerGesture) - return ( <View testID={testID} style={[a.flex_1, native(a.overflow_hidden)]}> {renderTabBar({ @@ -151,19 +150,33 @@ export function Pager({ dragProgress, dragState, })} - <GestureDetector gesture={nativeGesture}> - <AnimatedPagerView + <DrawerGestureRequireFail> + <MemoizedAnimatedPagerView ref={pagerView} - style={[a.flex_1]} + style={a.flex_1} initialPage={initialPage} onPageScroll={handlePageScroll}> {children} - </AnimatedPagerView> - </GestureDetector> + </MemoizedAnimatedPagerView> + </DrawerGestureRequireFail> </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( handlers: { onPageScroll: (e: PagerViewOnPageScrollEventData) => void |