Skip to content

Commit 1c313fe

Browse files
lsdimaginehannojg
authored andcommitted
Add lockableScrollableContentOffsetY which does not change when scrollable is locked (#14)
1 parent 9179d49 commit 1c313fe

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
@@ -313,6 +313,7 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
313313
animatedScrollableOverrideState,
314314
isScrollableRefreshable,
315315
isScrollableLocked,
316+
lockableScrollableContentOffsetY,
316317
setScrollableRef,
317318
removeScrollableRef,
318319
} = useScrollable();
@@ -1399,6 +1400,7 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
13991400
isContentHeightFixed,
14001401
isScrollableRefreshable,
14011402
isScrollableLocked,
1403+
lockableScrollableContentOffsetY,
14021404
shouldHandleKeyboardEvents,
14031405
simultaneousHandlers: _providedSimultaneousHandlers,
14041406
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: 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>;
5456
isScrollableRefreshable: SharedValue<boolean>;
5557
isContentHeightFixed: SharedValue<boolean>;
5658
isInTemporaryPosition: SharedValue<boolean>;

src/hooks/useScrollEventsHandlersDefault.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
2727
animatedHandleGestureState,
2828
animatedScrollableContentOffsetY: rootScrollableContentOffsetY,
2929
isScrollableLocked,
30+
lockableScrollableContentOffsetY,
3031
} = useBottomSheetInternal();
3132
const awaitingFirstScroll = useSharedValue(false);
3233
const scrollEnded = useSharedValue(false);
@@ -81,9 +82,11 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
8182
// @ts-ignore
8283
scrollTo(scrollableRef, 0, lockPosition, false);
8384
scrollableContentOffsetY.value = lockPosition;
85+
lockableScrollableContentOffsetY.value = lockPosition;
8486
}
8587
return;
8688
}
89+
lockableScrollableContentOffsetY.value = event.contentOffset.y;
8790
},
8891
[
8992
scrollableRef,
@@ -97,6 +100,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
97100
(event, context) => {
98101
const y = event.contentOffset.y;
99102
scrollableContentOffsetY.value = y;
103+
lockableScrollableContentOffsetY.value = y;
100104
rootScrollableContentOffsetY.value = y;
101105
context.initialContentOffsetY = y;
102106
awaitingFirstScroll.value = true;
@@ -157,11 +161,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
157161
// @ts-ignore
158162
scrollTo(scrollableRef, 0, lockPosition, false);
159163
scrollableContentOffsetY.value = lockPosition;
164+
lockableScrollableContentOffsetY.value = lockPosition;
160165
return;
161166
}
162167

163168
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
164169
scrollableContentOffsetY.value = y;
170+
lockableScrollableContentOffsetY.value = y;
165171
rootScrollableContentOffsetY.value = y;
166172
}
167173
},
@@ -184,12 +190,14 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
184190
// @ts-ignore
185191
scrollTo(scrollableRef, 0, lockPosition, false);
186192
scrollableContentOffsetY.value = 0;
193+
lockableScrollableContentOffsetY.value = 0;
187194
}
188195
return;
189196
}
190197

191198
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
192199
scrollableContentOffsetY.value = y;
200+
lockableScrollableContentOffsetY.value = y;
193201
rootScrollableContentOffsetY.value = y;
194202
}
195203
},

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)