Skip to content

Commit d5cde45

Browse files
lsdimaginehannojg
authored andcommitted
Add lockableScrollableContentOffsetY which does not change when scrollable is locked (#14)
1 parent 62ab94c commit d5cde45

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
@@ -316,6 +316,7 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
316316
animatedScrollableContentOffsetY,
317317
animatedScrollableOverrideState,
318318
isScrollableRefreshable,
319+
lockableScrollableContentOffsetY,
319320
setScrollableRef,
320321
removeScrollableRef,
321322
} = useScrollable();
@@ -1334,6 +1335,7 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
13341335
isInTemporaryPosition,
13351336
isContentHeightFixed,
13361337
isScrollableRefreshable,
1338+
lockableScrollableContentOffsetY,
13371339
shouldHandleKeyboardEvents,
13381340
simultaneousHandlers: _providedSimultaneousHandlers,
13391341
waitFor: _providedWaitFor,

src/contexts/internal.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ export interface BottomSheetInternalContextType
5555
isScrollableRefreshable: SharedValue<boolean>;
5656
isContentHeightFixed: SharedValue<boolean>;
5757
isInTemporaryPosition: SharedValue<boolean>;
58+
// the real content offset when the scrollable is locked
59+
lockableScrollableContentOffsetY: SharedValue<number>;
5860
shouldHandleKeyboardEvents: SharedValue<boolean>;
5961

6062
// methods

src/hooks/useScrollEventsHandlersDefault.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
2323
animatedAnimationState,
2424
animatedHandleGestureState,
2525
animatedScrollableContentOffsetY: rootScrollableContentOffsetY,
26+
lockableScrollableContentOffsetY,
2627
} = useBottomSheetInternal();
2728

2829
//#region callbacks
@@ -56,8 +57,10 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
5657
// @ts-ignore
5758
scrollTo(scrollableRef, 0, lockPosition, false);
5859
scrollableContentOffsetY.value = lockPosition;
60+
lockableScrollableContentOffsetY.value = lockPosition;
5961
return;
6062
}
63+
lockableScrollableContentOffsetY.value = event.contentOffset.y;
6164
},
6265
[
6366
scrollableRef,
@@ -70,6 +73,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
7073
useWorkletCallback(
7174
({ contentOffset: { y } }, context) => {
7275
scrollableContentOffsetY.value = y;
76+
lockableScrollableContentOffsetY.value = y;
7377
rootScrollableContentOffsetY.value = y;
7478
context.initialContentOffsetY = y;
7579

@@ -103,11 +107,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
103107
// @ts-ignore
104108
scrollTo(scrollableRef, 0, lockPosition, false);
105109
scrollableContentOffsetY.value = lockPosition;
110+
lockableScrollableContentOffsetY.value = lockPosition;
106111
return;
107112
}
108113

109114
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
110115
scrollableContentOffsetY.value = y;
116+
lockableScrollableContentOffsetY.value = y;
111117
rootScrollableContentOffsetY.value = y;
112118
}
113119
},
@@ -129,11 +135,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
129135
// @ts-ignore
130136
scrollTo(scrollableRef, 0, lockPosition, false);
131137
scrollableContentOffsetY.value = 0;
138+
lockableScrollableContentOffsetY.value = 0;
132139
return;
133140
}
134141

135142
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
136143
scrollableContentOffsetY.value = y;
144+
lockableScrollableContentOffsetY.value = y;
137145
rootScrollableContentOffsetY.value = y;
138146
}
139147
},

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
SCROLLABLE_STATE.UNDETERMINED
2020
);
2121
const isScrollableRefreshable = useSharedValue<boolean>(false);
22+
const lockableScrollableContentOffsetY = useSharedValue<number>(0);
2223

2324
// callbacks
2425
const setScrollableRef = useCallback((ref: ScrollableRef) => {
@@ -64,6 +65,7 @@ export const useScrollable = () => {
6465
animatedScrollableContentOffsetY,
6566
animatedScrollableOverrideState,
6667
isScrollableRefreshable,
68+
lockableScrollableContentOffsetY,
6769
setScrollableRef,
6870
removeScrollableRef,
6971
};

0 commit comments

Comments
 (0)