@tamagui/sheet 1.0.1-beta.113 → 1.0.1-beta.114

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/src/Sheet.tsx CHANGED
@@ -9,7 +9,9 @@ import {
9
9
  mergeEvent,
10
10
  styled,
11
11
  themeable,
12
+ useConstant,
12
13
  useEvent,
14
+ useIsomorphicLayoutEffect,
13
15
  useThemeName,
14
16
  withStaticProperties,
15
17
  } from '@tamagui/core'
@@ -26,7 +28,6 @@ import React, {
26
28
  useCallback,
27
29
  useContext,
28
30
  useEffect,
29
- useLayoutEffect,
30
31
  useMemo,
31
32
  useRef,
32
33
  useState,
@@ -36,6 +37,8 @@ import {
36
37
  GestureResponderEvent,
37
38
  PanResponder,
38
39
  PanResponderGestureState,
40
+ ScrollView,
41
+ ScrollViewProps,
39
42
  View,
40
43
  } from 'react-native'
41
44
 
@@ -72,6 +75,14 @@ type PositionChangeHandler = (position: number) => void
72
75
 
73
76
  type OpenChangeHandler = ((open: boolean) => void) | React.Dispatch<React.SetStateAction<boolean>>
74
77
 
78
+ type ScrollBridge = {
79
+ enabled: boolean
80
+ y: number
81
+ scrollStartY: number
82
+ drag: (dy: number) => void
83
+ release: (state: { dy: number; vy: number }) => void
84
+ }
85
+
75
86
  type SheetContextValue = Required<
76
87
  Pick<SheetProps, 'open' | 'position' | 'snapPoints' | 'dismissOnOverlayPress'>
77
88
  > & {
@@ -81,6 +92,7 @@ type SheetContextValue = Required<
81
92
  allowPinchZoom: RemoveScrollProps['allowPinchZoom']
82
93
  contentRef: React.RefObject<TamaguiElement>
83
94
  dismissOnSnapToBottom: boolean
95
+ scrollBridge: ScrollBridge
84
96
  }
85
97
 
86
98
  const [createSheetContext, createSheetScope] = createContextScope(SHEET_NAME)
@@ -89,6 +101,10 @@ const [SheetProvider, useSheetContext] = createSheetContext<SheetContextValue>(
89
101
  {} as any
90
102
  )
91
103
 
104
+ /* -------------------------------------------------------------------------------------------------
105
+ * SheetHandle
106
+ * -----------------------------------------------------------------------------------------------*/
107
+
92
108
  export const SheetHandleFrame = styled(XStack, {
93
109
  name: SHEET_HANDLE_NAME,
94
110
  height: 10,
@@ -132,6 +148,10 @@ export const SheetHandle = SheetHandleFrame.extractable(
132
148
  }
133
149
  )
134
150
 
151
+ /* -------------------------------------------------------------------------------------------------
152
+ * SheetOverlay
153
+ * -----------------------------------------------------------------------------------------------*/
154
+
135
155
  const SHEET_OVERLAY_NAME = 'SheetOverlay'
136
156
 
137
157
  export const SheetOverlayFrame = styled(YStack, {
@@ -187,6 +207,91 @@ export const SheetOverlay = SheetOverlayFrame.extractable(
187
207
  }
188
208
  )
189
209
 
210
+ /* -------------------------------------------------------------------------------------------------
211
+ * SheetScrollView
212
+ * -----------------------------------------------------------------------------------------------*/
213
+
214
+ const SHEET_SCROLL_VIEW_NAME = 'SheetScrollView'
215
+
216
+ export const SheetScrollView = forwardRef<ScrollView, ScrollViewProps>(
217
+ ({ __scopeSheet, ...props }: SheetScopedProps<ScrollViewProps>, ref) => {
218
+ const { scrollBridge } = useSheetContext(SHEET_SCROLL_VIEW_NAME, __scopeSheet)
219
+ const [scrollEnabled, setScrollEnabled] = useState(true)
220
+ const state = useRef({
221
+ dy: 0,
222
+ // store a few recent dys to get velocity on release
223
+ dys: [] as number[],
224
+ })
225
+
226
+ const release = () => {
227
+ setScrollEnabled(true)
228
+ const recentDys = state.current.dys.slice(-10)
229
+ const dist = recentDys.length
230
+ ? recentDys.reduce((a, b, i) => a + b - (recentDys[i - 1] ?? recentDys[0]), 0)
231
+ : 0
232
+ const avgDy = dist / recentDys.length
233
+ const vy = avgDy * 0.1
234
+ state.current.dys = []
235
+ scrollBridge.release({
236
+ dy: state.current.dy,
237
+ vy,
238
+ })
239
+ }
240
+
241
+ return (
242
+ <ScrollView
243
+ ref={ref}
244
+ onScrollBeginDrag={() => {
245
+ console.log('begin drag')
246
+ }}
247
+ scrollEventThrottle={16}
248
+ scrollEnabled={scrollEnabled}
249
+ onScroll={(e) => {
250
+ const { y } = e.nativeEvent.contentOffset
251
+ scrollBridge.y = y
252
+ if (y > 0) {
253
+ scrollBridge.scrollStartY = -1
254
+ }
255
+ }}
256
+ onResponderMove={(e) => {
257
+ const { pageY } = e.nativeEvent
258
+ if (scrollBridge.y === 0) {
259
+ if (scrollBridge.scrollStartY === -1) {
260
+ scrollBridge.scrollStartY = pageY
261
+ }
262
+ const dy = pageY - scrollBridge.scrollStartY
263
+ if (dy <= 0) {
264
+ setScrollEnabled(true)
265
+ return
266
+ }
267
+ setScrollEnabled(false)
268
+ scrollBridge.drag(dy)
269
+ state.current.dy = dy
270
+ state.current.dys.push(dy)
271
+ // only do every so often, cut down to 10 again
272
+ if (state.current.dys.length > 100) {
273
+ state.current.dys = state.current.dys.slice(-10)
274
+ }
275
+ }
276
+ }}
277
+ onResponderRelease={release}
278
+ // todo release we can just grab the last dY and estimate vY using a sample of last dYs
279
+ {...props}
280
+ style={[
281
+ {
282
+ flex: 1,
283
+ },
284
+ props.style,
285
+ ]}
286
+ />
287
+ )
288
+ }
289
+ )
290
+
291
+ /* -------------------------------------------------------------------------------------------------
292
+ * Sheet
293
+ * -----------------------------------------------------------------------------------------------*/
294
+
190
295
  const selectionStyleSheet = isClient ? document.createElement('style') : null
191
296
  if (selectionStyleSheet) {
192
297
  document.head.appendChild(selectionStyleSheet)
@@ -236,12 +341,27 @@ export const Sheet = withStaticProperties(
236
341
  allowPinchZoom,
237
342
  } = props
238
343
 
344
+ if (process.env.NODE_ENV === 'development') {
345
+ if (snapPointsProp.some((p) => p < 0 || p > 100)) {
346
+ console.warn(
347
+ `⚠️ Invalid snapPoint given, snapPoints must be between 0 and 100, equal to percent height of frame`
348
+ )
349
+ }
350
+ }
351
+
239
352
  // allows for sheets to be controlled by other components
240
353
  const controller = useContext(SheetControllerContext)
241
354
  const isHidden = controller?.hidden || false
242
355
  const disableDrag = disableDragProp ?? controller?.disableDrag
243
356
  const themeName = useThemeName()
244
357
  const contentRef = React.useRef<TamaguiElement>(null)
358
+ const scrollBridge = useConstant<ScrollBridge>(() => ({
359
+ enabled: false,
360
+ y: 0,
361
+ scrollStartY: -1,
362
+ drag: () => {},
363
+ release: () => {},
364
+ }))
245
365
 
246
366
  const onChangeOpenInternal = (val: boolean) => {
247
367
  controller?.onChangeOpen?.(val)
@@ -293,7 +413,7 @@ export const Sheet = withStaticProperties(
293
413
  }
294
414
 
295
415
  const [isResizing, setIsResizing] = useState(true)
296
- useLayoutEffect(() => {
416
+ useIsomorphicLayoutEffect(() => {
297
417
  if (!isResizing) {
298
418
  setIsResizing(true)
299
419
  }
@@ -355,7 +475,7 @@ export const Sheet = withStaticProperties(
355
475
  })
356
476
  })
357
477
 
358
- useLayoutEffect(() => {
478
+ useIsomorphicLayoutEffect(() => {
359
479
  animateTo(position)
360
480
  }, [isHidden, frameSize, position, animateTo])
361
481
 
@@ -370,64 +490,108 @@ export const Sheet = withStaticProperties(
370
490
  }
371
491
  }, [])
372
492
 
373
- const panResponder = useMemo(() => {
374
- if (disableDrag) return
375
- if (!frameSize) return
376
-
377
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
378
- const pos = positionValue.current!
379
- const minY = positions[0]
380
- let startY = at.current
381
-
382
- function makeUnselectable(val: boolean) {
383
- if (!selectionStyleSheet) return
384
- if (!val) {
385
- selectionStyleSheet.innerText = ``
386
- } else {
387
- selectionStyleSheet.innerText = `:root * { user-select: none !important; -webkit-user-select: none !important; }`
493
+ const panResponder = useMemo(
494
+ () => {
495
+ if (disableDrag) return
496
+ if (!frameSize) return
497
+
498
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
499
+ const pos = positionValue.current!
500
+ const minY = positions[0]
501
+ let startY = at.current
502
+
503
+ function makeUnselectable(val: boolean) {
504
+ if (!selectionStyleSheet) return
505
+ if (!val) {
506
+ selectionStyleSheet.innerText = ``
507
+ } else {
508
+ selectionStyleSheet.innerText = `:root * { user-select: none !important; -webkit-user-select: none !important; }`
509
+ }
388
510
  }
389
- }
390
511
 
391
- const finish = (_e: GestureResponderEvent, { vy, dy }: PanResponderGestureState) => {
392
- makeUnselectable(false)
393
- const at = dy + startY
394
- // seems liky vy goes up to about 4 at the very most (+ is down, - is up)
395
- // lets base our multiplier on the total layout height
396
- const end = at + frameSize * vy * 0.33
397
- let closestPoint = 0
398
- let dist = Infinity
399
- for (let i = 0; i < positions.length; i++) {
400
- const position = positions[i]
401
- const curDist = end > position ? end - position : position - end
402
- if (curDist < dist) {
403
- dist = curDist
404
- closestPoint = i
512
+ const release = ({ vy, dy }: { dy: number; vy: number }) => {
513
+ isExternalDrag = false
514
+ previouslyScrolling = false
515
+ makeUnselectable(false)
516
+ const at = dy + startY
517
+ // seems liky vy goes up to about 4 at the very most (+ is down, - is up)
518
+ // lets base our multiplier on the total layout height
519
+ const end = at + frameSize * vy * 0.33
520
+ let closestPoint = 0
521
+ let dist = Infinity
522
+ for (let i = 0; i < positions.length; i++) {
523
+ const position = positions[i]
524
+ const curDist = end > position ? end - position : position - end
525
+ if (curDist < dist) {
526
+ dist = curDist
527
+ closestPoint = i
528
+ }
405
529
  }
530
+ // have to call both because state may not change but need to snap back
531
+ setPosition(closestPoint)
532
+ animateTo(closestPoint)
406
533
  }
407
- // have to call both because state may not change but need to snap back
408
- setPosition(closestPoint)
409
- animateTo(closestPoint)
410
- }
411
534
 
412
- return PanResponder.create({
413
- onMoveShouldSetPanResponder: (_e, { dy }) => {
535
+ const finish = (_e: GestureResponderEvent, state: PanResponderGestureState) => {
536
+ release(state)
537
+ }
538
+
539
+ let previouslyScrolling = false
540
+
541
+ const onMoveShouldSet = (_e: GestureResponderEvent, { dy }: PanResponderGestureState) => {
542
+ if (scrollBridge.y !== 0) {
543
+ previouslyScrolling = true
544
+ return false
545
+ }
546
+ if (scrollBridge.y === 0 && dy < 0) {
547
+ return false
548
+ }
549
+ if (previouslyScrolling) {
550
+ previouslyScrolling = false
551
+ return true
552
+ }
414
553
  // we could do some detection of other touchables and cancel here..
415
- return Math.abs(dy) > 6
416
- },
417
- onPanResponderGrant: () => {
554
+ return Math.abs(dy) > 8
555
+ }
556
+
557
+ const grant = () => {
418
558
  makeUnselectable(true)
419
559
  stopSpring()
420
560
  startY = at.current
421
- },
422
- onPanResponderMove: (_e, { dy }) => {
561
+ }
562
+
563
+ let isExternalDrag = false
564
+
565
+ scrollBridge.drag = (dy) => {
566
+ if (!isExternalDrag) {
567
+ isExternalDrag = true
568
+ grant()
569
+ }
423
570
  const to = dy + startY
424
571
  pos.setValue(resisted(to, minY))
425
- },
426
- onPanResponderEnd: finish,
427
- onPanResponderTerminate: finish,
428
- onPanResponderRelease: finish,
429
- })
430
- }, [disableDrag, animateTo, frameSize, positions, setPosition])
572
+ }
573
+
574
+ scrollBridge.release = release
575
+
576
+ return PanResponder.create({
577
+ onMoveShouldSetPanResponder: (...args) => {
578
+ const res = onMoveShouldSet(...args)
579
+ // console.log('res', res, scrollBridge.y)
580
+ return res
581
+ },
582
+ onPanResponderGrant: grant,
583
+ onPanResponderMove: (_e, { dy }) => {
584
+ const to = dy + startY
585
+ pos.setValue(resisted(to, minY))
586
+ },
587
+ onPanResponderEnd: finish,
588
+ onPanResponderTerminate: finish,
589
+ onPanResponderRelease: finish,
590
+ })
591
+ },
592
+ // eslint-disable-next-line react-hooks/exhaustive-deps
593
+ [disableDrag, animateTo, frameSize, positions, setPosition]
594
+ )
431
595
 
432
596
  let handleComponent: React.ReactElement | null = null
433
597
  let overlayComponent: React.ReactElement | null = null
@@ -472,6 +636,7 @@ export const Sheet = withStaticProperties(
472
636
  snapPoints={snapPoints}
473
637
  setPosition={setPosition}
474
638
  setOpen={setOpen}
639
+ scrollBridge={scrollBridge}
475
640
  >
476
641
  {isResizing ? null : overlayComponent}
477
642
  {/* no fancy hidden animation etc for handle for now */}
@@ -516,9 +681,12 @@ export const Sheet = withStaticProperties(
516
681
  Handle: SheetHandle,
517
682
  Frame: SheetFrame,
518
683
  Overlay: SheetOverlay,
684
+ ScrollView: SheetScrollView,
519
685
  }
520
686
  )
521
687
 
688
+ /* -------------------------------------------------------------------------------------------------*/
689
+
522
690
  function getPercentSize(point?: number, frameSize?: number) {
523
691
  if (!frameSize) return 0
524
692
  if (point === undefined) {
package/types/Sheet.d.ts CHANGED
@@ -3,7 +3,7 @@ import { ScopedProps } from '@tamagui/create-context';
3
3
  import { RemoveScroll } from '@tamagui/remove-scroll';
4
4
  import { XStackProps } from '@tamagui/stacks';
5
5
  import React, { ReactNode } from 'react';
6
- import { Animated, View } from 'react-native';
6
+ import { Animated, ScrollView, ScrollViewProps, View } from 'react-native';
7
7
  declare type RemoveScrollProps = React.ComponentProps<typeof RemoveScroll>;
8
8
  export declare type SheetProps = ScopedProps<{
9
9
  open?: boolean;
@@ -79,6 +79,7 @@ export declare const SheetOverlayFrame: import("@tamagui/core").TamaguiComponent
79
79
  }>;
80
80
  export declare type SheetOverlayProps = GetProps<typeof SheetOverlayFrame>;
81
81
  export declare const SheetOverlay: ({ __scopeSheet, ...props }: SheetScopedProps<SheetOverlayProps>) => JSX.Element;
82
+ export declare const SheetScrollView: React.ForwardRefExoticComponent<ScrollViewProps & React.RefAttributes<ScrollView>>;
82
83
  export declare const SheetFrameFrame: import("@tamagui/core").TamaguiComponent<(Omit<import("react-native").ViewProps, "children" | "display"> & import("@tamagui/core").RNWViewProps & import("@tamagui/core").TamaguiComponentPropsBase & import("@tamagui/core").WithThemeValues<import("@tamagui/core").StackStylePropsBase> & import("@tamagui/core").WithShorthands<import("@tamagui/core").WithThemeValues<import("@tamagui/core").StackStylePropsBase>> & Omit<{}, "elevation" | "fullscreen"> & {
83
84
  readonly fullscreen?: boolean | undefined;
84
85
  readonly elevation?: import("@tamagui/core").SizeTokens | undefined;
@@ -156,6 +157,7 @@ export declare const Sheet: ((props: Omit<{
156
157
  __scopeSheet?: import("@tamagui/create-context").Scope<any>;
157
158
  } & React.RefAttributes<unknown>>;
158
159
  Overlay: ({ __scopeSheet, ...props }: SheetScopedProps<SheetOverlayProps>) => JSX.Element;
160
+ ScrollView: React.ForwardRefExoticComponent<ScrollViewProps & React.RefAttributes<ScrollView>>;
159
161
  };
160
162
  declare type SheetControllerContextValue = {
161
163
  disableDrag?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Sheet.d.ts","sourceRoot":"","sources":["../src/Sheet.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sheet.d.ts","sourceRoot":"","sources":["../src/Sheet.tsx"],"names":[],"mappings":"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"}