diff --git a/src/reanimated2/hook/useScrollViewOffset.ts b/src/reanimated2/hook/useScrollViewOffset.ts index d8bf6b25dc92..b2981f26e017 100644 --- a/src/reanimated2/hook/useScrollViewOffset.ts +++ b/src/reanimated2/hook/useScrollViewOffset.ts @@ -35,7 +35,7 @@ function useScrollViewOffsetWeb( const eventHandler = useCallback(() => { 'worklet'; - const element = animatedRef.current as unknown as HTMLElement; + const element = getWebScrollableElement(animatedRef.current); // scrollLeft is the X axis scrolled offset, works properly also with RTL layout offset.value = element.scrollLeft === 0 ? element.scrollTop : element.scrollLeft; @@ -45,14 +45,14 @@ function useScrollViewOffsetWeb( useEffect(() => { // We need to make sure that listener for old animatedRef value is removed if (scrollRef.current !== null) { - (scrollRef.current as unknown as HTMLElement).removeEventListener( + getWebScrollableElement(scrollRef.current).removeEventListener( 'scroll', eventHandler ); } scrollRef.current = animatedRef.current; - const element = animatedRef.current as unknown as HTMLElement; + const element = getWebScrollableElement(animatedRef.current); element.addEventListener('scroll', eventHandler); return () => { element.removeEventListener('scroll', eventHandler); @@ -66,14 +66,6 @@ function useScrollViewOffsetWeb( return offset; } -const scrollNativeEventNames = [ - 'onScroll', - 'onScrollBeginDrag', - 'onScrollEndDrag', - 'onMomentumScrollBegin', - 'onMomentumScrollEnd', -]; - function useScrollViewOffsetNative( animatedRef: AnimatedRef, providedOffset?: SharedValue @@ -115,3 +107,20 @@ function useScrollViewOffsetNative( return offset; } + +function getWebScrollableElement( + scrollComponent: AnimatedScrollView | null +): HTMLElement { + return ( + (scrollComponent?.getScrollableNode() as unknown as HTMLElement) ?? + scrollComponent + ); +} + +const scrollNativeEventNames = [ + 'onScroll', + 'onScrollBeginDrag', + 'onScrollEndDrag', + 'onMomentumScrollBegin', + 'onMomentumScrollEnd', +];