@tamagui/sheet 2.0.0-1769233344020 → 2.0.0-1769256574467
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/dist/cjs/GestureDetectorWrapper.cjs +48 -0
- package/dist/cjs/GestureDetectorWrapper.js +29 -0
- package/dist/cjs/GestureDetectorWrapper.js.map +6 -0
- package/dist/cjs/GestureDetectorWrapper.native.js +53 -0
- package/dist/cjs/GestureDetectorWrapper.native.js.map +1 -0
- package/dist/cjs/GestureSheetContext.cjs +52 -0
- package/dist/cjs/GestureSheetContext.js +43 -0
- package/dist/cjs/GestureSheetContext.js.map +6 -0
- package/dist/cjs/GestureSheetContext.native.js +56 -0
- package/dist/cjs/GestureSheetContext.native.js.map +1 -0
- package/dist/cjs/SheetImplementationCustom.cjs +85 -40
- package/dist/cjs/SheetImplementationCustom.js +81 -58
- package/dist/cjs/SheetImplementationCustom.js.map +1 -1
- package/dist/cjs/SheetImplementationCustom.native.js +105 -50
- package/dist/cjs/SheetImplementationCustom.native.js.map +1 -1
- package/dist/cjs/SheetScrollView.cjs +80 -8
- package/dist/cjs/SheetScrollView.js +76 -10
- package/dist/cjs/SheetScrollView.js.map +1 -1
- package/dist/cjs/SheetScrollView.native.js +94 -10
- package/dist/cjs/SheetScrollView.native.js.map +1 -1
- package/dist/cjs/gestureState.cjs +31 -0
- package/dist/cjs/gestureState.js +24 -0
- package/dist/cjs/gestureState.js.map +6 -0
- package/dist/cjs/gestureState.native.js +34 -0
- package/dist/cjs/gestureState.native.js.map +1 -0
- package/dist/cjs/setupGestureHandler.cjs +43 -0
- package/dist/cjs/setupGestureHandler.js +35 -0
- package/dist/cjs/setupGestureHandler.js.map +6 -0
- package/dist/cjs/setupGestureHandler.native.js +47 -0
- package/dist/cjs/setupGestureHandler.native.js.map +1 -0
- package/dist/cjs/useGestureHandlerPan.cjs +125 -0
- package/dist/cjs/useGestureHandlerPan.js +116 -0
- package/dist/cjs/useGestureHandlerPan.js.map +6 -0
- package/dist/cjs/useGestureHandlerPan.native.js +134 -0
- package/dist/cjs/useGestureHandlerPan.native.js.map +1 -0
- package/dist/esm/GestureDetectorWrapper.js +15 -0
- package/dist/esm/GestureDetectorWrapper.js.map +6 -0
- package/dist/esm/GestureDetectorWrapper.mjs +25 -0
- package/dist/esm/GestureDetectorWrapper.mjs.map +1 -0
- package/dist/esm/GestureDetectorWrapper.native.js +27 -0
- package/dist/esm/GestureDetectorWrapper.native.js.map +1 -0
- package/dist/esm/GestureSheetContext.js +28 -0
- package/dist/esm/GestureSheetContext.js.map +6 -0
- package/dist/esm/GestureSheetContext.mjs +28 -0
- package/dist/esm/GestureSheetContext.mjs.map +1 -0
- package/dist/esm/GestureSheetContext.native.js +29 -0
- package/dist/esm/GestureSheetContext.native.js.map +1 -0
- package/dist/esm/SheetImplementationCustom.js +83 -57
- package/dist/esm/SheetImplementationCustom.js.map +1 -1
- package/dist/esm/SheetImplementationCustom.mjs +85 -40
- package/dist/esm/SheetImplementationCustom.mjs.map +1 -1
- package/dist/esm/SheetImplementationCustom.native.js +105 -50
- package/dist/esm/SheetImplementationCustom.native.js.map +1 -1
- package/dist/esm/SheetScrollView.js +77 -9
- package/dist/esm/SheetScrollView.js.map +1 -1
- package/dist/esm/SheetScrollView.mjs +80 -8
- package/dist/esm/SheetScrollView.mjs.map +1 -1
- package/dist/esm/SheetScrollView.native.js +94 -10
- package/dist/esm/SheetScrollView.native.js.map +1 -1
- package/dist/esm/gestureState.js +13 -0
- package/dist/esm/gestureState.js.map +6 -0
- package/dist/esm/gestureState.mjs +5 -0
- package/dist/esm/gestureState.mjs.map +1 -0
- package/dist/esm/gestureState.native.js +5 -0
- package/dist/esm/gestureState.native.js.map +1 -0
- package/dist/esm/setupGestureHandler.js +19 -0
- package/dist/esm/setupGestureHandler.js.map +6 -0
- package/dist/esm/setupGestureHandler.mjs +19 -0
- package/dist/esm/setupGestureHandler.mjs.map +1 -0
- package/dist/esm/setupGestureHandler.native.js +20 -0
- package/dist/esm/setupGestureHandler.native.js.map +1 -0
- package/dist/esm/useGestureHandlerPan.js +101 -0
- package/dist/esm/useGestureHandlerPan.js.map +6 -0
- package/dist/esm/useGestureHandlerPan.mjs +102 -0
- package/dist/esm/useGestureHandlerPan.mjs.map +1 -0
- package/dist/esm/useGestureHandlerPan.native.js +108 -0
- package/dist/esm/useGestureHandlerPan.native.js.map +1 -0
- package/dist/jsx/GestureDetectorWrapper.js +15 -0
- package/dist/jsx/GestureDetectorWrapper.js.map +6 -0
- package/dist/jsx/GestureDetectorWrapper.mjs +25 -0
- package/dist/jsx/GestureDetectorWrapper.mjs.map +1 -0
- package/dist/jsx/GestureDetectorWrapper.native.js +53 -0
- package/dist/jsx/GestureDetectorWrapper.native.js.map +1 -0
- package/dist/jsx/GestureSheetContext.js +28 -0
- package/dist/jsx/GestureSheetContext.js.map +6 -0
- package/dist/jsx/GestureSheetContext.mjs +28 -0
- package/dist/jsx/GestureSheetContext.mjs.map +1 -0
- package/dist/jsx/GestureSheetContext.native.js +56 -0
- package/dist/jsx/GestureSheetContext.native.js.map +1 -0
- package/dist/jsx/SheetImplementationCustom.js +83 -57
- package/dist/jsx/SheetImplementationCustom.js.map +1 -1
- package/dist/jsx/SheetImplementationCustom.mjs +85 -40
- package/dist/jsx/SheetImplementationCustom.mjs.map +1 -1
- package/dist/jsx/SheetImplementationCustom.native.js +105 -50
- package/dist/jsx/SheetImplementationCustom.native.js.map +1 -1
- package/dist/jsx/SheetScrollView.js +77 -9
- package/dist/jsx/SheetScrollView.js.map +1 -1
- package/dist/jsx/SheetScrollView.mjs +80 -8
- package/dist/jsx/SheetScrollView.mjs.map +1 -1
- package/dist/jsx/SheetScrollView.native.js +94 -10
- package/dist/jsx/SheetScrollView.native.js.map +1 -1
- package/dist/jsx/gestureState.js +13 -0
- package/dist/jsx/gestureState.js.map +6 -0
- package/dist/jsx/gestureState.mjs +5 -0
- package/dist/jsx/gestureState.mjs.map +1 -0
- package/dist/jsx/gestureState.native.js +34 -0
- package/dist/jsx/gestureState.native.js.map +1 -0
- package/dist/jsx/setupGestureHandler.js +19 -0
- package/dist/jsx/setupGestureHandler.js.map +6 -0
- package/dist/jsx/setupGestureHandler.mjs +19 -0
- package/dist/jsx/setupGestureHandler.mjs.map +1 -0
- package/dist/jsx/setupGestureHandler.native.js +47 -0
- package/dist/jsx/setupGestureHandler.native.js.map +1 -0
- package/dist/jsx/useGestureHandlerPan.js +101 -0
- package/dist/jsx/useGestureHandlerPan.js.map +6 -0
- package/dist/jsx/useGestureHandlerPan.mjs +102 -0
- package/dist/jsx/useGestureHandlerPan.mjs.map +1 -0
- package/dist/jsx/useGestureHandlerPan.native.js +134 -0
- package/dist/jsx/useGestureHandlerPan.native.js.map +1 -0
- package/package.json +48 -21
- package/src/GestureDetectorWrapper.tsx +41 -0
- package/src/GestureSheetContext.tsx +62 -0
- package/src/SheetImplementationCustom.tsx +124 -57
- package/src/SheetScrollView.tsx +157 -8
- package/src/gestureState.ts +17 -0
- package/src/setupGestureHandler.ts +32 -0
- package/src/types.tsx +15 -0
- package/src/useGestureHandlerPan.tsx +299 -0
- package/types/GestureDetectorWrapper.d.ts +14 -0
- package/types/GestureDetectorWrapper.d.ts.map +1 -0
- package/types/GestureDetectorWrapper.native.d.ts +14 -0
- package/types/GestureDetectorWrapper.native.d.ts.map +1 -0
- package/types/GestureSheetContext.d.ts +36 -0
- package/types/GestureSheetContext.d.ts.map +1 -0
- package/types/SheetImplementationCustom.d.ts.map +1 -1
- package/types/SheetScrollView.d.ts.map +1 -1
- package/types/gestureState.d.ts +9 -0
- package/types/gestureState.d.ts.map +1 -0
- package/types/gestureState.native.d.ts +12 -0
- package/types/gestureState.native.d.ts.map +1 -0
- package/types/setupGestureHandler.d.ts +12 -0
- package/types/setupGestureHandler.d.ts.map +1 -0
- package/types/setupGestureHandler.native.d.ts +41 -0
- package/types/setupGestureHandler.native.d.ts.map +1 -0
- package/types/types.d.ts +8 -0
- package/types/types.d.ts.map +1 -1
- package/types/useGestureHandlerPan.d.ts +43 -0
- package/types/useGestureHandlerPan.d.ts.map +1 -0
- package/types/useGestureHandlerPan.native.d.ts +33 -0
- package/types/useGestureHandlerPan.native.d.ts.map +1 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { useCallback, useMemo, useRef, type RefObject } from 'react'
|
|
2
|
+
import { getGestureHandlerState, isGestureHandlerEnabled } from './gestureState'
|
|
3
|
+
import type { ScrollBridge } from './types'
|
|
4
|
+
|
|
5
|
+
// threshold in pixels for considering sheet "at top" position
|
|
6
|
+
// allows for small measurement variations
|
|
7
|
+
const AT_TOP_THRESHOLD = 5
|
|
8
|
+
|
|
9
|
+
interface GesturePanConfig {
|
|
10
|
+
positions: number[]
|
|
11
|
+
frameSize: number
|
|
12
|
+
setPosition: (pos: number) => void
|
|
13
|
+
animateTo: (pos: number) => void
|
|
14
|
+
stopSpring: () => void
|
|
15
|
+
scrollBridge: ScrollBridge
|
|
16
|
+
setIsDragging: (val: boolean) => void
|
|
17
|
+
getCurrentPosition: () => number
|
|
18
|
+
resisted: (val: number, minY: number) => number
|
|
19
|
+
disableDrag?: boolean
|
|
20
|
+
isShowingInnerSheet?: boolean
|
|
21
|
+
// set the animated position directly (for smooth dragging)
|
|
22
|
+
setAnimatedPosition: (val: number) => void
|
|
23
|
+
// ref to scroll gesture for simultaneousWithExternalGesture
|
|
24
|
+
scrollGestureRef?: RefObject<any> | null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface GesturePanResult {
|
|
28
|
+
panGesture: any | null
|
|
29
|
+
panGestureRef: RefObject<any>
|
|
30
|
+
gestureHandlerEnabled: boolean
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Hook that creates a Gesture.Pan() handler for use with react-native-gesture-handler.
|
|
35
|
+
* This provides native-quality gesture coordination between Sheet and ScrollView.
|
|
36
|
+
*
|
|
37
|
+
* Uses state-based decision pattern (like gorhom/bottom-sheet and react-native-actions-sheet):
|
|
38
|
+
* - Both pan and scroll gestures run simultaneously
|
|
39
|
+
* - In onChange, we decide whether to process pan or let scroll handle it
|
|
40
|
+
* - scrollBridge.setScrollEnabled toggles scroll on/off as needed
|
|
41
|
+
*
|
|
42
|
+
* Decision matrix:
|
|
43
|
+
* 1. Sheet not fully open + swiping up -> pan handles (disable scroll)
|
|
44
|
+
* 2. Sheet fully open + swiping up -> scroll handles (blockPan)
|
|
45
|
+
* 3. Sheet not fully open + swiping down -> pan handles (unless scrolled)
|
|
46
|
+
* 4. Sheet fully open + swiping down + scrollY=0 -> pan handles
|
|
47
|
+
* 5. Sheet fully open + swiping down + scrollY>0 -> scroll handles (blockPan)
|
|
48
|
+
*
|
|
49
|
+
* Returns null for the gesture if RNGH is not available or drag is disabled.
|
|
50
|
+
*/
|
|
51
|
+
export function useGestureHandlerPan(config: GesturePanConfig): GesturePanResult {
|
|
52
|
+
const {
|
|
53
|
+
positions,
|
|
54
|
+
frameSize,
|
|
55
|
+
setPosition,
|
|
56
|
+
animateTo,
|
|
57
|
+
stopSpring,
|
|
58
|
+
scrollBridge,
|
|
59
|
+
setIsDragging,
|
|
60
|
+
getCurrentPosition,
|
|
61
|
+
resisted,
|
|
62
|
+
disableDrag,
|
|
63
|
+
isShowingInnerSheet,
|
|
64
|
+
setAnimatedPosition,
|
|
65
|
+
scrollGestureRef,
|
|
66
|
+
} = config
|
|
67
|
+
|
|
68
|
+
const gestureHandlerEnabled = isGestureHandlerEnabled()
|
|
69
|
+
const panGestureRef = useRef<any>(null)
|
|
70
|
+
|
|
71
|
+
// use refs for values that need to persist across gesture lifecycle
|
|
72
|
+
// (useMemo closure variables get reset when gesture is recreated)
|
|
73
|
+
const gestureStateRef = useRef({
|
|
74
|
+
startY: 0,
|
|
75
|
+
// track last translation when pan was active (for position calculation after handoff)
|
|
76
|
+
lastPanTranslationY: 0,
|
|
77
|
+
// accumulated position offset from all pan movements
|
|
78
|
+
accumulatedOffset: 0,
|
|
79
|
+
// track previous translation for direction detection (like actions-sheet)
|
|
80
|
+
prevTranslationY: 0,
|
|
81
|
+
// track if scroll was engaged (scrollY > 0) at some point
|
|
82
|
+
scrollEngaged: false,
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
const onStart = useCallback(() => {
|
|
86
|
+
stopSpring()
|
|
87
|
+
setIsDragging(true)
|
|
88
|
+
}, [stopSpring, setIsDragging])
|
|
89
|
+
|
|
90
|
+
const onEnd = useCallback(
|
|
91
|
+
(closestPoint: number) => {
|
|
92
|
+
setIsDragging(false)
|
|
93
|
+
scrollBridge.setParentDragging(false)
|
|
94
|
+
// re-enable scroll when gesture ends
|
|
95
|
+
scrollBridge.setScrollEnabled?.(true)
|
|
96
|
+
setPosition(closestPoint)
|
|
97
|
+
animateTo(closestPoint)
|
|
98
|
+
},
|
|
99
|
+
[setIsDragging, scrollBridge, setPosition, animateTo]
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
const panGesture = useMemo(() => {
|
|
103
|
+
// don't create gesture if disabled or RNGH not available
|
|
104
|
+
if (!gestureHandlerEnabled || disableDrag || isShowingInnerSheet || !frameSize) {
|
|
105
|
+
return null
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const { Gesture } = getGestureHandlerState()
|
|
109
|
+
if (!Gesture) {
|
|
110
|
+
return null
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const minY = positions[0]
|
|
114
|
+
const gs = gestureStateRef.current // shorthand
|
|
115
|
+
|
|
116
|
+
// simultaneousHandlers pattern from react-native-actions-sheet
|
|
117
|
+
// both gestures run simultaneously, we use blockPan to decide who handles
|
|
118
|
+
// console.warn('[RNGH-Pan] CREATING gesture, minY:', minY, 'frameSize:', frameSize)
|
|
119
|
+
const gesture = Gesture.Pan()
|
|
120
|
+
.withRef(panGestureRef)
|
|
121
|
+
// NO manualActivation - let both gestures run via simultaneousHandlers
|
|
122
|
+
.failOffsetX([-20, 20])
|
|
123
|
+
.shouldCancelWhenOutside(false)
|
|
124
|
+
.onBegin(() => {
|
|
125
|
+
// check position at gesture begin - before direction is known
|
|
126
|
+
const pos = getCurrentPosition()
|
|
127
|
+
const atTop = pos <= minY + AT_TOP_THRESHOLD
|
|
128
|
+
const currentScrollY = scrollBridge.y
|
|
129
|
+
// console.warn('[RNGH-Pan] onBegin', { pos, minY, atTop, currentScrollY })
|
|
130
|
+
gs.startY = pos
|
|
131
|
+
gs.lastPanTranslationY = 0
|
|
132
|
+
gs.accumulatedOffset = 0
|
|
133
|
+
gs.prevTranslationY = 0
|
|
134
|
+
gs.scrollEngaged = currentScrollY > 0 // track if scroll is already engaged
|
|
135
|
+
|
|
136
|
+
// if sheet not at top, DISABLE SCROLL immediately and lock to 0
|
|
137
|
+
// this prevents scroll from firing before pan takes over
|
|
138
|
+
if (!atTop) {
|
|
139
|
+
scrollBridge.setScrollEnabled?.(false, 0)
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
.onStart(() => {
|
|
143
|
+
// console.warn('[RNGH-Pan] onStart', { startY: gs.startY, minY })
|
|
144
|
+
scrollBridge.initialPosition = gs.startY
|
|
145
|
+
onStart()
|
|
146
|
+
})
|
|
147
|
+
.onChange((event: { translationY: number; velocityY: number }) => {
|
|
148
|
+
const { translationY } = event
|
|
149
|
+
|
|
150
|
+
// determine direction by comparing translations (like react-native-actions-sheet)
|
|
151
|
+
// this is more reliable than velocity which can be noisy during direction changes
|
|
152
|
+
const isSwipingDown = gs.prevTranslationY < translationY
|
|
153
|
+
const deltaY = translationY - gs.prevTranslationY
|
|
154
|
+
gs.prevTranslationY = translationY
|
|
155
|
+
|
|
156
|
+
const scrollY = scrollBridge.y
|
|
157
|
+
// track if scroll has been engaged at some point (needed for handoff detection)
|
|
158
|
+
if (scrollY > 0) {
|
|
159
|
+
gs.scrollEngaged = true
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// calculate current sheet position based on accumulated offset
|
|
163
|
+
const currentPos = gs.startY + gs.accumulatedOffset
|
|
164
|
+
const isCurrentlyAtTop = currentPos <= minY + AT_TOP_THRESHOLD
|
|
165
|
+
const nodeIsScrolling = scrollY > 0
|
|
166
|
+
|
|
167
|
+
// console.warn('[RNGH-Pan] onChange', { translationY: translationY.toFixed(1), deltaY: deltaY.toFixed(1), currentPos: currentPos.toFixed(1), minY, isCurrentlyAtTop, isSwipingDown, scrollY, scrollEngaged: gs.scrollEngaged })
|
|
168
|
+
|
|
169
|
+
// decision matrix (from react-native-actions-sheet pattern)
|
|
170
|
+
// each frame, decide who handles the movement based on current state
|
|
171
|
+
//
|
|
172
|
+
// Key insight: we track accumulated offset separately from translation
|
|
173
|
+
// This allows seamless handoffs between pan and scroll
|
|
174
|
+
let panHandles = false
|
|
175
|
+
|
|
176
|
+
if (!isCurrentlyAtTop) {
|
|
177
|
+
// sheet not at top position
|
|
178
|
+
if (isSwipingDown) {
|
|
179
|
+
// swiping down while sheet not at top
|
|
180
|
+
// only scroll if scrollY > 0, otherwise pan handles
|
|
181
|
+
panHandles = !nodeIsScrolling
|
|
182
|
+
} else {
|
|
183
|
+
// swiping up while sheet not at top -> pan drags sheet up
|
|
184
|
+
panHandles = true
|
|
185
|
+
}
|
|
186
|
+
} else {
|
|
187
|
+
// sheet is at top position
|
|
188
|
+
if (isSwipingDown) {
|
|
189
|
+
// swiping down at top
|
|
190
|
+
if (nodeIsScrolling) {
|
|
191
|
+
// scroll > 0, let scroll handle (scroll back towards 0)
|
|
192
|
+
panHandles = false
|
|
193
|
+
} else if (gs.scrollEngaged) {
|
|
194
|
+
// scroll WAS > 0 but now is 0 -> handoff from scroll to pan
|
|
195
|
+
// pan takes over to drag sheet down
|
|
196
|
+
// console.warn('[RNGH-Pan] *** HANDOFF FROM SCROLL TO PAN ***')
|
|
197
|
+
panHandles = true
|
|
198
|
+
} else {
|
|
199
|
+
// scroll never engaged, just drag sheet down
|
|
200
|
+
panHandles = true
|
|
201
|
+
}
|
|
202
|
+
} else {
|
|
203
|
+
// swiping up at top -> scroll handles (scroll content)
|
|
204
|
+
panHandles = false
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// console.warn('[RNGH-Pan] decision', { panHandles, isCurrentlyAtTop, isSwipingDown, nodeIsScrolling, scrollEngaged: gs.scrollEngaged, currentPos: currentPos.toFixed(1), minY })
|
|
209
|
+
|
|
210
|
+
if (panHandles) {
|
|
211
|
+
// pan handles - disable scroll and move sheet
|
|
212
|
+
// when not at top: lock scroll to 0 (sheet is being dragged)
|
|
213
|
+
// when at top: lock at current position (handoff from scroll to pan)
|
|
214
|
+
const lockTo = isCurrentlyAtTop ? undefined : 0
|
|
215
|
+
scrollBridge.setScrollEnabled?.(false, lockTo)
|
|
216
|
+
|
|
217
|
+
// accumulate the delta for position calculation
|
|
218
|
+
gs.accumulatedOffset += deltaY
|
|
219
|
+
const newPosition = resisted(gs.startY + gs.accumulatedOffset, minY)
|
|
220
|
+
|
|
221
|
+
// update position
|
|
222
|
+
scrollBridge.paneY = newPosition
|
|
223
|
+
setAnimatedPosition(newPosition)
|
|
224
|
+
scrollBridge.setParentDragging(newPosition > minY)
|
|
225
|
+
} else {
|
|
226
|
+
// scroll handles - enable scroll so it can move freely
|
|
227
|
+
scrollBridge.setScrollEnabled?.(true)
|
|
228
|
+
// don't accumulate offset when scroll is handling
|
|
229
|
+
}
|
|
230
|
+
})
|
|
231
|
+
.onEnd((event: { velocityY: number }) => {
|
|
232
|
+
const { velocityY } = event
|
|
233
|
+
const currentPos = gs.startY + gs.accumulatedOffset
|
|
234
|
+
|
|
235
|
+
// console.warn('[RNGH-Pan] onEnd', { velocityY, currentPos, accumulatedOffset: gs.accumulatedOffset, scrollY: scrollBridge.y })
|
|
236
|
+
|
|
237
|
+
// clear scroll lock
|
|
238
|
+
scrollBridge.scrollLockY = undefined
|
|
239
|
+
|
|
240
|
+
// if sheet is at top and scroll is engaged, just stay at top
|
|
241
|
+
if (currentPos <= minY + AT_TOP_THRESHOLD && scrollBridge.y > 0) {
|
|
242
|
+
onEnd(0)
|
|
243
|
+
return
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// find closest snap point using current position and velocity
|
|
247
|
+
const velocity = velocityY / 1000
|
|
248
|
+
const projectedEnd = currentPos + frameSize * velocity * 0.2
|
|
249
|
+
|
|
250
|
+
let closestPoint = 0
|
|
251
|
+
let minDist = Number.POSITIVE_INFINITY
|
|
252
|
+
|
|
253
|
+
for (let i = 0; i < positions.length; i++) {
|
|
254
|
+
const pos = positions[i]
|
|
255
|
+
const dist = Math.abs(projectedEnd - pos)
|
|
256
|
+
if (dist < minDist) {
|
|
257
|
+
minDist = dist
|
|
258
|
+
closestPoint = i
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
onEnd(closestPoint)
|
|
263
|
+
})
|
|
264
|
+
.onFinalize(() => {
|
|
265
|
+
// console.warn('[RNGH-Pan] onFinalize')
|
|
266
|
+
// clear scroll lock on finalize too (safety)
|
|
267
|
+
scrollBridge.scrollLockY = undefined
|
|
268
|
+
})
|
|
269
|
+
.runOnJS(true)
|
|
270
|
+
|
|
271
|
+
// if we have a scroll gesture ref, make pan simultaneous with it
|
|
272
|
+
// this allows both gestures to run and we decide in onChange who handles it
|
|
273
|
+
if (scrollGestureRef?.current) {
|
|
274
|
+
// console.warn('[RNGH-Pan] adding simultaneousWithExternalGesture for scroll')
|
|
275
|
+
return gesture.simultaneousWithExternalGesture(scrollGestureRef.current)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return gesture
|
|
279
|
+
}, [
|
|
280
|
+
gestureHandlerEnabled,
|
|
281
|
+
disableDrag,
|
|
282
|
+
isShowingInnerSheet,
|
|
283
|
+
frameSize,
|
|
284
|
+
positions,
|
|
285
|
+
scrollBridge,
|
|
286
|
+
getCurrentPosition,
|
|
287
|
+
resisted,
|
|
288
|
+
onStart,
|
|
289
|
+
onEnd,
|
|
290
|
+
setIsDragging,
|
|
291
|
+
setAnimatedPosition,
|
|
292
|
+
])
|
|
293
|
+
|
|
294
|
+
return {
|
|
295
|
+
panGesture,
|
|
296
|
+
panGestureRef,
|
|
297
|
+
gestureHandlerEnabled,
|
|
298
|
+
}
|
|
299
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import { type ViewStyle } from 'react-native';
|
|
3
|
+
interface GestureDetectorWrapperProps {
|
|
4
|
+
gesture: any;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
style?: ViewStyle;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Conditionally wraps children with GestureDetector when RNGH is available.
|
|
10
|
+
* Uses a plain View wrapper that GestureDetector can attach gesture handlers to.
|
|
11
|
+
*/
|
|
12
|
+
export declare function GestureDetectorWrapper({ gesture, children, style, }: GestureDetectorWrapperProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=GestureDetectorWrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GestureDetectorWrapper.d.ts","sourceRoot":"","sources":["../src/GestureDetectorWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAGnD,UAAU,2BAA2B;IACnC,OAAO,EAAE,GAAG,CAAA;IACZ,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE,2BAA2B,2CAsB7B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface GestureDetectorWrapperProps {
|
|
3
|
+
gesture: any;
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Conditionally wraps children with GestureDetector when RNGH is available.
|
|
8
|
+
* Falls back to just rendering children when RNGH is not set up.
|
|
9
|
+
*
|
|
10
|
+
* @platform native
|
|
11
|
+
*/
|
|
12
|
+
export declare function GestureDetectorWrapper({ gesture, children, }: GestureDetectorWrapperProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=GestureDetectorWrapper.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GestureDetectorWrapper.native.d.ts","sourceRoot":"","sources":["../src/GestureDetectorWrapper.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,UAAU,2BAA2B;IACnC,OAAO,EAAE,GAAG,CAAA;IACZ,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,QAAQ,GACT,EAAE,2BAA2B,2CAQ7B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import { type RefObject } from 'react';
|
|
3
|
+
export interface GestureSheetContextValue {
|
|
4
|
+
/**
|
|
5
|
+
* The sheet's pan gesture object, used for simultaneousHandlers
|
|
6
|
+
* in ScrollView to coordinate gestures
|
|
7
|
+
*/
|
|
8
|
+
panGesture: any | null;
|
|
9
|
+
/**
|
|
10
|
+
* Ref to the pan gesture for simultaneousHandlers prop
|
|
11
|
+
*/
|
|
12
|
+
panGestureRef: RefObject<any> | null;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the sheet is currently being dragged by the user
|
|
15
|
+
*/
|
|
16
|
+
isDragging: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Set whether panning should be blocked (e.g., when scrolling)
|
|
19
|
+
*/
|
|
20
|
+
setBlockPan: (blocked: boolean) => void;
|
|
21
|
+
/**
|
|
22
|
+
* Whether pan gesture is currently blocked
|
|
23
|
+
*/
|
|
24
|
+
blockPan: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function useGestureSheetContext(): GestureSheetContextValue | null;
|
|
27
|
+
export interface GestureSheetProviderProps {
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
isDragging: boolean;
|
|
30
|
+
blockPan: boolean;
|
|
31
|
+
setBlockPan: (blocked: boolean) => void;
|
|
32
|
+
panGesture: any | null;
|
|
33
|
+
panGestureRef: RefObject<any> | null;
|
|
34
|
+
}
|
|
35
|
+
export declare function GestureSheetProvider({ children, isDragging, blockPan, setBlockPan, panGesture, panGestureRef, }: GestureSheetProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=GestureSheetContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GestureSheetContext.d.ts","sourceRoot":"","sources":["../src/GestureSheetContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjE,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,UAAU,EAAE,GAAG,GAAG,IAAI,CAAA;IACtB;;OAEG;IACH,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACpC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;CAClB;AAID,wBAAgB,sBAAsB,IAAI,wBAAwB,GAAG,IAAI,CAExE;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,UAAU,EAAE,GAAG,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;CACrC;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,WAAW,EACX,UAAU,EACV,aAAa,GACd,EAAE,yBAAyB,2CAY3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SheetImplementationCustom.d.ts","sourceRoot":"","sources":["../src/SheetImplementationCustom.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAOvC,OAAO,EAAsC,IAAI,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"SheetImplementationCustom.d.ts","sourceRoot":"","sources":["../src/SheetImplementationCustom.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAOvC,OAAO,EAAsC,IAAI,EAAE,MAAM,cAAc,CAAA;AAMvE,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,SAAS,CAAA;AAYzD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA+nBrC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SheetScrollView.d.ts","sourceRoot":"","sources":["../src/SheetScrollView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"SheetScrollView.d.ts","sourceRoot":"","sources":["../src/SheetScrollView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AAc9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAoZ3B,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export gesture state from @tamagui/native.
|
|
3
|
+
* Sheet uses this for backward compatibility with existing code.
|
|
4
|
+
*/
|
|
5
|
+
export { isGestureHandlerEnabled, getGestureHandlerState, } from '@tamagui/native';
|
|
6
|
+
export type { GestureState as GestureHandlerState } from '@tamagui/native';
|
|
7
|
+
export { setGestureHandlerState } from '@tamagui/native';
|
|
8
|
+
export { setGestureHandlerState as setGestureState } from '@tamagui/native';
|
|
9
|
+
//# sourceMappingURL=gestureState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gestureState.d.ts","sourceRoot":"","sources":["../src/gestureState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAG1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAGxD,OAAO,EAAE,sBAAsB,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PanGesture } from 'react-native-gesture-handler';
|
|
2
|
+
export type GestureHandlerState = {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
GestureDetector: any | null;
|
|
5
|
+
Gesture: any | null;
|
|
6
|
+
};
|
|
7
|
+
export declare function setGestureHandlerState(newState: GestureHandlerState): void;
|
|
8
|
+
export declare function getGestureHandlerState(): GestureHandlerState;
|
|
9
|
+
export declare function isGestureHandlerEnabled(): boolean;
|
|
10
|
+
export declare function createPanGesture(): PanGesture | null;
|
|
11
|
+
export declare function getGestureDetector(): any | null;
|
|
12
|
+
//# sourceMappingURL=gestureState.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gestureState.native.d.ts","sourceRoot":"","sources":["../src/gestureState.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,EAAE,GAAG,GAAG,IAAI,CAAA;IAC3B,OAAO,EAAE,GAAG,GAAG,IAAI,CAAA;CACpB,CAAA;AAQD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAE1E;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,CAE5D;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAGD,wBAAgB,gBAAgB,IAAI,UAAU,GAAG,IAAI,CAGpD;AAGD,wBAAgB,kBAAkB,IAAI,GAAG,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy setup - prefer `import '@tamagui/native/setup-gesture-handler'` instead.
|
|
3
|
+
*/
|
|
4
|
+
import { isGestureHandlerEnabled } from '@tamagui/native';
|
|
5
|
+
export { isGestureHandlerEnabled };
|
|
6
|
+
export interface SetupGestureHandlerConfig {
|
|
7
|
+
Gesture: any;
|
|
8
|
+
GestureDetector: any;
|
|
9
|
+
ScrollView?: any;
|
|
10
|
+
}
|
|
11
|
+
export declare function setupGestureHandler(config: SetupGestureHandlerConfig): void;
|
|
12
|
+
//# sourceMappingURL=setupGestureHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupGestureHandler.d.ts","sourceRoot":"","sources":["../src/setupGestureHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAA0B,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEjF,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAElC,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,GAAG,CAAA;IACZ,eAAe,EAAE,GAAG,CAAA;IACpB,UAAU,CAAC,EAAE,GAAG,CAAA;CACjB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAiB3E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface GestureHandlerConfig {
|
|
2
|
+
/**
|
|
3
|
+
* The Gesture object from react-native-gesture-handler
|
|
4
|
+
* Used to create Pan, Native, and other gesture types
|
|
5
|
+
*/
|
|
6
|
+
Gesture: any;
|
|
7
|
+
/**
|
|
8
|
+
* The GestureDetector component from react-native-gesture-handler
|
|
9
|
+
* Used to wrap components that should respond to gestures
|
|
10
|
+
*/
|
|
11
|
+
GestureDetector: any;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Sets up native gesture handler support for Sheet.
|
|
15
|
+
* Call this function early in your app (e.g., in index.js) to enable smooth
|
|
16
|
+
* gesture coordination between Sheet and ScrollView on iOS.
|
|
17
|
+
*
|
|
18
|
+
* When enabled, Sheet uses react-native-gesture-handler's simultaneousHandlers
|
|
19
|
+
* for native-quality gesture coordination. Without this setup, Sheet falls back
|
|
20
|
+
* to React Native's PanResponder which has minor limitations on iOS.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* import { setupGestureHandler } from '@tamagui/sheet/setup-gesture-handler'
|
|
25
|
+
* import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler'
|
|
26
|
+
*
|
|
27
|
+
* // Call once at app startup
|
|
28
|
+
* setupGestureHandler({ Gesture, GestureDetector })
|
|
29
|
+
*
|
|
30
|
+
* // Wrap your app with GestureHandlerRootView
|
|
31
|
+
* export default function App() {
|
|
32
|
+
* return (
|
|
33
|
+
* <GestureHandlerRootView style={{ flex: 1 }}>
|
|
34
|
+
* <YourApp />
|
|
35
|
+
* </GestureHandlerRootView>
|
|
36
|
+
* )
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function setupGestureHandler(config: GestureHandlerConfig): void;
|
|
41
|
+
//# sourceMappingURL=setupGestureHandler.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupGestureHandler.native.d.ts","sourceRoot":"","sources":["../src/setupGestureHandler.native.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,OAAO,EAAE,GAAG,CAAA;IACZ;;;OAGG;IACH,eAAe,EAAE,GAAG,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAwBtE"}
|
package/types/types.d.ts
CHANGED
|
@@ -89,6 +89,14 @@ export type ScrollBridge = {
|
|
|
89
89
|
onParentDragging: (props: (val: boolean) => void) => () => void;
|
|
90
90
|
setParentDragging: (val: boolean) => void;
|
|
91
91
|
onFinishAnimate?: () => void;
|
|
92
|
+
blockPan?: boolean;
|
|
93
|
+
initialPosition?: number;
|
|
94
|
+
isScrollablePositionLocked?: boolean;
|
|
95
|
+
setScrollEnabled?: (enabled: boolean, lockTo?: number) => void;
|
|
96
|
+
_lastTouchY?: number;
|
|
97
|
+
scrollLockY?: number;
|
|
98
|
+
forceScrollTo?: (y: number) => void;
|
|
99
|
+
isAtTop?: boolean;
|
|
92
100
|
};
|
|
93
101
|
export {};
|
|
94
102
|
//# sourceMappingURL=types.d.ts.map
|
package/types/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
import type { ScrollBridge } from './types';
|
|
3
|
+
interface GesturePanConfig {
|
|
4
|
+
positions: number[];
|
|
5
|
+
frameSize: number;
|
|
6
|
+
setPosition: (pos: number) => void;
|
|
7
|
+
animateTo: (pos: number) => void;
|
|
8
|
+
stopSpring: () => void;
|
|
9
|
+
scrollBridge: ScrollBridge;
|
|
10
|
+
setIsDragging: (val: boolean) => void;
|
|
11
|
+
getCurrentPosition: () => number;
|
|
12
|
+
resisted: (val: number, minY: number) => number;
|
|
13
|
+
disableDrag?: boolean;
|
|
14
|
+
isShowingInnerSheet?: boolean;
|
|
15
|
+
setAnimatedPosition: (val: number) => void;
|
|
16
|
+
scrollGestureRef?: RefObject<any> | null;
|
|
17
|
+
}
|
|
18
|
+
interface GesturePanResult {
|
|
19
|
+
panGesture: any | null;
|
|
20
|
+
panGestureRef: RefObject<any>;
|
|
21
|
+
gestureHandlerEnabled: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Hook that creates a Gesture.Pan() handler for use with react-native-gesture-handler.
|
|
25
|
+
* This provides native-quality gesture coordination between Sheet and ScrollView.
|
|
26
|
+
*
|
|
27
|
+
* Uses state-based decision pattern (like gorhom/bottom-sheet and react-native-actions-sheet):
|
|
28
|
+
* - Both pan and scroll gestures run simultaneously
|
|
29
|
+
* - In onChange, we decide whether to process pan or let scroll handle it
|
|
30
|
+
* - scrollBridge.setScrollEnabled toggles scroll on/off as needed
|
|
31
|
+
*
|
|
32
|
+
* Decision matrix:
|
|
33
|
+
* 1. Sheet not fully open + swiping up -> pan handles (disable scroll)
|
|
34
|
+
* 2. Sheet fully open + swiping up -> scroll handles (blockPan)
|
|
35
|
+
* 3. Sheet not fully open + swiping down -> pan handles (unless scrolled)
|
|
36
|
+
* 4. Sheet fully open + swiping down + scrollY=0 -> pan handles
|
|
37
|
+
* 5. Sheet fully open + swiping down + scrollY>0 -> scroll handles (blockPan)
|
|
38
|
+
*
|
|
39
|
+
* Returns null for the gesture if RNGH is not available or drag is disabled.
|
|
40
|
+
*/
|
|
41
|
+
export declare function useGestureHandlerPan(config: GesturePanConfig): GesturePanResult;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=useGestureHandlerPan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGestureHandlerPan.d.ts","sourceRoot":"","sources":["../src/useGestureHandlerPan.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAM3C,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,kBAAkB,EAAE,MAAM,MAAM,CAAA;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAE1C,gBAAgB,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;CACzC;AAED,UAAU,gBAAgB;IACxB,UAAU,EAAE,GAAG,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;IAC7B,qBAAqB,EAAE,OAAO,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAwP/E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PanGesture } from 'react-native-gesture-handler';
|
|
2
|
+
import type { ScrollBridge } from './types';
|
|
3
|
+
interface GesturePanConfig {
|
|
4
|
+
positions: number[];
|
|
5
|
+
frameSize: number;
|
|
6
|
+
setPosition: (pos: number) => void;
|
|
7
|
+
animateTo: (pos: number) => void;
|
|
8
|
+
stopSpring: () => void;
|
|
9
|
+
scrollBridge: ScrollBridge;
|
|
10
|
+
setIsDragging: (val: boolean) => void;
|
|
11
|
+
getCurrentPosition: () => number;
|
|
12
|
+
resisted: (val: number, minY: number) => number;
|
|
13
|
+
hasScrollView: boolean;
|
|
14
|
+
disableDrag?: boolean;
|
|
15
|
+
isShowingInnerSheet?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface GesturePanResult {
|
|
18
|
+
panGesture: PanGesture | null;
|
|
19
|
+
panGestureRef: React.RefObject<PanGesture | null>;
|
|
20
|
+
gestureHandlerEnabled: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Hook that creates a Gesture.Pan() handler for use with react-native-gesture-handler.
|
|
24
|
+
* This provides native-quality gesture coordination between Sheet and ScrollView.
|
|
25
|
+
*
|
|
26
|
+
* Based on patterns from react-native-actions-sheet and gorhom/bottom-sheet.
|
|
27
|
+
*
|
|
28
|
+
* @platform native - This hook only returns a gesture on native platforms.
|
|
29
|
+
* On web, it returns null for the gesture.
|
|
30
|
+
*/
|
|
31
|
+
export declare function useGestureHandlerPan(config: GesturePanConfig): GesturePanResult;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=useGestureHandlerPan.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGestureHandlerPan.native.d.ts","sourceRoot":"","sources":["../src/useGestureHandlerPan.native.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,kBAAkB,EAAE,MAAM,MAAM,CAAA;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,UAAU,gBAAgB;IACxB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;IAC7B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IACjD,qBAAqB,EAAE,OAAO,CAAA;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CA0K/E"}
|