@swmansion/react-native-bottom-sheet 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,178 @@
1
1
  # React Native Bottom Sheet
2
2
 
3
3
  ![](https://img.shields.io/npm/v/@swmansion/react-native-bottom-sheet)
4
+
5
+ ![](cover.png)
6
+
7
+ React Native Bottom Sheet provides bottom‍-‍sheet components for
8
+ React Native.
9
+
10
+ ## Getting started
11
+
12
+ 1. Install React Native Bottom Sheet:
13
+
14
+ ```sh
15
+ npm i @swmansion/react-native-bottom-sheet
16
+ ```
17
+
18
+ 2. Ensure the peer dependencies are installed:
19
+
20
+ ```sh
21
+ npm i react-native-gesture-handler@^2.14.0 react-native-reanimated@^3.16.0 react-native-safe-area-context@^4.0.0 react-native-worklets@^0.4.0
22
+ ```
23
+
24
+ 3. Wrap your app with `GestureHandlerRootView` and `BottomSheetProvider`:
25
+
26
+ ```tsx
27
+ const App = () => (
28
+ <GestureHandlerRootView>
29
+ <BottomSheetProvider>{/* ... */}</BottomSheetProvider>
30
+ </GestureHandlerRootView>
31
+ );
32
+ ```
33
+
34
+ ## Usage
35
+
36
+ The library provides two components: `BottomSheet` (inline) and
37
+ `ModalBottomSheet` (modal). Both render their children as the sheet content
38
+ (including any background) and are controlled via `detents`, `index`,
39
+ and&nbsp;`onIndexChange`.
40
+
41
+ ### Inline
42
+
43
+ `BottomSheet` renders within your screen&nbsp;layout.
44
+
45
+ ```tsx
46
+ const [index, setIndex] = useState(0);
47
+ const insets = useSafeAreaInsets();
48
+ ```
49
+
50
+ ```tsx
51
+ <BottomSheet index={index} onIndexChange={setIndex}>
52
+ <View
53
+ style={{
54
+ backgroundColor: 'white',
55
+ padding: 16,
56
+ paddingBottom: insets.bottom + 16,
57
+ }}
58
+ >
59
+ <Text>Sheet content</Text>
60
+ </View>
61
+ </BottomSheet>
62
+ ```
63
+
64
+ ### Modal
65
+
66
+ `ModalBottomSheet` renders above other content with a&nbsp;scrim.
67
+
68
+ ```tsx
69
+ const [index, setIndex] = useState(0);
70
+ const insets = useSafeAreaInsets();
71
+ ```
72
+
73
+ ```tsx
74
+ <ModalBottomSheet index={index} onIndexChange={setIndex}>
75
+ <View
76
+ style={{
77
+ backgroundColor: 'white',
78
+ padding: 16,
79
+ paddingBottom: insets.bottom + 16,
80
+ }}
81
+ >
82
+ <Text>Sheet content</Text>
83
+ </View>
84
+ </ModalBottomSheet>
85
+ ```
86
+
87
+ #### Scrim
88
+
89
+ Tapping the scrim collapses the sheet. You can provide a custom scrim via the
90
+ `scrim` prop, which receives a `SharedValue` that goes from 0 when collapsed to
91
+ 1 when the first nonzero detent is&nbsp;reached:
92
+
93
+ ```tsx
94
+ <ModalBottomSheet
95
+ index={index}
96
+ onIndexChange={setIndex}
97
+ scrim={(progress) => (
98
+ <Animated.View
99
+ style={useAnimatedStyle(() => ({
100
+ backgroundColor: `rgba(0, 0, 255, ${0.3 * progress.value})`,
101
+ flex: 1,
102
+ }))}
103
+ />
104
+ )}
105
+ >
106
+ {/* ... */}
107
+ </ModalBottomSheet>
108
+ ```
109
+
110
+ ### Detents and index
111
+
112
+ Detents are the points to which the sheet snaps. Each detent is either a number
113
+ (a fixed height in pixels) or `'max'` (the sheet’s content height, capped by the
114
+ available screen height). The default detents are `[0, 'max']`.
115
+
116
+ The `index` prop is a zero&zwj;-&zwj;based index into the `detents` array.
117
+ `onIndexChange` is called when the sheet snaps to a different detent after
118
+ a&nbsp;drag. You can also control the sheet externally by updating the index
119
+ state.
120
+
121
+ ```tsx
122
+ const [index, setIndex] = useState(0);
123
+ ```
124
+
125
+ ```tsx
126
+ <BottomSheet // Or `ModalBottomSheet`.
127
+ detents={[0, 300, 'max']} // Collapsed, 300 px, content height.
128
+ index={index}
129
+ onIndexChange={setIndex}
130
+ >
131
+ {/* ... */}
132
+ </BottomSheet>
133
+ ```
134
+
135
+ ### Position tracking
136
+
137
+ The `position` prop accepts a `SharedValue` that the library keeps in sync with
138
+ the sheet’s current position (the distance in pixels from the bottom of the
139
+ screen to the top of the sheet). Use it to drive animations tied to the
140
+ sheet&nbsp;position.
141
+
142
+ ```tsx
143
+ const position = useSharedValue(0);
144
+ ```
145
+
146
+ ```tsx
147
+ <BottomSheet // Or `ModalBottomSheet`.
148
+ index={index}
149
+ onIndexChange={setIndex}
150
+ position={position}
151
+ >
152
+ {/* ... */}
153
+ </BottomSheet>
154
+ ```
155
+
156
+ ### Customizing animations
157
+
158
+ Use the `openAnimationConfig` and `closeAnimationConfig` props to tweak the
159
+ spring parameters for opening and&nbsp;closing.
160
+
161
+ ### Scrollable content
162
+
163
+ For scrollable sheet content, use `BottomSheetScrollView` or
164
+ `BottomSheetFlatList` instead of the standard React Native components. These
165
+ integrate scrolling with the sheet’s drag gesture so that dragging down while
166
+ scrolled to the top collapses the&nbsp;sheet.
167
+
168
+ ## By [Software Mansion](https://swmansion.com)
169
+
170
+ Founded in 2012, [Software Mansion](https://swmansion.com) is a software agency
171
+ with experience in building web and mobile apps. We are core React Native
172
+ contributors and experts in dealing with all kinds of React Native issues. We
173
+ can help you build your next dream
174
+ product&zwj;—&zwj;[hire&nbsp;us](https://swmansion.com/contact/projects?utm_source=react-native-bottom-sheet&utm_medium=readme).
175
+
176
+ [![](https://logo.swmansion.com/logo?color=white&variant=desktop&width=152&tag=react-native-bottom-sheet-github)](https://swmansion.com)
177
+
178
+ [![](https://contrib.rocks/image?repo=software-mansion-labs/react-native-bottom-sheet)](https://github.com/software-mansion-labs/react-native-bottom-sheet/graphs/contributors)
@@ -85,15 +85,16 @@ export const BottomSheetBase = ({
85
85
  const dragStartTranslateY = useSharedValue(0);
86
86
  const isTouchWithinScrollable = useSharedValue(false);
87
87
  const detentsValue = useSharedValue(normalizedDetents);
88
+ const firstNonzeroDetent = useSharedValue(normalizedDetents.find(d => d > 0) ?? 0);
88
89
  const currentIndex = useSharedValue(resolvedIndex);
89
90
  const internalPosition = useDerivedValue(() => Math.max(0, sheetHeight.value - translateY.value));
90
91
  useAnimatedReaction(() => internalPosition.value, value => {
91
92
  if (externalPosition !== undefined) externalPosition.set(value);
92
93
  });
93
94
  const scrimProgress = useDerivedValue(() => {
94
- const maxSnap = sheetHeight.value;
95
- if (maxSnap <= 0) return 0;
96
- const progress = internalPosition.value / maxSnap;
95
+ const target = firstNonzeroDetent.value;
96
+ if (target <= 0) return 0;
97
+ const progress = internalPosition.value / target;
97
98
  return Math.min(1, Math.max(0, progress));
98
99
  });
99
100
  const handleIndexChange = nextIndex => {
@@ -103,7 +104,8 @@ export const BottomSheetBase = ({
103
104
  const maxSnap = Math.max(0, ...normalizedDetents);
104
105
  detentsValue.set(normalizedDetents);
105
106
  sheetHeight.set(maxSnap);
106
- }, [normalizedDetents, sheetHeight, detentsValue]);
107
+ firstNonzeroDetent.set(normalizedDetents.find(d => d > 0) ?? 0);
108
+ }, [normalizedDetents, sheetHeight, detentsValue, firstNonzeroDetent]);
107
109
  const animateToIndex = useCallback((targetIndex, velocity) => {
108
110
  'worklet';
109
111
 
@@ -135,13 +137,15 @@ export const BottomSheetBase = ({
135
137
  isScrollableLocked.set(false);
136
138
  isTouchWithinScrollable.set(false);
137
139
  const touch = event.changedTouches[0] ?? event.allTouches[0];
138
- if (touch) panStartY.set(touch.absoluteY);
139
- if (touch && hasScrollable.value) {
140
- const layout = measure(scrollableRef);
141
- if (layout) {
142
- const withinX = touch.absoluteX >= layout.pageX && touch.absoluteX <= layout.pageX + layout.width;
143
- const withinY = touch.absoluteY >= layout.pageY && touch.absoluteY <= layout.pageY + layout.height;
144
- isTouchWithinScrollable.set(withinX && withinY);
140
+ if (touch !== undefined) {
141
+ panStartY.set(touch.absoluteY);
142
+ if (hasScrollable.value) {
143
+ const layout = measure(scrollableRef);
144
+ if (layout !== null) {
145
+ const withinX = touch.absoluteX >= layout.pageX && touch.absoluteX <= layout.pageX + layout.width;
146
+ const withinY = touch.absoluteY >= layout.pageY && touch.absoluteY <= layout.pageY + layout.height;
147
+ isTouchWithinScrollable.set(withinX && withinY);
148
+ }
145
149
  }
146
150
  }
147
151
  }).onTouchesMove((event, stateManager) => {
@@ -172,21 +176,19 @@ export const BottomSheetBase = ({
172
176
  if (isDraggingFromScrollable.value) {
173
177
  scrollTo(scrollableRef, 0, 0, false);
174
178
  }
175
- const nextTranslate = Math.min(Math.max(dragStartTranslateY.value + event.translationY, 0), sheetHeight.value);
176
- translateY.set(nextTranslate);
177
- return;
178
- }
179
- const isDraggingDown = event.translationY > 0;
180
- const canStartDrag = !hasScrollable.value || scrollOffset.value <= 0 || !isTouchWithinScrollable.value;
181
- if (!canStartDrag || !isDraggingDown && translateY.value <= 0) {
182
- return;
183
- }
184
- const isScrollableActive = hasScrollable.value && isScrollableGestureActive.value;
185
- isDraggingSheet.set(true);
186
- isDraggingFromScrollable.set(isScrollableActive && isTouchWithinScrollable.value);
187
- isScrollableLocked.set(hasScrollable.value);
188
- if (isTouchWithinScrollable.value && hasScrollable.value) {
189
- scrollTo(scrollableRef, 0, 0, false);
179
+ } else {
180
+ const isDraggingDown = event.translationY > 0;
181
+ const canStartDrag = !hasScrollable.value || scrollOffset.value <= 0 || !isTouchWithinScrollable.value;
182
+ if (!canStartDrag || !isDraggingDown && translateY.value <= 0) {
183
+ return;
184
+ }
185
+ const isScrollableActive = hasScrollable.value && isScrollableGestureActive.value;
186
+ isDraggingSheet.set(true);
187
+ isDraggingFromScrollable.set(isScrollableActive && isTouchWithinScrollable.value);
188
+ isScrollableLocked.set(hasScrollable.value);
189
+ if (isTouchWithinScrollable.value && hasScrollable.value) {
190
+ scrollTo(scrollableRef, 0, 0, false);
191
+ }
190
192
  }
191
193
  const nextTranslate = Math.min(Math.max(dragStartTranslateY.value + event.translationY, 0), sheetHeight.value);
192
194
  translateY.set(nextTranslate);
@@ -218,11 +220,11 @@ export const BottomSheetBase = ({
218
220
  }
219
221
  if (Math.abs(velocityY) > VELOCITY_THRESHOLD) {
220
222
  if (velocityY > 0) {
221
- const lower = allPositions.filter(pos => pos.translateY > currentTranslate + 1).sort((a, b) => a.translateY - b.translateY);
222
- if (lower.length > 0) targetIndex = lower[0].index;
223
+ const lower = allPositions.filter(pos => pos.translateY > currentTranslate + 1).sort((a, b) => a.translateY - b.translateY)[0];
224
+ if (lower !== undefined) targetIndex = lower.index;
223
225
  } else {
224
- const upper = allPositions.filter(pos => pos.translateY < currentTranslate - 1).sort((a, b) => b.translateY - a.translateY);
225
- if (upper.length > 0) targetIndex = upper[0].index;
226
+ const upper = allPositions.filter(pos => pos.translateY < currentTranslate - 1).sort((a, b) => b.translateY - a.translateY)[0];
227
+ if (upper !== undefined) targetIndex = upper.index;
226
228
  }
227
229
  }
228
230
  const hasIndexChanged = targetIndex !== currentIndex.value;
@@ -249,7 +251,7 @@ export const BottomSheetBase = ({
249
251
  const isCollapsed = normalizedDetents[resolvedIndex] === 0;
250
252
  const pointerEvents = modal ? isCollapsed ? 'none' : 'auto' : 'box-none';
251
253
  let scrimElement = null;
252
- if (renderScrim) {
254
+ if (renderScrim !== undefined) {
253
255
  scrimElement = renderScrim(scrimProgress);
254
256
  } else if (modal) {
255
257
  scrimElement = /*#__PURE__*/_jsx(DefaultScrim, {
@@ -295,7 +297,7 @@ export const BottomSheetBase = ({
295
297
  const sheetContainer = /*#__PURE__*/_jsxs(Animated.View, {
296
298
  style: StyleSheet.absoluteFill,
297
299
  pointerEvents: pointerEvents,
298
- children: [modal && scrimElement ? /*#__PURE__*/_jsx(Pressable, {
300
+ children: [modal && scrimElement !== null ? /*#__PURE__*/_jsx(Pressable, {
299
301
  style: StyleSheet.absoluteFill,
300
302
  onPress: handleScrimPress,
301
303
  children: scrimElement
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useState","Pressable","StyleSheet","View","useWindowDimensions","Animated","measure","scrollTo","useAnimatedRef","useAnimatedReaction","useAnimatedStyle","useDerivedValue","useSharedValue","withSpring","scheduleOnRN","scheduleOnUI","Gesture","GestureDetector","useSafeAreaInsets","Portal","BottomSheetContextProvider","jsx","_jsx","jsxs","_jsxs","DEFAULT_OPEN_ANIMATION_CONFIG","dampingRatio","duration","overshootClamping","DEFAULT_CLOSE_ANIMATION_CONFIG","VELOCITY_THRESHOLD","resolveDetent","detent","contentHeight","maxHeight","Math","min","Error","clampIndex","index","detentCount","max","DefaultScrim","progress","style","opacity","value","absoluteFill","flex","backgroundColor","BottomSheetBase","children","detents","onIndexChange","position","externalPosition","openAnimationConfig","closeAnimationConfig","modal","renderScrim","height","screenHeight","insets","top","resolvedIndex","length","setContentHeight","normalizedDetents","map","point","resolved","initialMaxSnap","translateY","animationTarget","NaN","sheetHeight","scrollOffset","hasScrollable","isScrollableGestureActive","isScrollableLocked","scrollableRef","isDraggingSheet","isDraggingFromScrollable","panStartY","panActivated","dragStartTranslateY","isTouchWithinScrollable","detentsValue","currentIndex","internalPosition","undefined","set","scrimProgress","maxSnap","handleIndexChange","nextIndex","animateToIndex","targetIndex","velocity","targetTranslate","isOpening","baseConfig","springConfig","panGesture","Pan","manualActivation","onTouchesDown","event","touch","changedTouches","allTouches","absoluteY","layout","withinX","absoluteX","pageX","width","withinY","pageY","onTouchesMove","stateManager","deltaY","activate","onBegin","onUpdate","nextTranslate","translationY","isDraggingDown","canStartDrag","isScrollableActive","onEnd","wasDragging","allPositions","snapIndex","currentTranslate","velocityY","minDistance","Infinity","pos","distance","abs","lower","filter","sort","a","b","upper","hasIndexChanged","shouldApplyVelocity","Number","isFinite","handleSentinelLayout","nativeEvent","y","closedIndex","indexOf","handleScrimPress","wrapperStyle","transform","isCollapsed","pointerEvents","scrimElement","sheetContent","bottom","left","right","gesture","onLayout","sheetContainer","onPress"],"sourceRoot":"../../src","sources":["BottomSheetBase.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useState","Pressable","StyleSheet","View","useWindowDimensions","Animated","measure","scrollTo","useAnimatedRef","useAnimatedReaction","useAnimatedStyle","useDerivedValue","useSharedValue","withSpring","scheduleOnRN","scheduleOnUI","Gesture","GestureDetector","useSafeAreaInsets","Portal","BottomSheetContextProvider","jsx","_jsx","jsxs","_jsxs","DEFAULT_OPEN_ANIMATION_CONFIG","dampingRatio","duration","overshootClamping","DEFAULT_CLOSE_ANIMATION_CONFIG","VELOCITY_THRESHOLD","resolveDetent","detent","contentHeight","maxHeight","Math","min","Error","clampIndex","index","detentCount","max","DefaultScrim","progress","style","opacity","value","absoluteFill","flex","backgroundColor","BottomSheetBase","children","detents","onIndexChange","position","externalPosition","openAnimationConfig","closeAnimationConfig","modal","renderScrim","height","screenHeight","insets","top","resolvedIndex","length","setContentHeight","normalizedDetents","map","point","resolved","initialMaxSnap","translateY","animationTarget","NaN","sheetHeight","scrollOffset","hasScrollable","isScrollableGestureActive","isScrollableLocked","scrollableRef","isDraggingSheet","isDraggingFromScrollable","panStartY","panActivated","dragStartTranslateY","isTouchWithinScrollable","detentsValue","firstNonzeroDetent","find","d","currentIndex","internalPosition","undefined","set","scrimProgress","target","handleIndexChange","nextIndex","maxSnap","animateToIndex","targetIndex","velocity","targetTranslate","isOpening","baseConfig","springConfig","panGesture","Pan","manualActivation","onTouchesDown","event","touch","changedTouches","allTouches","absoluteY","layout","withinX","absoluteX","pageX","width","withinY","pageY","onTouchesMove","stateManager","deltaY","activate","onBegin","onUpdate","isDraggingDown","translationY","canStartDrag","isScrollableActive","nextTranslate","onEnd","wasDragging","allPositions","snapIndex","currentTranslate","velocityY","minDistance","Infinity","pos","distance","abs","lower","filter","sort","a","b","upper","hasIndexChanged","shouldApplyVelocity","Number","isFinite","handleSentinelLayout","nativeEvent","y","closedIndex","indexOf","handleScrimPress","wrapperStyle","transform","isCollapsed","pointerEvents","scrimElement","sheetContent","bottom","left","right","gesture","onLayout","sheetContainer","onPress"],"sourceRoot":"../../src","sources":["BottomSheetBase.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,20 +1,36 @@
1
1
  "use strict";
2
2
 
3
+ import { useImperativeHandle } from 'react';
3
4
  import { GestureDetector } from 'react-native-gesture-handler';
4
- import Animated from 'react-native-reanimated';
5
+ import Animated, { scrollTo } from 'react-native-reanimated';
6
+ import { scheduleOnUI } from 'react-native-worklets';
5
7
  import { useBottomSheetScrollable } from "./useBottomSheetScrollable.js";
6
8
  import { jsx as _jsx } from "react/jsx-runtime";
7
- export const BottomSheetFlatList = props => {
8
- const {
9
- scrollEnabled,
10
- ...rest
11
- } = props;
9
+ export const BottomSheetFlatList = ({
10
+ scrollEnabled,
11
+ onScroll,
12
+ ref,
13
+ ...rest
14
+ }) => {
12
15
  const {
13
16
  scrollHandler,
14
17
  scrollableRef,
15
18
  nativeGesture,
16
19
  animatedProps
17
- } = useBottomSheetScrollable(scrollEnabled);
20
+ } = useBottomSheetScrollable(scrollEnabled, onScroll);
21
+ useImperativeHandle(ref, () => ({
22
+ scrollToOffset: ({
23
+ offset,
24
+ animated
25
+ }) => {
26
+ const resolvedAnimated = animated ?? true;
27
+ scheduleOnUI((animatedRef, y, shouldAnimate) => {
28
+ 'worklet';
29
+
30
+ scrollTo(animatedRef, 0, y, shouldAnimate);
31
+ }, scrollableRef, offset, resolvedAnimated);
32
+ }
33
+ }), [scrollableRef]);
18
34
  return /*#__PURE__*/_jsx(GestureDetector, {
19
35
  gesture: nativeGesture,
20
36
  children: /*#__PURE__*/_jsx(Animated.FlatList, {
@@ -1 +1 @@
1
- {"version":3,"names":["GestureDetector","Animated","useBottomSheetScrollable","jsx","_jsx","BottomSheetFlatList","props","scrollEnabled","rest","scrollHandler","scrollableRef","nativeGesture","animatedProps","gesture","children","FlatList","ref","onScroll","scrollEventThrottle"],"sourceRoot":"../../src","sources":["BottomSheetFlatList.tsx"],"mappings":";;AAAA,SAASA,eAAe,QAAQ,8BAA8B;AAE9D,OAAOC,QAAQ,MAAM,yBAAyB;AAE9C,SAASC,wBAAwB,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEtE,OAAO,MAAMC,mBAAmB,GAC9BC,KAAmD,IAChD;EACH,MAAM;IAAEC,aAAa;IAAE,GAAGC;EAAK,CAAC,GAAGF,KAAK;EACxC,MAAM;IAAEG,aAAa;IAAEC,aAAa;IAAEC,aAAa;IAAEC;EAAc,CAAC,GAClEV,wBAAwB,CAACK,aAAa,CAAC;EACzC,oBACEH,IAAA,CAACJ,eAAe;IAACa,OAAO,EAAEF,aAAc;IAAAG,QAAA,eACtCV,IAAA,CAACH,QAAQ,CAACc,QAAQ;MAAA,GACZP,IAAI;MACRI,aAAa,EAAEA,aAAc;MAC7BI,GAAG,EAAEN,aAAc;MACnBO,QAAQ,EAAER,aAAc;MACxBS,mBAAmB,EAAE;IAAG,CACzB;EAAC,CACa,CAAC;AAEtB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useImperativeHandle","GestureDetector","Animated","scrollTo","scheduleOnUI","useBottomSheetScrollable","jsx","_jsx","BottomSheetFlatList","scrollEnabled","onScroll","ref","rest","scrollHandler","scrollableRef","nativeGesture","animatedProps","scrollToOffset","offset","animated","resolvedAnimated","animatedRef","y","shouldAnimate","gesture","children","FlatList","scrollEventThrottle"],"sourceRoot":"../../src","sources":["BottomSheetFlatList.tsx"],"mappings":";;AAAA,SAASA,mBAAmB,QAAkB,OAAO;AAErD,SAASC,eAAe,QAAQ,8BAA8B;AAE9D,OAAOC,QAAQ,IAAIC,QAAQ,QAAQ,yBAAyB;AAC5D,SAASC,YAAY,QAAQ,uBAAuB;AAEpD,SAASC,wBAAwB,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAQtE,OAAO,MAAMC,mBAAmB,GAAGA,CAAK;EACtCC,aAAa;EACbC,QAAQ;EACRC,GAAG;EACH,GAAGC;AACwB,CAAC,KAAK;EACjC,MAAM;IAAEC,aAAa;IAAEC,aAAa;IAAEC,aAAa;IAAEC;EAAc,CAAC,GAClEX,wBAAwB,CAACI,aAAa,EAAEC,QAAQ,CAAC;EAEnDV,mBAAmB,CACjBW,GAAG,EACH,OAAO;IACLM,cAAc,EAAEA,CAAC;MAAEC,MAAM;MAAEC;IAAS,CAAC,KAAK;MACxC,MAAMC,gBAAgB,GAAGD,QAAQ,IAAI,IAAI;MACzCf,YAAY,CACV,CACEiB,WAA2C,EAC3CC,CAAS,EACTC,aAAsB,KACnB;QACH,SAAS;;QACTpB,QAAQ,CAACkB,WAAW,EAAE,CAAC,EAAEC,CAAC,EAAEC,aAAa,CAAC;MAC5C,CAAC,EACDT,aAAa,EACbI,MAAM,EACNE,gBACF,CAAC;IACH;EACF,CAAC,CAAC,EACF,CAACN,aAAa,CAChB,CAAC;EAED,oBACEP,IAAA,CAACN,eAAe;IAACuB,OAAO,EAAET,aAAc;IAAAU,QAAA,eACtClB,IAAA,CAACL,QAAQ,CAACwB,QAAQ;MAAA,GACZd,IAAI;MACRI,aAAa,EAAEA,aAAc;MAC7BL,GAAG,EAAEG,aAAc;MACnBJ,QAAQ,EAAEG,aAAc;MACxBc,mBAAmB,EAAE;IAAG,CACzB;EAAC,CACa,CAAC;AAEtB,CAAC","ignoreList":[]}
@@ -1,20 +1,37 @@
1
1
  "use strict";
2
2
 
3
+ import { useImperativeHandle } from 'react';
3
4
  import { GestureDetector } from 'react-native-gesture-handler';
4
- import Animated from 'react-native-reanimated';
5
+ import Animated, { scrollTo } from 'react-native-reanimated';
6
+ import { scheduleOnUI } from 'react-native-worklets';
5
7
  import { useBottomSheetScrollable } from "./useBottomSheetScrollable.js";
6
8
  import { jsx as _jsx } from "react/jsx-runtime";
7
- export const BottomSheetScrollView = props => {
8
- const {
9
- scrollEnabled,
10
- ...rest
11
- } = props;
9
+ export const BottomSheetScrollView = ({
10
+ scrollEnabled,
11
+ onScroll,
12
+ ref,
13
+ ...rest
14
+ }) => {
12
15
  const {
13
16
  scrollHandler,
14
17
  scrollableRef,
15
18
  nativeGesture,
16
19
  animatedProps
17
- } = useBottomSheetScrollable(scrollEnabled);
20
+ } = useBottomSheetScrollable(scrollEnabled, onScroll);
21
+ useImperativeHandle(ref, () => ({
22
+ scrollTo: ({
23
+ x = 0,
24
+ y = 0,
25
+ animated
26
+ }) => {
27
+ const resolvedAnimated = animated ?? true;
28
+ scheduleOnUI((animatedRef, xValue, yValue, shouldAnimate) => {
29
+ 'worklet';
30
+
31
+ scrollTo(animatedRef, xValue, yValue, shouldAnimate);
32
+ }, scrollableRef, x, y, resolvedAnimated);
33
+ }
34
+ }), [scrollableRef]);
18
35
  return /*#__PURE__*/_jsx(GestureDetector, {
19
36
  gesture: nativeGesture,
20
37
  children: /*#__PURE__*/_jsx(Animated.ScrollView, {
@@ -1 +1 @@
1
- {"version":3,"names":["GestureDetector","Animated","useBottomSheetScrollable","jsx","_jsx","BottomSheetScrollView","props","scrollEnabled","rest","scrollHandler","scrollableRef","nativeGesture","animatedProps","gesture","children","ScrollView","ref","onScroll","scrollEventThrottle"],"sourceRoot":"../../src","sources":["BottomSheetScrollView.tsx"],"mappings":";;AACA,SAASA,eAAe,QAAQ,8BAA8B;AAC9D,OAAOC,QAAQ,MAAM,yBAAyB;AAE9C,SAASC,wBAAwB,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEtE,OAAO,MAAMC,qBAAqB,GAChCC,KAAwC,IACrC;EACH,MAAM;IAAEC,aAAa;IAAE,GAAGC;EAAK,CAAC,GAAGF,KAAK;EACxC,MAAM;IAAEG,aAAa;IAAEC,aAAa;IAAEC,aAAa;IAAEC;EAAc,CAAC,GAClEV,wBAAwB,CAACK,aAAa,CAAC;EACzC,oBACEH,IAAA,CAACJ,eAAe;IAACa,OAAO,EAAEF,aAAc;IAAAG,QAAA,eACtCV,IAAA,CAACH,QAAQ,CAACc,UAAU;MAAA,GACdP,IAAI;MACRI,aAAa,EAAEA,aAAc;MAC7BI,GAAG,EAAEN,aAAc;MACnBO,QAAQ,EAAER,aAAc;MACxBS,mBAAmB,EAAE;IAAG,CACzB;EAAC,CACa,CAAC;AAEtB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useImperativeHandle","GestureDetector","Animated","scrollTo","scheduleOnUI","useBottomSheetScrollable","jsx","_jsx","BottomSheetScrollView","scrollEnabled","onScroll","ref","rest","scrollHandler","scrollableRef","nativeGesture","animatedProps","x","y","animated","resolvedAnimated","animatedRef","xValue","yValue","shouldAnimate","gesture","children","ScrollView","scrollEventThrottle"],"sourceRoot":"../../src","sources":["BottomSheetScrollView.tsx"],"mappings":";;AAAA,SAASA,mBAAmB,QAAkB,OAAO;AAErD,SAASC,eAAe,QAAQ,8BAA8B;AAC9D,OAAOC,QAAQ,IAAIC,QAAQ,QAAQ,yBAAyB;AAC5D,SAASC,YAAY,QAAQ,uBAAuB;AAEpD,SAASC,wBAAwB,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAUtE,OAAO,MAAMC,qBAAqB,GAAGA,CAAC;EACpCC,aAAa;EACbC,QAAQ;EACRC,GAAG;EACH,GAAGC;AACuB,CAAC,KAAK;EAChC,MAAM;IAAEC,aAAa;IAAEC,aAAa;IAAEC,aAAa;IAAEC;EAAc,CAAC,GAClEX,wBAAwB,CAACI,aAAa,EAAEC,QAAQ,CAAC;EAEnDV,mBAAmB,CACjBW,GAAG,EACH,OAAO;IACLR,QAAQ,EAAEA,CAAC;MAAEc,CAAC,GAAG,CAAC;MAAEC,CAAC,GAAG,CAAC;MAAEC;IAAS,CAAC,KAAK;MACxC,MAAMC,gBAAgB,GAAGD,QAAQ,IAAI,IAAI;MACzCf,YAAY,CACV,CACEiB,WAA2C,EAC3CC,MAAc,EACdC,MAAc,EACdC,aAAsB,KACnB;QACH,SAAS;;QACTrB,QAAQ,CAACkB,WAAW,EAAEC,MAAM,EAAEC,MAAM,EAAEC,aAAa,CAAC;MACtD,CAAC,EACDV,aAAa,EACbG,CAAC,EACDC,CAAC,EACDE,gBACF,CAAC;IACH;EACF,CAAC,CAAC,EACF,CAACN,aAAa,CAChB,CAAC;EAED,oBACEP,IAAA,CAACN,eAAe;IAACwB,OAAO,EAAEV,aAAc;IAAAW,QAAA,eACtCnB,IAAA,CAACL,QAAQ,CAACyB,UAAU;MAAA,GACdf,IAAI;MACRI,aAAa,EAAEA,aAAc;MAC7BL,GAAG,EAAEG,aAAc;MACnBJ,QAAQ,EAAEG,aAAc;MACxBe,mBAAmB,EAAE;IAAG,CACzB;EAAC,CACa,CAAC;AAEtB,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["BottomSheet","ModalBottomSheet","BottomSheetProvider","BottomSheetFlatList","BottomSheetScrollView"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,kBAAe;AAE3C,SAASC,gBAAgB,QAAQ,uBAAoB;AAErD,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,qBAAqB,QAAQ,4BAAyB","ignoreList":[]}
1
+ {"version":3,"names":["BottomSheet","ModalBottomSheet","BottomSheetProvider","BottomSheetFlatList","BottomSheetScrollView"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,kBAAe;AAE3C,SAASC,gBAAgB,QAAQ,uBAAoB;AAErD,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,mBAAmB,QAAQ,0BAAuB;AAK3D,SAASC,qBAAqB,QAAQ,4BAAyB","ignoreList":[]}
@@ -2,9 +2,10 @@
2
2
 
3
3
  import { useEffect } from 'react';
4
4
  import { Gesture } from 'react-native-gesture-handler';
5
+ import { isWorkletFunction, scheduleOnRN } from 'react-native-worklets';
5
6
  import { useAnimatedProps, useAnimatedScrollHandler } from 'react-native-reanimated';
6
7
  import { useBottomSheetContext } from "./BottomSheetContext.js";
7
- export const useBottomSheetScrollable = (baseScrollEnabled = true) => {
8
+ export const useBottomSheetScrollable = (baseScrollEnabled = true, onScroll) => {
8
9
  const {
9
10
  scrollOffset,
10
11
  scrollableRef,
@@ -13,11 +14,18 @@ export const useBottomSheetScrollable = (baseScrollEnabled = true) => {
13
14
  isScrollableLocked,
14
15
  panGesture
15
16
  } = useBottomSheetContext();
17
+ const isWorkletScrollHandler = onScroll !== undefined ? isWorkletFunction(onScroll) : false;
16
18
  const scrollHandler = useAnimatedScrollHandler({
17
19
  onScroll: event => {
18
20
  'worklet';
19
21
 
20
22
  scrollOffset.set(Math.max(0, event.contentOffset.y));
23
+ if (onScroll === undefined) return;
24
+ if (isWorkletScrollHandler) {
25
+ onScroll(event);
26
+ return;
27
+ }
28
+ scheduleOnRN(onScroll, event);
21
29
  }
22
30
  });
23
31
  const nativeGesture = Gesture.Native().simultaneousWithExternalGesture(panGesture).onStart(() => {
@@ -30,7 +38,7 @@ export const useBottomSheetScrollable = (baseScrollEnabled = true) => {
30
38
  isScrollableGestureActive.set(false);
31
39
  });
32
40
  const animatedProps = useAnimatedProps(() => {
33
- const resolvedScrollEnabled = typeof baseScrollEnabled === 'object' && baseScrollEnabled !== null ? baseScrollEnabled.value ?? true : baseScrollEnabled ?? true;
41
+ const resolvedScrollEnabled = (typeof baseScrollEnabled === 'object' && baseScrollEnabled !== null ? baseScrollEnabled.value : baseScrollEnabled) ?? true;
34
42
  return {
35
43
  scrollEnabled: resolvedScrollEnabled && !isScrollableLocked.value
36
44
  };
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","Gesture","useAnimatedProps","useAnimatedScrollHandler","useBottomSheetContext","useBottomSheetScrollable","baseScrollEnabled","scrollOffset","scrollableRef","hasScrollable","isScrollableGestureActive","isScrollableLocked","panGesture","scrollHandler","onScroll","event","set","Math","max","contentOffset","y","nativeGesture","Native","simultaneousWithExternalGesture","onStart","onFinalize","animatedProps","resolvedScrollEnabled","value","scrollEnabled","__DEV__","console","warn"],"sourceRoot":"../../src","sources":["useBottomSheetScrollable.ts"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SAEEC,gBAAgB,EAChBC,wBAAwB,QACnB,yBAAyB;AAEhC,SAASC,qBAAqB,QAAQ,yBAAsB;AAE5D,OAAO,MAAMC,wBAAwB,GAAGA,CACtCC,iBAA6D,GAAG,IAAI,KACjE;EACH,MAAM;IACJC,YAAY;IACZC,aAAa;IACbC,aAAa;IACbC,yBAAyB;IACzBC,kBAAkB;IAClBC;EACF,CAAC,GAAGR,qBAAqB,CAAC,CAAC;EAC3B,MAAMS,aAAa,GAAGV,wBAAwB,CAAC;IAC7CW,QAAQ,EAAGC,KAAK,IAAK;MACnB,SAAS;;MACTR,YAAY,CAACS,GAAG,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,KAAK,CAACI,aAAa,CAACC,CAAC,CAAC,CAAC;IACtD;EACF,CAAC,CAAC;EACF,MAAMC,aAAa,GAAGpB,OAAO,CAACqB,MAAM,CAAC,CAAC,CACnCC,+BAA+B,CAACX,UAAU,CAAC,CAC3CY,OAAO,CAAC,MAAM;IACb,SAAS;;IACTd,yBAAyB,CAACM,GAAG,CAAC,IAAI,CAAC;EACrC,CAAC,CAAC,CACDS,UAAU,CAAC,MAAM;IAChB,SAAS;;IACTf,yBAAyB,CAACM,GAAG,CAAC,KAAK,CAAC;EACtC,CAAC,CAAC;EACJ,MAAMU,aAAa,GAAGxB,gBAAgB,CAAC,MAAM;IAC3C,MAAMyB,qBAAqB,GACzB,OAAOrB,iBAAiB,KAAK,QAAQ,IAAIA,iBAAiB,KAAK,IAAI,GAC/DA,iBAAiB,CAACsB,KAAK,IAAI,IAAI,GAC/BtB,iBAAiB,IAAI,IAAI;IAC/B,OAAO;MACLuB,aAAa,EAAEF,qBAAqB,IAAI,CAAChB,kBAAkB,CAACiB;IAC9D,CAAC;EACH,CAAC,CAAC;EACF5B,SAAS,CAAC,MAAM;IACd,IAAI8B,OAAO,IAAIrB,aAAa,CAACmB,KAAK,EAAE;MAClCG,OAAO,CAACC,IAAI,CACV,sFAAsF,GACpF,yDACJ,CAAC;IACH;IACAvB,aAAa,CAACO,GAAG,CAAC,IAAI,CAAC;IACvB,OAAO,MAAM;MACXP,aAAa,CAACO,GAAG,CAAC,KAAK,CAAC;MACxBN,yBAAyB,CAACM,GAAG,CAAC,KAAK,CAAC;MACpCL,kBAAkB,CAACK,GAAG,CAAC,KAAK,CAAC;IAC/B,CAAC;EACH,CAAC,EAAE,CAACP,aAAa,EAAEC,yBAAyB,EAAEC,kBAAkB,CAAC,CAAC;EAClE,OAAO;IAAEE,aAAa;IAAEL,aAAa;IAAEa,aAAa;IAAEK;EAAc,CAAC;AACvE,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","Gesture","isWorkletFunction","scheduleOnRN","useAnimatedProps","useAnimatedScrollHandler","useBottomSheetContext","useBottomSheetScrollable","baseScrollEnabled","onScroll","scrollOffset","scrollableRef","hasScrollable","isScrollableGestureActive","isScrollableLocked","panGesture","isWorkletScrollHandler","undefined","scrollHandler","event","set","Math","max","contentOffset","y","nativeGesture","Native","simultaneousWithExternalGesture","onStart","onFinalize","animatedProps","resolvedScrollEnabled","value","scrollEnabled","__DEV__","console","warn"],"sourceRoot":"../../src","sources":["useBottomSheetScrollable.ts"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,OAAO,QAAQ,8BAA8B;AAEtD,SAASC,iBAAiB,EAAEC,YAAY,QAAQ,uBAAuB;AACvE,SAEEC,gBAAgB,EAChBC,wBAAwB,QACnB,yBAAyB;AAEhC,SAASC,qBAAqB,QAAQ,yBAAsB;AAI5D,OAAO,MAAMC,wBAAwB,GAAGA,CACtCC,iBAA6D,GAAG,IAAI,EACpEC,QAAwB,KACrB;EACH,MAAM;IACJC,YAAY;IACZC,aAAa;IACbC,aAAa;IACbC,yBAAyB;IACzBC,kBAAkB;IAClBC;EACF,CAAC,GAAGT,qBAAqB,CAAC,CAAC;EAC3B,MAAMU,sBAAsB,GAC1BP,QAAQ,KAAKQ,SAAS,GAAGf,iBAAiB,CAACO,QAAQ,CAAC,GAAG,KAAK;EAC9D,MAAMS,aAAa,GAAGb,wBAAwB,CAAC;IAC7CI,QAAQ,EAAGU,KAAK,IAAK;MACnB,SAAS;;MACTT,YAAY,CAACU,GAAG,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,KAAK,CAACI,aAAa,CAACC,CAAC,CAAC,CAAC;MACpD,IAAIf,QAAQ,KAAKQ,SAAS,EAAE;MAC5B,IAAID,sBAAsB,EAAE;QAC1BP,QAAQ,CAACU,KAAK,CAAC;QACf;MACF;MACAhB,YAAY,CAACM,QAAQ,EAAEU,KAAK,CAAC;IAC/B;EACF,CAAC,CAAC;EACF,MAAMM,aAAa,GAAGxB,OAAO,CAACyB,MAAM,CAAC,CAAC,CACnCC,+BAA+B,CAACZ,UAAU,CAAC,CAC3Ca,OAAO,CAAC,MAAM;IACb,SAAS;;IACTf,yBAAyB,CAACO,GAAG,CAAC,IAAI,CAAC;EACrC,CAAC,CAAC,CACDS,UAAU,CAAC,MAAM;IAChB,SAAS;;IACThB,yBAAyB,CAACO,GAAG,CAAC,KAAK,CAAC;EACtC,CAAC,CAAC;EACJ,MAAMU,aAAa,GAAG1B,gBAAgB,CAAC,MAAM;IAC3C,MAAM2B,qBAAqB,GACzB,CAAC,OAAOvB,iBAAiB,KAAK,QAAQ,IAAIA,iBAAiB,KAAK,IAAI,GAChEA,iBAAiB,CAACwB,KAAK,GACvBxB,iBAAiB,KAAK,IAAI;IAChC,OAAO;MACLyB,aAAa,EAAEF,qBAAqB,IAAI,CAACjB,kBAAkB,CAACkB;IAC9D,CAAC;EACH,CAAC,CAAC;EACFhC,SAAS,CAAC,MAAM;IACd,IAAIkC,OAAO,IAAItB,aAAa,CAACoB,KAAK,EAAE;MAClCG,OAAO,CAACC,IAAI,CACV,sFAAsF,GACpF,yDACJ,CAAC;IACH;IACAxB,aAAa,CAACQ,GAAG,CAAC,IAAI,CAAC;IACvB,OAAO,MAAM;MACXR,aAAa,CAACQ,GAAG,CAAC,KAAK,CAAC;MACxBP,yBAAyB,CAACO,GAAG,CAAC,KAAK,CAAC;MACpCN,kBAAkB,CAACM,GAAG,CAAC,KAAK,CAAC;IAC/B,CAAC;EACH,CAAC,EAAE,CAACR,aAAa,EAAEC,yBAAyB,EAAEC,kBAAkB,CAAC,CAAC;EAClE,OAAO;IAAEI,aAAa;IAAEP,aAAa;IAAEc,aAAa;IAAEK;EAAc,CAAC;AACvE,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheetBase.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetBase.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAiB7E,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEpC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;IACvC,oBAAoB,CAAC,EAAE,gBAAgB,CAAC;CACzC;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;CAC5D;AA8CD,eAAO,MAAM,eAAe,GAAI,yIAU7B,oBAAoB,4CA6RtB,CAAC"}
1
+ {"version":3,"file":"BottomSheetBase.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetBase.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAiB7E,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEpC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;IACvC,oBAAoB,CAAC,EAAE,gBAAgB,CAAC;CACzC;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;CAC5D;AA8CD,eAAO,MAAM,eAAe,GAAI,yIAU7B,oBAAoB,4CA8RtB,CAAC"}
@@ -1,3 +1,15 @@
1
+ import { type Ref } from 'react';
2
+ import type { NativeScrollEvent } from 'react-native';
1
3
  import type { FlatListPropsWithLayout } from 'react-native-reanimated';
2
- export declare const BottomSheetFlatList: <T>(props: Omit<FlatListPropsWithLayout<T>, "onScroll">) => import("react/jsx-runtime").JSX.Element;
4
+ export interface BottomSheetFlatListProps<T> extends Omit<FlatListPropsWithLayout<T>, 'onScroll' | 'ref'> {
5
+ onScroll?: (event: NativeScrollEvent) => void;
6
+ ref?: Ref<BottomSheetFlatListMethods>;
7
+ }
8
+ export declare const BottomSheetFlatList: <T>({ scrollEnabled, onScroll, ref, ...rest }: BottomSheetFlatListProps<T>) => import("react/jsx-runtime").JSX.Element;
9
+ export type BottomSheetFlatListMethods = {
10
+ scrollToOffset: (params: {
11
+ offset: number;
12
+ animated?: boolean;
13
+ }) => void;
14
+ };
3
15
  //# sourceMappingURL=BottomSheetFlatList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheetFlatList.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetFlatList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAKvE,eAAO,MAAM,mBAAmB,GAAI,CAAC,EACnC,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,4CAgBpD,CAAC"}
1
+ {"version":3,"file":"BottomSheetFlatList.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetFlatList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAMvE,MAAM,WAAW,wBAAwB,CAAC,CAAC,CACzC,SAAQ,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IAC5D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,GAAG,CAAC,EAAE,GAAG,CAAC,0BAA0B,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAG,2CAKrC,wBAAwB,CAAC,CAAC,CAAC,4CAsC7B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAC1E,CAAC"}
@@ -1,3 +1,17 @@
1
- import type { ScrollViewProps } from 'react-native';
2
- export declare const BottomSheetScrollView: (props: Omit<ScrollViewProps, "onScroll">) => import("react/jsx-runtime").JSX.Element;
1
+ import { type Ref } from 'react';
2
+ import type { NativeScrollEvent, ScrollViewProps } from 'react-native';
3
+ type ScrollToOptions = {
4
+ x?: number;
5
+ y?: number;
6
+ animated?: boolean;
7
+ };
8
+ export interface BottomSheetScrollViewProps extends Omit<ScrollViewProps, 'onScroll' | 'ref'> {
9
+ onScroll?: (event: NativeScrollEvent) => void;
10
+ ref?: Ref<BottomSheetScrollViewMethods>;
11
+ }
12
+ export declare const BottomSheetScrollView: ({ scrollEnabled, onScroll, ref, ...rest }: BottomSheetScrollViewProps) => import("react/jsx-runtime").JSX.Element;
13
+ export type BottomSheetScrollViewMethods = {
14
+ scrollTo: (options: ScrollToOptions) => void;
15
+ };
16
+ export {};
3
17
  //# sourceMappingURL=BottomSheetScrollView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheetScrollView.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,eAAO,MAAM,qBAAqB,GAChC,OAAO,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,4CAgBzC,CAAC"}
1
+ {"version":3,"file":"BottomSheetScrollView.d.ts","sourceRoot":"","sources":["../../../src/BottomSheetScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAOvE,KAAK,eAAe,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE,MAAM,WAAW,0BACf,SAAQ,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,KAAK,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,GAAG,CAAC,EAAE,GAAG,CAAC,4BAA4B,CAAC,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,GAAI,2CAKnC,0BAA0B,4CAwC5B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;CAC9C,CAAC"}
@@ -4,6 +4,8 @@ export { ModalBottomSheet } from './ModalBottomSheet';
4
4
  export type { ModalBottomSheetProps } from './ModalBottomSheet';
5
5
  export { BottomSheetProvider } from './BottomSheetProvider';
6
6
  export { BottomSheetFlatList } from './BottomSheetFlatList';
7
+ export type { BottomSheetFlatListMethods, BottomSheetFlatListProps, } from './BottomSheetFlatList';
7
8
  export { BottomSheetScrollView } from './BottomSheetScrollView';
9
+ export type { BottomSheetScrollViewMethods, BottomSheetScrollViewProps, } from './BottomSheetScrollView';
8
10
  export type { Detent } from './BottomSheetBase';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,5 +1,7 @@
1
+ import type { NativeScrollEvent } from 'react-native';
1
2
  import { type SharedValue } from 'react-native-reanimated';
2
- export declare const useBottomSheetScrollable: (baseScrollEnabled?: boolean | SharedValue<boolean | undefined>) => {
3
+ type ScrollHandler = (event: NativeScrollEvent) => void;
4
+ export declare const useBottomSheetScrollable: (baseScrollEnabled?: boolean | SharedValue<boolean | undefined>, onScroll?: ScrollHandler) => {
3
5
  scrollHandler: import("react-native-reanimated").ScrollHandlerProcessed<Record<string, unknown>>;
4
6
  scrollableRef: import("react-native-reanimated").AnimatedRef<any>;
5
7
  nativeGesture: import("react-native-gesture-handler/lib/typescript/handlers/gestures/nativeGesture").NativeGesture;
@@ -7,4 +9,5 @@ export declare const useBottomSheetScrollable: (baseScrollEnabled?: boolean | Sh
7
9
  scrollEnabled: boolean;
8
10
  }>;
9
11
  };
12
+ export {};
10
13
  //# sourceMappingURL=useBottomSheetScrollable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBottomSheetScrollable.d.ts","sourceRoot":"","sources":["../../../src/useBottomSheetScrollable.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAIjC,eAAO,MAAM,wBAAwB,GACnC,oBAAmB,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,SAAS,CAAQ;;;;;;;CAkDrE,CAAC"}
1
+ {"version":3,"file":"useBottomSheetScrollable.d.ts","sourceRoot":"","sources":["../../../src/useBottomSheetScrollable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,yBAAyB,CAAC;AAIjC,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAExD,eAAO,MAAM,wBAAwB,GACnC,oBAAmB,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,SAAS,CAAQ,EACpE,WAAW,aAAa;;;;;;;CA0DzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swmansion/react-native-bottom-sheet",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Provides bottom-sheet components for React Native.",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -114,4 +114,4 @@
114
114
  "trailingComma": "es5",
115
115
  "useTabs": false
116
116
  }
117
- }
117
+ }
@@ -119,6 +119,9 @@ export const BottomSheetBase = ({
119
119
  const dragStartTranslateY = useSharedValue(0);
120
120
  const isTouchWithinScrollable = useSharedValue(false);
121
121
  const detentsValue = useSharedValue(normalizedDetents);
122
+ const firstNonzeroDetent = useSharedValue(
123
+ normalizedDetents.find((d) => d > 0) ?? 0
124
+ );
122
125
  const currentIndex = useSharedValue(resolvedIndex);
123
126
  const internalPosition = useDerivedValue(() =>
124
127
  Math.max(0, sheetHeight.value - translateY.value)
@@ -130,9 +133,9 @@ export const BottomSheetBase = ({
130
133
  }
131
134
  );
132
135
  const scrimProgress = useDerivedValue(() => {
133
- const maxSnap = sheetHeight.value;
134
- if (maxSnap <= 0) return 0;
135
- const progress = internalPosition.value / maxSnap;
136
+ const target = firstNonzeroDetent.value;
137
+ if (target <= 0) return 0;
138
+ const progress = internalPosition.value / target;
136
139
  return Math.min(1, Math.max(0, progress));
137
140
  });
138
141
  const handleIndexChange = (nextIndex: number) => {
@@ -142,7 +145,8 @@ export const BottomSheetBase = ({
142
145
  const maxSnap = Math.max(0, ...normalizedDetents);
143
146
  detentsValue.set(normalizedDetents);
144
147
  sheetHeight.set(maxSnap);
145
- }, [normalizedDetents, sheetHeight, detentsValue]);
148
+ firstNonzeroDetent.set(normalizedDetents.find((d) => d > 0) ?? 0);
149
+ }, [normalizedDetents, sheetHeight, detentsValue, firstNonzeroDetent]);
146
150
  const animateToIndex = useCallback(
147
151
  (targetIndex: number, velocity?: number) => {
148
152
  'worklet';
@@ -183,17 +187,19 @@ export const BottomSheetBase = ({
183
187
  isScrollableLocked.set(false);
184
188
  isTouchWithinScrollable.set(false);
185
189
  const touch = event.changedTouches[0] ?? event.allTouches[0];
186
- if (touch) panStartY.set(touch.absoluteY);
187
- if (touch && hasScrollable.value) {
188
- const layout = measure(scrollableRef);
189
- if (layout) {
190
- const withinX =
191
- touch.absoluteX >= layout.pageX &&
192
- touch.absoluteX <= layout.pageX + layout.width;
193
- const withinY =
194
- touch.absoluteY >= layout.pageY &&
195
- touch.absoluteY <= layout.pageY + layout.height;
196
- isTouchWithinScrollable.set(withinX && withinY);
190
+ if (touch !== undefined) {
191
+ panStartY.set(touch.absoluteY);
192
+ if (hasScrollable.value) {
193
+ const layout = measure(scrollableRef);
194
+ if (layout !== null) {
195
+ const withinX =
196
+ touch.absoluteX >= layout.pageX &&
197
+ touch.absoluteX <= layout.pageX + layout.width;
198
+ const withinY =
199
+ touch.absoluteY >= layout.pageY &&
200
+ touch.absoluteY <= layout.pageY + layout.height;
201
+ isTouchWithinScrollable.set(withinX && withinY);
202
+ }
197
203
  }
198
204
  }
199
205
  })
@@ -228,30 +234,25 @@ export const BottomSheetBase = ({
228
234
  if (isDraggingFromScrollable.value) {
229
235
  scrollTo(scrollableRef, 0, 0, false);
230
236
  }
231
- const nextTranslate = Math.min(
232
- Math.max(dragStartTranslateY.value + event.translationY, 0),
233
- sheetHeight.value
237
+ } else {
238
+ const isDraggingDown = event.translationY > 0;
239
+ const canStartDrag =
240
+ !hasScrollable.value ||
241
+ scrollOffset.value <= 0 ||
242
+ !isTouchWithinScrollable.value;
243
+ if (!canStartDrag || (!isDraggingDown && translateY.value <= 0)) {
244
+ return;
245
+ }
246
+ const isScrollableActive =
247
+ hasScrollable.value && isScrollableGestureActive.value;
248
+ isDraggingSheet.set(true);
249
+ isDraggingFromScrollable.set(
250
+ isScrollableActive && isTouchWithinScrollable.value
234
251
  );
235
- translateY.set(nextTranslate);
236
- return;
237
- }
238
- const isDraggingDown = event.translationY > 0;
239
- const canStartDrag =
240
- !hasScrollable.value ||
241
- scrollOffset.value <= 0 ||
242
- !isTouchWithinScrollable.value;
243
- if (!canStartDrag || (!isDraggingDown && translateY.value <= 0)) {
244
- return;
245
- }
246
- const isScrollableActive =
247
- hasScrollable.value && isScrollableGestureActive.value;
248
- isDraggingSheet.set(true);
249
- isDraggingFromScrollable.set(
250
- isScrollableActive && isTouchWithinScrollable.value
251
- );
252
- isScrollableLocked.set(hasScrollable.value);
253
- if (isTouchWithinScrollable.value && hasScrollable.value) {
254
- scrollTo(scrollableRef, 0, 0, false);
252
+ isScrollableLocked.set(hasScrollable.value);
253
+ if (isTouchWithinScrollable.value && hasScrollable.value) {
254
+ scrollTo(scrollableRef, 0, 0, false);
255
+ }
255
256
  }
256
257
  const nextTranslate = Math.min(
257
258
  Math.max(dragStartTranslateY.value + event.translationY, 0),
@@ -288,13 +289,13 @@ export const BottomSheetBase = ({
288
289
  if (velocityY > 0) {
289
290
  const lower = allPositions
290
291
  .filter((pos) => pos.translateY > currentTranslate + 1)
291
- .sort((a, b) => a.translateY - b.translateY);
292
- if (lower.length > 0) targetIndex = lower[0]!.index;
292
+ .sort((a, b) => a.translateY - b.translateY)[0];
293
+ if (lower !== undefined) targetIndex = lower.index;
293
294
  } else {
294
295
  const upper = allPositions
295
296
  .filter((pos) => pos.translateY < currentTranslate - 1)
296
- .sort((a, b) => b.translateY - a.translateY);
297
- if (upper.length > 0) targetIndex = upper[0]!.index;
297
+ .sort((a, b) => b.translateY - a.translateY)[0];
298
+ if (upper !== undefined) targetIndex = upper.index;
298
299
  }
299
300
  }
300
301
  const hasIndexChanged = targetIndex !== currentIndex.value;
@@ -319,7 +320,7 @@ export const BottomSheetBase = ({
319
320
  const isCollapsed = normalizedDetents[resolvedIndex] === 0;
320
321
  const pointerEvents = modal ? (isCollapsed ? 'none' : 'auto') : 'box-none';
321
322
  let scrimElement: ReactNode | null = null;
322
- if (renderScrim) {
323
+ if (renderScrim !== undefined) {
323
324
  scrimElement = renderScrim(scrimProgress);
324
325
  } else if (modal) {
325
326
  scrimElement = <DefaultScrim progress={scrimProgress} />;
@@ -365,7 +366,7 @@ export const BottomSheetBase = ({
365
366
  style={StyleSheet.absoluteFill}
366
367
  pointerEvents={pointerEvents}
367
368
  >
368
- {modal && scrimElement ? (
369
+ {modal && scrimElement !== null ? (
369
370
  <Pressable style={StyleSheet.absoluteFill} onPress={handleScrimPress}>
370
371
  {scrimElement}
371
372
  </Pressable>
@@ -1,15 +1,50 @@
1
+ import { useImperativeHandle, type Ref } from 'react';
2
+ import type { NativeScrollEvent } from 'react-native';
1
3
  import { GestureDetector } from 'react-native-gesture-handler';
2
4
  import type { FlatListPropsWithLayout } from 'react-native-reanimated';
3
- import Animated from 'react-native-reanimated';
5
+ import Animated, { scrollTo } from 'react-native-reanimated';
6
+ import { scheduleOnUI } from 'react-native-worklets';
4
7
 
5
8
  import { useBottomSheetScrollable } from './useBottomSheetScrollable';
6
9
 
7
- export const BottomSheetFlatList = <T,>(
8
- props: Omit<FlatListPropsWithLayout<T>, 'onScroll'>
9
- ) => {
10
- const { scrollEnabled, ...rest } = props;
10
+ export interface BottomSheetFlatListProps<T>
11
+ extends Omit<FlatListPropsWithLayout<T>, 'onScroll' | 'ref'> {
12
+ onScroll?: (event: NativeScrollEvent) => void;
13
+ ref?: Ref<BottomSheetFlatListMethods>;
14
+ }
15
+
16
+ export const BottomSheetFlatList = <T,>({
17
+ scrollEnabled,
18
+ onScroll,
19
+ ref,
20
+ ...rest
21
+ }: BottomSheetFlatListProps<T>) => {
11
22
  const { scrollHandler, scrollableRef, nativeGesture, animatedProps } =
12
- useBottomSheetScrollable(scrollEnabled);
23
+ useBottomSheetScrollable(scrollEnabled, onScroll);
24
+
25
+ useImperativeHandle(
26
+ ref,
27
+ () => ({
28
+ scrollToOffset: ({ offset, animated }) => {
29
+ const resolvedAnimated = animated ?? true;
30
+ scheduleOnUI(
31
+ (
32
+ animatedRef: Parameters<typeof scrollTo>[0],
33
+ y: number,
34
+ shouldAnimate: boolean
35
+ ) => {
36
+ 'worklet';
37
+ scrollTo(animatedRef, 0, y, shouldAnimate);
38
+ },
39
+ scrollableRef,
40
+ offset,
41
+ resolvedAnimated
42
+ );
43
+ },
44
+ }),
45
+ [scrollableRef]
46
+ );
47
+
13
48
  return (
14
49
  <GestureDetector gesture={nativeGesture}>
15
50
  <Animated.FlatList
@@ -22,3 +57,7 @@ export const BottomSheetFlatList = <T,>(
22
57
  </GestureDetector>
23
58
  );
24
59
  };
60
+
61
+ export type BottomSheetFlatListMethods = {
62
+ scrollToOffset: (params: { offset: number; animated?: boolean }) => void;
63
+ };
@@ -1,15 +1,53 @@
1
- import type { ScrollViewProps } from 'react-native';
1
+ import { useImperativeHandle, type Ref } from 'react';
2
+ import type { NativeScrollEvent, ScrollViewProps } from 'react-native';
2
3
  import { GestureDetector } from 'react-native-gesture-handler';
3
- import Animated from 'react-native-reanimated';
4
+ import Animated, { scrollTo } from 'react-native-reanimated';
5
+ import { scheduleOnUI } from 'react-native-worklets';
4
6
 
5
7
  import { useBottomSheetScrollable } from './useBottomSheetScrollable';
6
8
 
7
- export const BottomSheetScrollView = (
8
- props: Omit<ScrollViewProps, 'onScroll'>
9
- ) => {
10
- const { scrollEnabled, ...rest } = props;
9
+ type ScrollToOptions = { x?: number; y?: number; animated?: boolean };
10
+
11
+ export interface BottomSheetScrollViewProps
12
+ extends Omit<ScrollViewProps, 'onScroll' | 'ref'> {
13
+ onScroll?: (event: NativeScrollEvent) => void;
14
+ ref?: Ref<BottomSheetScrollViewMethods>;
15
+ }
16
+
17
+ export const BottomSheetScrollView = ({
18
+ scrollEnabled,
19
+ onScroll,
20
+ ref,
21
+ ...rest
22
+ }: BottomSheetScrollViewProps) => {
11
23
  const { scrollHandler, scrollableRef, nativeGesture, animatedProps } =
12
- useBottomSheetScrollable(scrollEnabled);
24
+ useBottomSheetScrollable(scrollEnabled, onScroll);
25
+
26
+ useImperativeHandle(
27
+ ref,
28
+ () => ({
29
+ scrollTo: ({ x = 0, y = 0, animated }) => {
30
+ const resolvedAnimated = animated ?? true;
31
+ scheduleOnUI(
32
+ (
33
+ animatedRef: Parameters<typeof scrollTo>[0],
34
+ xValue: number,
35
+ yValue: number,
36
+ shouldAnimate: boolean
37
+ ) => {
38
+ 'worklet';
39
+ scrollTo(animatedRef, xValue, yValue, shouldAnimate);
40
+ },
41
+ scrollableRef,
42
+ x,
43
+ y,
44
+ resolvedAnimated
45
+ );
46
+ },
47
+ }),
48
+ [scrollableRef]
49
+ );
50
+
13
51
  return (
14
52
  <GestureDetector gesture={nativeGesture}>
15
53
  <Animated.ScrollView
@@ -22,3 +60,7 @@ export const BottomSheetScrollView = (
22
60
  </GestureDetector>
23
61
  );
24
62
  };
63
+
64
+ export type BottomSheetScrollViewMethods = {
65
+ scrollTo: (options: ScrollToOptions) => void;
66
+ };
package/src/index.tsx CHANGED
@@ -4,5 +4,13 @@ export { ModalBottomSheet } from './ModalBottomSheet';
4
4
  export type { ModalBottomSheetProps } from './ModalBottomSheet';
5
5
  export { BottomSheetProvider } from './BottomSheetProvider';
6
6
  export { BottomSheetFlatList } from './BottomSheetFlatList';
7
+ export type {
8
+ BottomSheetFlatListMethods,
9
+ BottomSheetFlatListProps,
10
+ } from './BottomSheetFlatList';
7
11
  export { BottomSheetScrollView } from './BottomSheetScrollView';
12
+ export type {
13
+ BottomSheetScrollViewMethods,
14
+ BottomSheetScrollViewProps,
15
+ } from './BottomSheetScrollView';
8
16
  export type { Detent } from './BottomSheetBase';
@@ -1,5 +1,7 @@
1
1
  import { useEffect } from 'react';
2
2
  import { Gesture } from 'react-native-gesture-handler';
3
+ import type { NativeScrollEvent } from 'react-native';
4
+ import { isWorkletFunction, scheduleOnRN } from 'react-native-worklets';
3
5
  import {
4
6
  type SharedValue,
5
7
  useAnimatedProps,
@@ -8,8 +10,11 @@ import {
8
10
 
9
11
  import { useBottomSheetContext } from './BottomSheetContext';
10
12
 
13
+ type ScrollHandler = (event: NativeScrollEvent) => void;
14
+
11
15
  export const useBottomSheetScrollable = (
12
- baseScrollEnabled: boolean | SharedValue<boolean | undefined> = true
16
+ baseScrollEnabled: boolean | SharedValue<boolean | undefined> = true,
17
+ onScroll?: ScrollHandler
13
18
  ) => {
14
19
  const {
15
20
  scrollOffset,
@@ -19,10 +24,18 @@ export const useBottomSheetScrollable = (
19
24
  isScrollableLocked,
20
25
  panGesture,
21
26
  } = useBottomSheetContext();
27
+ const isWorkletScrollHandler =
28
+ onScroll !== undefined ? isWorkletFunction(onScroll) : false;
22
29
  const scrollHandler = useAnimatedScrollHandler({
23
30
  onScroll: (event) => {
24
31
  'worklet';
25
32
  scrollOffset.set(Math.max(0, event.contentOffset.y));
33
+ if (onScroll === undefined) return;
34
+ if (isWorkletScrollHandler) {
35
+ onScroll(event);
36
+ return;
37
+ }
38
+ scheduleOnRN(onScroll, event);
26
39
  },
27
40
  });
28
41
  const nativeGesture = Gesture.Native()
@@ -37,9 +50,9 @@ export const useBottomSheetScrollable = (
37
50
  });
38
51
  const animatedProps = useAnimatedProps(() => {
39
52
  const resolvedScrollEnabled =
40
- typeof baseScrollEnabled === 'object' && baseScrollEnabled !== null
41
- ? baseScrollEnabled.value ?? true
42
- : baseScrollEnabled ?? true;
53
+ (typeof baseScrollEnabled === 'object' && baseScrollEnabled !== null
54
+ ? baseScrollEnabled.value
55
+ : baseScrollEnabled) ?? true;
43
56
  return {
44
57
  scrollEnabled: resolvedScrollEnabled && !isScrollableLocked.value,
45
58
  };