diff --git a/src/hooks/useAutoScroll.tsx b/src/hooks/useAutoScroll.tsx index d3add83e..99484f2a 100644 --- a/src/hooks/useAutoScroll.tsx +++ b/src/hooks/useAutoScroll.tsx @@ -15,8 +15,14 @@ export function useAutoScroll() { const { autoscrollThreshold = DEFAULT_PROPS.autoscrollThreshold, autoscrollSpeed = DEFAULT_PROPS.autoscrollSpeed, + minScrollOffset, } = useProps(); + // Real list top (0) unless the consumer supplied a floor — see + // DraggableFlatListProps.minScrollOffset. + const DEFAULT_MIN_SCROLL_OFFSET = useSharedValue(0); + const minScrollOffsetSV = minScrollOffset || DEFAULT_MIN_SCROLL_OFFSET; + const { scrollOffset, scrollViewSize, @@ -31,7 +37,9 @@ export function useAutoScroll() { }, []); const isScrolledUp = useDerivedValue(() => { - return scrollOffset.value - SCROLL_POSITION_TOLERANCE <= 0; + return ( + scrollOffset.value - SCROLL_POSITION_TOLERANCE <= minScrollOffsetSV.value + ); }, []); const isScrolledDown = useDerivedValue(() => { @@ -103,7 +111,7 @@ export function useAutoScroll() { const speedPct = 1 - distFromEdge / autoscrollThreshold!; const offset = speedPct * autoscrollSpeed; const targetOffset = isAtTopEdge.value - ? Math.max(0, scrollOffset.value - offset) + ? Math.max(minScrollOffsetSV.value, scrollOffset.value - offset) : Math.min( scrollOffset.value + offset, scrollViewSize.value - containerSize.value diff --git a/src/types.ts b/src/types.ts index d6755c8f..a068c8b8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -43,6 +43,11 @@ export type DraggableFlatListProps = Modify< renderPlaceholder?: RenderPlaceholder; simultaneousHandlers?: React.Ref | React.Ref[]; outerScrollOffset?: Animated.SharedValue; + // Floor for the built-in top-edge autoscroll (see useAutoScroll's isScrolledUp/ + // scroll-target clamp) — lets a consumer whose list has non-reorderable content + // above the reorderable region (e.g. a ListHeaderComponent) tell autoscroll not + // to scroll back up into it while dragging. Defaults to 0 (the real list top). + minScrollOffset?: Animated.SharedValue; onAnimValInit?: (animVals: ReturnType) => void; itemEnteringAnimation?: AnimateProps["entering"]; itemExitingAnimation?: AnimateProps["exiting"];