Skip to content

Commit 4e2a111

Browse files
lsdimaginehannojg
authored andcommitted
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 1c313fe commit 4e2a111

File tree

8 files changed

+34
-20
lines changed

8 files changed

+34
-20
lines changed

src/components/bottomSheet/BottomSheet.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,6 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
313313
animatedScrollableOverrideState,
314314
isScrollableRefreshable,
315315
isScrollableLocked,
316-
lockableScrollableContentOffsetY,
317316
setScrollableRef,
318317
removeScrollableRef,
319318
} = useScrollable();
@@ -1400,7 +1399,6 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
14001399
isContentHeightFixed,
14011400
isScrollableRefreshable,
14021401
isScrollableLocked,
1403-
lockableScrollableContentOffsetY,
14041402
shouldHandleKeyboardEvents,
14051403
simultaneousHandlers: _providedSimultaneousHandlers,
14061404
waitFor: _providedWaitFor,

src/components/bottomSheetScrollable/createBottomSheetScrollableComponent.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export function createBottomSheetScrollableComponent<T, P>(
4444
refreshControl,
4545
scrollBuffer,
4646
preserveScrollMomentum,
47+
lockableScrollableContentOffsetY,
4748
// events
4849
onScroll,
4950
onScrollBeginDrag,
@@ -63,7 +64,8 @@ export function createBottomSheetScrollableComponent<T, P>(
6364
onScrollBeginDrag,
6465
onScrollEndDrag,
6566
scrollBuffer,
66-
preserveScrollMomentum
67+
preserveScrollMomentum,
68+
lockableScrollableContentOffsetY
6769
);
6870
const {
6971
animatedFooterHeight,

src/components/bottomSheetScrollable/types.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ export interface BottomSheetScrollableProps {
5858
* Whether or not to preserve scroll momentum when expanding a scrollable bottom sheet component.
5959
*/
6060
preserveScrollMomentum?: boolean;
61+
62+
/**
63+
* The optional lockable scrollable content offset ref, which will remain the same value when scrollable is locked.
64+
*/
65+
lockableScrollableContentOffsetY?: Animated.SharedValue<number>;
6166
}
6267

6368
export type ScrollableProps<T> =

src/contexts/internal.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ export interface BottomSheetInternalContextType
5151
animatedScrollableContentOffsetY: SharedValue<number>;
5252
animatedScrollableOverrideState: SharedValue<SCROLLABLE_STATE>;
5353
isScrollableLocked: SharedValue<boolean>;
54-
// the real content offset when the scrollable is locked
55-
lockableScrollableContentOffsetY: SharedValue<number>;
5654
isScrollableRefreshable: SharedValue<boolean>;
5755
isContentHeightFixed: SharedValue<boolean>;
5856
isInTemporaryPosition: SharedValue<boolean>;

src/hooks/useScrollEventsHandlersDefault.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { State } from 'react-native-gesture-handler';
2-
import { scrollTo, useSharedValue, useWorkletCallback } from 'react-native-reanimated';
2+
import { scrollTo, useAnimatedReaction, useSharedValue, useWorkletCallback } from 'react-native-reanimated';
33
import { ANIMATION_STATE, SCROLLABLE_STATE, SHEET_STATE } from '../constants';
44
import type {
55
ScrollEventHandlerCallbackType,
@@ -17,7 +17,8 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
1717
scrollableRef,
1818
scrollableContentOffsetY,
1919
scrollBuffer,
20-
preserveScrollMomentum
20+
preserveScrollMomentum,
21+
lockableScrollableContentOffsetY,
2122
) => {
2223
// hooks
2324
const {
@@ -27,10 +28,19 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
2728
animatedHandleGestureState,
2829
animatedScrollableContentOffsetY: rootScrollableContentOffsetY,
2930
isScrollableLocked,
30-
lockableScrollableContentOffsetY,
3131
} = useBottomSheetInternal();
3232
const awaitingFirstScroll = useSharedValue(false);
3333
const scrollEnded = useSharedValue(false);
34+
const _lockableScrollableContentOffsetY = useSharedValue(0);
35+
36+
useAnimatedReaction(
37+
() => _lockableScrollableContentOffsetY.value,
38+
_lockableScrollableContentOffsetY => {
39+
if (lockableScrollableContentOffsetY) {
40+
lockableScrollableContentOffsetY.value = _lockableScrollableContentOffsetY;
41+
}
42+
}
43+
);
3444

3545
//#region callbacks
3646
const handleOnScroll: ScrollEventHandlerCallbackType<ScrollEventContextType> =
@@ -82,11 +92,11 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
8292
// @ts-ignore
8393
scrollTo(scrollableRef, 0, lockPosition, false);
8494
scrollableContentOffsetY.value = lockPosition;
85-
lockableScrollableContentOffsetY.value = lockPosition;
95+
_lockableScrollableContentOffsetY.value = lockPosition;
8696
}
8797
return;
8898
}
89-
lockableScrollableContentOffsetY.value = event.contentOffset.y;
99+
_lockableScrollableContentOffsetY.value = y;
90100
},
91101
[
92102
scrollableRef,
@@ -100,7 +110,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
100110
(event, context) => {
101111
const y = event.contentOffset.y;
102112
scrollableContentOffsetY.value = y;
103-
lockableScrollableContentOffsetY.value = y;
113+
_lockableScrollableContentOffsetY.value = y;
104114
rootScrollableContentOffsetY.value = y;
105115
context.initialContentOffsetY = y;
106116
awaitingFirstScroll.value = true;
@@ -161,13 +171,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
161171
// @ts-ignore
162172
scrollTo(scrollableRef, 0, lockPosition, false);
163173
scrollableContentOffsetY.value = lockPosition;
164-
lockableScrollableContentOffsetY.value = lockPosition;
174+
_lockableScrollableContentOffsetY.value = lockPosition;
165175
return;
166176
}
167177

168178
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
169179
scrollableContentOffsetY.value = y;
170-
lockableScrollableContentOffsetY.value = y;
180+
_lockableScrollableContentOffsetY.value = y;
171181
rootScrollableContentOffsetY.value = y;
172182
}
173183
},
@@ -190,14 +200,14 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
190200
// @ts-ignore
191201
scrollTo(scrollableRef, 0, lockPosition, false);
192202
scrollableContentOffsetY.value = 0;
193-
lockableScrollableContentOffsetY.value = 0;
203+
_lockableScrollableContentOffsetY.value = 0;
194204
}
195205
return;
196206
}
197207

