Skip to content

Commit 1902dc4

Browse files
committed
Move lockableScrollableContentOffsetY into scrollable props (#15)
* Revert "Add lockableScrollableContentOffsetY which does not change when scrollable is locked (#14)" This reverts commit 859ab16. * Move lockableScrollableContentOffsetY into scrollable props
1 parent df7c11c commit 1902dc4

File tree

4 files changed

+32
-5
lines changed

4 files changed

+32
-5
lines changed

src/components/bottomSheetScrollable/types.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ export interface BottomSheetScrollableProps {
5252
* Whether or not to preserve scroll momentum when expanding a scrollable bottom sheet component.Add commentMore actions
5353
*/
5454
preserveScrollMomentum?: boolean;
55+
56+
/**
57+
* The optional lockable scrollable content offset ref, which will remain the same value when scrollable is locked.Add commentMore actions
58+
*/
59+
lockableScrollableContentOffsetY?: Animated.SharedValue<number>;
5560
}
5661

5762
export type ScrollableProps<T> =

src/hooks/useScrollEventsHandlersDefault.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { State } from 'react-native-gesture-handler';
2-
import { scrollTo, useWorkletCallback } from 'react-native-reanimated';
2+
import { scrollTo, useWorkletCallback, useSharedValue, useAnimatedReaction } from 'react-native-reanimated';
33
import { ANIMATION_STATE, SCROLLABLE_STATE, SHEET_STATE } from '../constants';
44
import type {
55
ScrollEventHandlerCallbackType,
@@ -14,7 +14,8 @@ export type ScrollEventContextType = {
1414

1515
export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
1616
scrollableRef,
17-
scrollableContentOffsetY
17+
scrollableContentOffsetY,
18+
lockableScrollableContentOffsetY
1819
) => {
1920
// hooks
2021
const {
@@ -25,6 +26,17 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
2526
animatedScrollableContentOffsetY: rootScrollableContentOffsetY,
2627
} = useBottomSheetInternal();
2728

29+
const _lockableScrollableContentOffsetY = useSharedValue(0);
30+
31+
useAnimatedReaction(
32+
() => _lockableScrollableContentOffsetY.value,
33+
_lockableScrollableContentOffsetY => {
34+
if (lockableScrollableContentOffsetY) {
35+
lockableScrollableContentOffsetY.value = _lockableScrollableContentOffsetY;
36+
}
37+
}
38+
);
39+
2840
//#region callbacks
2941
const handleOnScroll: ScrollEventHandlerCallbackType<ScrollEventContextType> =
3042
useWorkletCallback(
@@ -56,8 +68,10 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
5668
// @ts-ignore
5769
scrollTo(scrollableRef, 0, lockPosition, false);
5870
scrollableContentOffsetY.value = lockPosition;
71+
_lockableScrollableContentOffsetY.value = lockPosition;
5972
return;
6073
}
74+
_lockableScrollableContentOffsetY.value = y;
6175
},
6276
[
6377
scrollableRef,
@@ -70,6 +84,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
7084
useWorkletCallback(
7185
({ contentOffset: { y } }, context) => {
7286
scrollableContentOffsetY.value = y;
87+
_lockableScrollableContentOffsetY.value = y;
7388
rootScrollableContentOffsetY.value = y;
7489
context.initialContentOffsetY = y;
7590

@@ -103,11 +118,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
103118
// @ts-ignore
104119
scrollTo(scrollableRef, 0, lockPosition, false);
105120
scrollableContentOffsetY.value = lockPosition;
121+
_lockableScrollableContentOffsetY.value = lockPosition;
106122
return;
107123
}
108124

109125
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
110126
scrollableContentOffsetY.value = y;
127+
_lockableScrollableContentOffsetY.value = y;
111128
rootScrollableContentOffsetY.value = y;
112129
}
113130
},
@@ -129,11 +146,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
129146
// @ts-ignore
130147
scrollTo(scrollableRef, 0, lockPosition, false);
131148
scrollableContentOffsetY.value = 0;
149+
_lockableScrollableContentOffsetY.value = 0;
132150
return;
133151
}
134152

135153
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
136154
scrollableContentOffsetY.value = y;
155+
_lockableScrollableContentOffsetY.value = y;
137156
rootScrollableContentOffsetY.value = y;
138157
}
139158
},

src/hooks/useScrollHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
runOnJS,
3+
SharedValue,
34
useAnimatedRef,
45
useAnimatedScrollHandler,
56
useSharedValue,
@@ -12,7 +13,8 @@ export const useScrollHandler = (
1213
useScrollEventsHandlers = useScrollEventsHandlersDefault,
1314
onScroll?: ScrollableEvent,
1415
onScrollBeginDrag?: ScrollableEvent,
15-
onScrollEndDrag?: ScrollableEvent
16+
onScrollEndDrag?: ScrollableEvent,
17+
lockableScrollableContentOffsetY?: SharedValue<number>,
1618
) => {
1719
// refs
1820
const scrollableRef = useAnimatedRef<Scrollable>();
@@ -27,7 +29,7 @@ export const useScrollHandler = (
2729
handleOnEndDrag = noop,
2830
handleOnMomentumEnd = noop,
2931
handleOnMomentumBegin = noop,
30-
} = useScrollEventsHandlers(scrollableRef, scrollableContentOffsetY);
32+
} = useScrollEventsHandlers(scrollableRef, scrollableContentOffsetY, lockableScrollableContentOffsetY);
3133

3234
// callbacks
3335
const scrollHandler = useAnimatedScrollHandler(

src/types.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ type ScrollEventHandlerCallbackType<C = never> = (
180180

181181
export type ScrollEventsHandlersHookType = (
182182
ref: React.RefObject<Scrollable>,
183-
contentOffsetY: SharedValue<number>
183+
contentOffsetY: SharedValue<number>,
184+
lockableScrollableContentOffsetY?: SharedValue<number>
184185
) => {
185186
handleOnScroll?: ScrollEventHandlerCallbackType;
186187
handleOnBeginDrag?: ScrollEventHandlerCallbackType;

0 commit comments

Comments
 (0)