import { useCallback, useEffect, MutableRefObject } from 'react'; import { NativeScrollEvent, NativeSyntheticEvent, ScrollView, } from 'react-native'; interface UseTimelineOffsetProps { onChangeOffset?: (offset: number) => void; scrollOffset?: number; scrollViewRef: MutableRefObject; } export default (props: UseTimelineOffsetProps) => { const { onChangeOffset, scrollOffset, scrollViewRef } = props; useEffect(() => { // NOTE: The main reason for this feature is to sync the offset // between all of the timelines in the TimelineList component if (scrollOffset !== undefined) { scrollViewRef?.current?.scrollTo({ y: scrollOffset, animated: false, }); } }, [scrollOffset]); const onScrollEndDrag = useCallback( (event: NativeSyntheticEvent) => { const offset = event.nativeEvent.contentOffset.y; const velocity = event.nativeEvent.velocity?.y; if (velocity === 0) { onChangeOffset?.(offset); } }, [] ); const onMomentumScrollEnd = useCallback( (event: NativeSyntheticEvent) => { onChangeOffset?.(event.nativeEvent.contentOffset.y); }, [] ); return { scrollEvents: { onScrollEndDrag, onMomentumScrollEnd, }, }; };