From bf9cedb67bacd1e2667bd1719aadcee92f234966 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 12 Dec 2023 23:11:20 +0000 Subject: [PATCH] Clean up pager refs to fix crash (#2195) --- src/view/com/pager/PagerWithHeader.tsx | 35 +++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/view/com/pager/PagerWithHeader.tsx b/src/view/com/pager/PagerWithHeader.tsx index 22e2d86b..cda2d130 100644 --- a/src/view/com/pager/PagerWithHeader.tsx +++ b/src/view/com/pager/PagerWithHeader.tsx @@ -121,13 +121,16 @@ export const PagerWithHeader = React.forwardRef( ) const scrollRefs = useSharedValue[]>([]) - const registerRef = (scrollRef: AnimatedRef, index: number) => { - scrollRefs.modify(refs => { - 'worklet' - refs[index] = scrollRef - return refs - }) - } + const registerRef = React.useCallback( + (scrollRef: AnimatedRef | null, atIndex: number) => { + scrollRefs.modify(refs => { + 'worklet' + refs[atIndex] = scrollRef + return refs + }) + }, + [scrollRefs], + ) const lastForcedScrollY = useSharedValue(0) const adjustScrollForOtherPages = () => { @@ -138,8 +141,7 @@ export const PagerWithHeader = React.forwardRef( lastForcedScrollY.value = forcedScrollY const refs = scrollRefs.value for (let i = 0; i < refs.length; i++) { - if (i !== currentPage) { - // This needs to run on the UI thread. + if (i !== currentPage && refs[i] != null) { scrollTo(refs[i], 0, forcedScrollY, false) } } @@ -206,11 +208,12 @@ export const PagerWithHeader = React.forwardRef( ) => registerRef(r, i)} + registerRef={registerRef} renderTab={child} /> @@ -287,6 +290,7 @@ PagerTabBar = React.memo(PagerTabBar) function PagerItem({ headerHeight, + index, isReady, isFocused, isScrolledDown, @@ -295,15 +299,22 @@ function PagerItem({ registerRef, }: { headerHeight: number + index: number isFocused: boolean isReady: boolean isScrolledDown: boolean - registerRef: (scrollRef: AnimatedRef) => void + registerRef: (scrollRef: AnimatedRef | null, atIndex: number) => void onScrollWorklet: (e: NativeScrollEvent) => void renderTab: ((props: PagerWithHeaderChildParams) => JSX.Element) | null }) { const scrollElRef = useAnimatedRef() - registerRef(scrollElRef) + + React.useEffect(() => { + registerRef(scrollElRef, index) + return () => { + registerRef(null, index) + } + }, [scrollElRef, registerRef, index]) const scrollHandler = React.useMemo( () => ({onScroll: onScrollWorklet}),