Skip to content

Commit c2ee40f

Browse files
lsdimagineyayvery
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 31b533d commit c2ee40f

File tree

8 files changed

+34
-20
lines changed

8 files changed

+34
-20
lines changed

src/components/bottomSheet/BottomSheet.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,6 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
299299
animatedScrollableOverrideState,
300300
isScrollableRefreshable,
301301
isScrollableLocked,
302-
lockableScrollableContentOffsetY,
303302
setScrollableRef,
304303
removeScrollableRef,
305304
} = useScrollable();
@@ -1110,7 +1109,6 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
11101109
isContentHeightFixed,
11111110
isScrollableRefreshable,
11121111
isScrollableLocked,
1113-
lockableScrollableContentOffsetY,
11141112
shouldHandleKeyboardEvents,
11151113
simultaneousHandlers: _providedSimultaneousHandlers,
11161114
waitFor: _providedWaitFor,

src/components/bottomSheetScrollable/createBottomSheetScrollableComponent.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export function createBottomSheetScrollableComponent<T, P>(
4040
refreshControl,
4141
scrollBuffer,
4242
preserveScrollMomentum,
43+
lockableScrollableContentOffsetY,
4344
// events
4445
onScroll,
4546
onScrollBeginDrag,
@@ -61,7 +62,8 @@ export function createBottomSheetScrollableComponent<T, P>(
6162
onScrollBeginDrag,
6263
onScrollEndDrag,
6364
scrollBuffer,
64-
preserveScrollMomentum
65+
preserveScrollMomentum,
66+
lockableScrollableContentOffsetY
6567
);
6668
const {
6769
enableContentPanningGesture,

src/components/bottomSheetScrollable/types.d.ts

+5
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

-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ export interface BottomSheetInternalContextType
6161
animatedScrollableContentOffsetY: Animated.SharedValue<number>;
6262
animatedScrollableOverrideState: Animated.SharedValue<SCROLLABLE_STATE>;
6363
isScrollableLocked: Animated.SharedValue<boolean>;
64-
// the real content offset when the scrollable is locked
65-
lockableScrollableContentOffsetY: Animated.SharedValue<number>;
6664
isScrollableRefreshable: Animated.SharedValue<boolean>;
6765
isContentHeightFixed: Animated.SharedValue<boolean>;
6866
isInTemporaryPosition: Animated.SharedValue<boolean>;

src/hooks/useScrollEventsHandlersDefault.ts

+20-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { scrollTo, useSharedValue, useWorkletCallback } from 'react-native-reanimated';
1+
import { scrollTo, useSharedValue, useWorkletCallback, useAnimatedReaction } from 'react-native-reanimated';
22
import { useBottomSheetInternal } from './useBottomSheetInternal';
33
import { ANIMATION_STATE, SCROLLABLE_STATE, SHEET_STATE } from '../constants';
44
import type {
@@ -16,7 +16,8 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
1616
scrollableRef,
1717
scrollableContentOffsetY,
1818
scrollBuffer,
19-
preserveScrollMomentum
19+
preserveScrollMomentum,
20+
lockableScrollableContentOffsetY,
2021
) => {
2122
// hooks
2223
const {
@@ -25,10 +26,19 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
2526
animatedAnimationState,
2627
animatedScrollableContentOffsetY: rootScrollableContentOffsetY,
2728
isScrollableLocked,
28-
lockableScrollableContentOffsetY,
2929
} = useBottomSheetInternal();
3030
const awaitingFirstScroll = useSharedValue(false);
3131
const scrollEnded = useSharedValue(false);
32+
const _lockableScrollableContentOffsetY = useSharedValue(0);
33+
34+
useAnimatedReaction(
35+
() => _lockableScrollableContentOffsetY.value,
36+
_lockableScrollableContentOffsetY => {
37+
if (lockableScrollableContentOffsetY) {
38+
lockableScrollableContentOffsetY.value = _lockableScrollableContentOffsetY;
39+
}
40+
}
41+
);
3242

3343
//#region callbacks
3444
const handleOnScroll: ScrollEventHandlerCallbackType<ScrollEventContextType> =
@@ -71,11 +81,11 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
7181
// @ts-ignore
7282
scrollTo(scrollableRef, 0, lockPosition, false);
7383
scrollableContentOffsetY.value = lockPosition;
74-
lockableScrollableContentOffsetY.value = lockPosition;
84+
_lockableScrollableContentOffsetY.value = lockPosition;
7585
}
7686
return;
7787
}
78-
lockableScrollableContentOffsetY.value = event.contentOffset.y;
88+
_lockableScrollableContentOffsetY.value = event.contentOffset.y;
7989
},
8090
[
8191
scrollableRef,
@@ -89,7 +99,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
8999
(event, context) => {
90100
const y = event.contentOffset.y;
91101
scrollableContentOffsetY.value = y;
92-
lockableScrollableContentOffsetY.value = y;
102+
_lockableScrollableContentOffsetY.value = y;
93103
rootScrollableContentOffsetY.value = y;
94104
context.initialContentOffsetY = y;
95105
awaitingFirstScroll.value = true;
@@ -150,12 +160,12 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
150160
// @ts-ignore
151161
scrollTo(scrollableRef, 0, lockPosition, false);
152162
scrollableContentOffsetY.value = lockPosition;
153-
lockableScrollableContentOffsetY.value = lockPosition;
163+
_lockableScrollableContentOffsetY.value = lockPosition;
154164
return;
155165
}
156166
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
157167
scrollableContentOffsetY.value = y;
158-
lockableScrollableContentOffsetY.value = y;
168+
_lockableScrollableContentOffsetY.value = y;
159169
rootScrollableContentOffsetY.value = y;
160170
}
161171
},
@@ -178,13 +188,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
178188
// @ts-ignore
179189
scrollTo(scrollableRef, 0, lockPosition, false);
180190
scrollableContentOffsetY.value = 0;
181-
lockableScrollableContentOffsetY.value = 0;
191+
_lockableScrollableContentOffsetY.value = 0;
182192
}
183193
return;
184194
}
185195
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
186196
scrollableContentOffsetY.value = y;
187-
lockableScrollableContentOffsetY.value = y;
197+
_lockableScrollableContentOffsetY.value = y;
188198
rootScrollableContentOffsetY.value = y;
189199
}
190200
},

src/hooks/useScrollHandler.ts

+4-2
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

-2
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

+2-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ export type ScrollEventsHandlersHookType = (
158158
ref: React.RefObject<Scrollable>,
159159
contentOffsetY: SharedValue<number>,
160160
scrollBuffer: number | undefined,
161-
preserveScrollMomentum: boolean | undefined
161+
preserveScrollMomentum: boolean | undefined,
162+
lockableScrollableContentOffsetY: SharedValue<number> | undefined
162163
) => {
163164
handleOnScroll?: ScrollEventHandlerCallbackType;
164165
handleOnBeginDrag?: ScrollEventHandlerCallbackType;

0 commit comments

Comments
 (0)