Skip to content

Commit 859ab16

Browse files
authored
Add lockableScrollableContentOffsetY which does not change when scrollable is locked (#14)
1 parent 65854cb commit 859ab16

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
@@ -289,6 +289,7 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
289289
animatedScrollableOverrideState,
290290
isScrollableRefreshable,
291291
isScrollableLocked,
292+
lockableScrollableContentOffsetY,
292293
setScrollableRef,
293294
removeScrollableRef,
294295
} = useScrollable();
@@ -1099,6 +1100,7 @@ const BottomSheetComponent = forwardRef<BottomSheet, BottomSheetProps>(
10991100
isContentHeightFixed,
11001101
isScrollableRefreshable,
11011102
isScrollableLocked,
1103+
lockableScrollableContentOffsetY,
11021104
shouldHandleKeyboardEvents,
11031105
simultaneousHandlers: _providedSimultaneousHandlers,
11041106
waitFor: _providedWaitFor,

src/contexts/internal.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ 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>;
6466
isScrollableRefreshable: Animated.SharedValue<boolean>;
6567
isContentHeightFixed: Animated.SharedValue<boolean>;
6668
isInTemporaryPosition: Animated.SharedValue<boolean>;

src/hooks/useScrollEventsHandlersDefault.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
2525
animatedAnimationState,
2626
animatedScrollableContentOffsetY: rootScrollableContentOffsetY,
2727
isScrollableLocked,
28+
lockableScrollableContentOffsetY,
2829
} = useBottomSheetInternal();
2930
const awaitingFirstScroll = useSharedValue(false);
3031
const scrollEnded = useSharedValue(false);
@@ -70,9 +71,11 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
7071
// @ts-ignore
7172
scrollTo(scrollableRef, 0, lockPosition, false);
7273
scrollableContentOffsetY.value = lockPosition;
74+
lockableScrollableContentOffsetY.value = lockPosition;
7375
}
7476
return;
7577
}
78+
lockableScrollableContentOffsetY.value = event.contentOffset.y;
7679
},
7780
[
7881
scrollableRef,
@@ -86,6 +89,7 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
8689
(event, context) => {
8790
const y = event.contentOffset.y;
8891
scrollableContentOffsetY.value = y;
92+
lockableScrollableContentOffsetY.value = y;
8993
rootScrollableContentOffsetY.value = y;
9094
context.initialContentOffsetY = y;
9195
awaitingFirstScroll.value = true;
@@ -146,10 +150,12 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
146150
// @ts-ignore
147151
scrollTo(scrollableRef, 0, lockPosition, false);
148152
scrollableContentOffsetY.value = lockPosition;
153+
lockableScrollableContentOffsetY.value = lockPosition;
149154
return;
150155
}
151156
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
152157
scrollableContentOffsetY.value = y;
158+
lockableScrollableContentOffsetY.value = y;
153159
rootScrollableContentOffsetY.value = y;
154160
}
155161
},
@@ -172,11 +178,13 @@ export const useScrollEventsHandlersDefault: ScrollEventsHandlersHookType = (
172178
// @ts-ignore
173179
scrollTo(scrollableRef, 0, lockPosition, false);
174180
scrollableContentOffsetY.value = 0;
181+
lockableScrollableContentOffsetY.value = 0;
175182
}
176183
return;
177184
}
178185
if (animatedAnimationState.value !== ANIMATION_STATE.RUNNING) {
179186
scrollableContentOffsetY.value = y;
187+
lockableScrollableContentOffsetY.value = y;
180188
rootScrollableContentOffsetY.value = y;
181189
}
182190
},

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)