198208
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
199209
scrollableContentOffsetY.value = y;
200-
lockableScrollableContentOffsetY.value = y;
210+
_lockableScrollableContentOffsetY.value = y;
201211
rootScrollableContentOffsetY.value = y;
202212
}
203213
},

src/hooks/useScrollHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
SharedValue,
23
runOnJS,
34
useAnimatedRef,
45
useAnimatedScrollHandler,
@@ -14,7 +15,8 @@ export const useScrollHandler = (
1415
onScrollBeginDrag?: ScrollableEvent,
1516
onScrollEndDrag?: ScrollableEvent,
1617
scrollBuffer?: number,
17-
preserveScrollMomentum?: boolean
18+
preserveScrollMomentum?: boolean,
19+
lockableScrollableContentOffsetY?: SharedValue<number>,
1820
) => {
1921
// refs
2022
const scrollableRef = useAnimatedRef<Scrollable>();
@@ -29,7 +31,7 @@ export const useScrollHandler = (
2931
handleOnEndDrag = noop,
3032
handleOnMomentumEnd = noop,
3133
handleOnMomentumBegin = noop,
32-
} = useScrollEventsHandlers(scrollableRef, scrollableContentOffsetY, scrollBuffer, preserveScrollMomentum);
34+
} = useScrollEventsHandlers(scrollableRef, scrollableContentOffsetY, scrollBuffer, preserveScrollMomentum, lockableScrollableContentOffsetY);
3335

3436
// callbacks
3537
const scrollHandler = useAnimatedScrollHandler(

src/hooks/useScrollable.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export const useScrollable = () => {
1919
);
2020
const isScrollableRefreshable = useSharedValue<boolean>(false);
2121
const isScrollableLocked = useSharedValue<boolean>(true);
22-
const lockableScrollableContentOffsetY = useSharedValue<number>(0);
2322

2423
// callbacks
2524
const setScrollableRef = useCallback((ref: ScrollableRef) => {
@@ -66,7 +65,6 @@ export const useScrollable = () => {
6665
animatedScrollableOverrideState,
6766
isScrollableRefreshable,
6867
isScrollableLocked,
69-
lockableScrollableContentOffsetY,
7068
setScrollableRef,
7169
removeScrollableRef,
7270
};

src/types.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ export type ScrollEventsHandlersHookType = (
183183
ref: React.RefObject<Scrollable>,
184184
contentOffsetY: SharedValue<number>,
185185
scrollBuffer: number | undefined,
186-
preserveScrollMomentum: boolean | undefined
186+
preserveScrollMomentum: boolean | undefined,
187+
lockableScrollableContentOffsetY: SharedValue<number> | undefined
187188
) => {
188189
handleOnScroll?: ScrollEventHandlerCallbackType;
189190
handleOnBeginDrag?: ScrollEventHandlerCallbackType;

0 commit comments

Comments
 (0)