Skip to content

Commit 9a953d1

Browse files
lsdimagineyayvery
authored andcommitted
Add lockableScrollableContentOffsetY which does not change when scrollable is locked (#14)
1 parent e7a8508 commit 9a953d1

File tree

4 files changed

+14
-0
lines changed

4 files changed

+14
-0
lines changed

src/components/bottomSheet/BottomSheet.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ const BottomSheetComponent = forwardRef<BottomSheetMethods, BottomSheetProps>(
306306
animatedScrollableOverrideState,
307307
isScrollableRefreshable,
308308
isScrollableLocked,
309+
lockableScrollableContentOffsetY,
309310
setScrollableRef,
310311
removeScrollableRef,
311312
} = useScrollable();
@@ -1173,6 +1174,7 @@ const BottomSheetComponent = forwardRef<BottomSheetMethods, BottomSheetProps>(
11731174
isContentHeightFixed,
11741175
isScrollableRefreshable,
11751176
isScrollableLocked,
1177+
lockableScrollableContentOffsetY,
11761178
shouldHandleKeyboardEvents,
11771179
simultaneousHandlers: _providedSimultaneousHandlers,
11781180
waitFor: _providedWaitFor,

src/contexts/internal.ts

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

src/hooks/useScrollEventsHandlersDefault.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
2929
animatedAnimationState,
3030
animatedScrollableContentOffsetY: rootScrollableContentOffsetY,
3131
isScrollableLocked,
32+
lockableScrollableContentOffsetY,
3233
} = useBottomSheetInternal();
3334
const awaitingFirstScroll = useSharedValue(false);
3435
const scrollEnded = useSharedValue(false);
@@ -89,9 +90,11 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
8990
// @ts-ignore
9091
scrollTo(scrollableRef, 0, lockPosition, false);
9192
scrollableContentOffsetY.value = lockPosition;
93+
lockableScrollableContentOffsetY.value = lockPosition;
9294
}
9395
return;
9496
}
97+
lockableScrollableContentOffsetY.value = event.contentOffset.y;
9598
},
9699
[
97100
scrollableRef,
@@ -105,6 +108,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
105108
(event, context) => {
106109
const y = event.contentOffset.y;
107110
scrollableContentOffsetY.value = y;
111+
lockableScrollableContentOffsetY.value = y;
108112
rootScrollableContentOffsetY.value = y;
109113
context.initialContentOffsetY = y;
110114
awaitingFirstScroll.value = true;
@@ -167,10 +171,12 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
167171
// @ts-ignore
168172
scrollTo(scrollableRef, 0, lockPosition, false);
169173
scrollableContentOffsetY.value = lockPosition;
174+
lockableScrollableContentOffsetY.value = lockPosition;
170175
return;
171176
}
172177
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
173178
scrollableContentOffsetY.value = y;
179+
lockableScrollableContentOffsetY.value = y;
174180
rootScrollableContentOffsetY.value = y;
175181
}
176182
},
@@ -193,11 +199,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
193199
// @ts-ignore
194200
scrollTo(scrollableRef, 0, lockPosition, false);
195201
scrollableContentOffsetY.value = 0;
202+
lockableScrollableContentOffsetY.value = 0;
196203
}
197204
return;
198205
}
199206
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
200207
scrollableContentOffsetY.value = y;
208+
lockableScrollableContentOffsetY.value = y;
201209
rootScrollableContentOffsetY.value = y;
202210
}
203211
},

src/hooks/useScrollable.ts

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

2324
// callbacks
2425
const setScrollableRef = useCallback((ref: ScrollableRef) => {
@@ -65,6 +66,7 @@ export const useScrollable = () => {
6566
animatedScrollableOverrideState,
6667
isScrollableRefreshable,
6768
isScrollableLocked,
69+
lockableScrollableContentOffsetY,
6870
setScrollableRef,
6971
removeScrollableRef,
7072
};

0 commit comments

Comments
 (0)