@tamagui/sheet 3.0.0-beta.924.1 → 3.0.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.
Files changed (190) hide show
  1. package/dist/cjs/Sheet.cjs +48 -16
  2. package/dist/cjs/Sheet.native.cjs +46 -17
  3. package/dist/cjs/Sheet.native.js +46 -17
  4. package/dist/cjs/Sheet.native.js.map +1 -1
  5. package/dist/cjs/SheetDragSurface.cjs +50 -0
  6. package/dist/{jsx/GestureDetectorWrapper.native.js → cjs/SheetDragSurface.native.cjs} +24 -12
  7. package/dist/cjs/{GestureDetectorWrapper.native.js → SheetDragSurface.native.js} +25 -11
  8. package/dist/cjs/SheetDragSurface.native.js.map +1 -0
  9. package/dist/cjs/SheetImplementationCustom.cjs +41 -58
  10. package/dist/cjs/SheetImplementationCustom.native.cjs +43 -59
  11. package/dist/cjs/SheetImplementationCustom.native.js +43 -59
  12. package/dist/cjs/SheetImplementationCustom.native.js.map +1 -1
  13. package/dist/cjs/SheetScrollView.cjs +15 -3
  14. package/dist/cjs/SheetScrollView.native.cjs +17 -4
  15. package/dist/cjs/SheetScrollView.native.js +17 -4
  16. package/dist/cjs/SheetScrollView.native.js.map +1 -1
  17. package/dist/cjs/nativeSheet.cjs +3 -59
  18. package/dist/cjs/nativeSheet.native.cjs +70 -58
  19. package/dist/cjs/nativeSheet.native.js +70 -58
  20. package/dist/cjs/nativeSheet.native.js.map +1 -1
  21. package/dist/cjs/stableViewportHeight.cjs +27 -0
  22. package/dist/cjs/stableViewportHeight.native.cjs +29 -0
  23. package/dist/cjs/stableViewportHeight.native.js +31 -0
  24. package/dist/cjs/stableViewportHeight.native.js.map +1 -0
  25. package/dist/cjs/useSheetOffscreenSize.cjs +3 -1
  26. package/dist/cjs/useSheetOffscreenSize.native.cjs +3 -2
  27. package/dist/cjs/useSheetOffscreenSize.native.js +3 -2
  28. package/dist/cjs/useSheetOffscreenSize.native.js.map +1 -1
  29. package/dist/cjs/useSheetOpenState.cjs +13 -6
  30. package/dist/cjs/useSheetOpenState.native.cjs +15 -5
  31. package/dist/cjs/useSheetOpenState.native.js +15 -5
  32. package/dist/cjs/useSheetOpenState.native.js.map +1 -1
  33. package/dist/cjs/useSheetProviderProps.cjs +5 -94
  34. package/dist/cjs/useSheetProviderProps.native.cjs +5 -103
  35. package/dist/cjs/useSheetProviderProps.native.js +5 -103
  36. package/dist/cjs/useSheetProviderProps.native.js.map +1 -1
  37. package/dist/cjs/useSheetState.cjs +120 -0
  38. package/dist/cjs/useSheetState.native.cjs +131 -0
  39. package/dist/cjs/useSheetState.native.js +133 -0
  40. package/dist/cjs/useSheetState.native.js.map +1 -0
  41. package/dist/esm/Sheet.mjs +48 -15
  42. package/dist/esm/Sheet.mjs.map +1 -1
  43. package/dist/esm/Sheet.native.js +46 -17
  44. package/dist/esm/Sheet.native.js.map +1 -1
  45. package/dist/esm/SheetDragSurface.mjs +25 -0
  46. package/dist/esm/SheetDragSurface.mjs.map +1 -0
  47. package/dist/esm/SheetDragSurface.native.js +34 -0
  48. package/dist/esm/SheetDragSurface.native.js.map +1 -0
  49. package/dist/esm/SheetImplementationCustom.mjs +39 -56
  50. package/dist/esm/SheetImplementationCustom.mjs.map +1 -1
  51. package/dist/esm/SheetImplementationCustom.native.js +41 -57
  52. package/dist/esm/SheetImplementationCustom.native.js.map +1 -1
  53. package/dist/esm/SheetScrollView.mjs +16 -4
  54. package/dist/esm/SheetScrollView.mjs.map +1 -1
  55. package/dist/esm/SheetScrollView.native.js +18 -5
  56. package/dist/esm/SheetScrollView.native.js.map +1 -1
  57. package/dist/esm/nativeSheet.mjs +3 -60
  58. package/dist/esm/nativeSheet.mjs.map +1 -1
  59. package/dist/esm/nativeSheet.native.js +70 -58
  60. package/dist/esm/nativeSheet.native.js.map +1 -1
  61. package/dist/esm/stableViewportHeight.mjs +8 -0
  62. package/dist/esm/stableViewportHeight.mjs.map +1 -0
  63. package/dist/esm/stableViewportHeight.native.js +8 -0
  64. package/dist/esm/stableViewportHeight.native.js.map +1 -0
  65. package/dist/esm/useKeyboardControllerSheet.native.js +0 -5
  66. package/dist/esm/useSheetOffscreenSize.mjs +3 -1
  67. package/dist/esm/useSheetOffscreenSize.mjs.map +1 -1
  68. package/dist/esm/useSheetOffscreenSize.native.js +3 -2
  69. package/dist/esm/useSheetOffscreenSize.native.js.map +1 -1
  70. package/dist/esm/useSheetOpenState.mjs +14 -7
  71. package/dist/esm/useSheetOpenState.mjs.map +1 -1
  72. package/dist/esm/useSheetOpenState.native.js +16 -6
  73. package/dist/esm/useSheetOpenState.native.js.map +1 -1
  74. package/dist/esm/useSheetProviderProps.mjs +5 -88
  75. package/dist/esm/useSheetProviderProps.mjs.map +1 -1
  76. package/dist/esm/useSheetProviderProps.native.js +5 -97
  77. package/dist/esm/useSheetProviderProps.native.js.map +1 -1
  78. package/dist/esm/useSheetState.mjs +95 -0
  79. package/dist/esm/useSheetState.mjs.map +1 -0
  80. package/dist/esm/useSheetState.native.js +104 -0
  81. package/dist/esm/useSheetState.native.js.map +1 -0
  82. package/dist/jsx/Sheet.mjs +48 -15
  83. package/dist/jsx/Sheet.mjs.map +1 -1
  84. package/dist/jsx/Sheet.native.cjs +46 -17
  85. package/dist/jsx/Sheet.native.js +46 -17
  86. package/dist/jsx/Sheet.native.js.map +1 -1
  87. package/dist/jsx/SheetDragSurface.mjs +25 -0
  88. package/dist/jsx/SheetDragSurface.mjs.map +1 -0
  89. package/dist/{cjs/GestureDetectorWrapper.native.cjs → jsx/SheetDragSurface.native.cjs} +24 -10
  90. package/dist/jsx/{GestureDetectorWrapper.native.cjs → SheetDragSurface.native.js} +26 -10
  91. package/dist/jsx/SheetDragSurface.native.js.map +1 -0
  92. package/dist/jsx/SheetImplementationCustom.mjs +39 -56
  93. package/dist/jsx/SheetImplementationCustom.mjs.map +1 -1
  94. package/dist/jsx/SheetImplementationCustom.native.cjs +43 -59
  95. package/dist/jsx/SheetImplementationCustom.native.js +43 -59
  96. package/dist/jsx/SheetImplementationCustom.native.js.map +1 -1
  97. package/dist/jsx/SheetScrollView.mjs +16 -4
  98. package/dist/jsx/SheetScrollView.mjs.map +1 -1
  99. package/dist/jsx/SheetScrollView.native.cjs +17 -4
  100. package/dist/jsx/SheetScrollView.native.js +17 -4
  101. package/dist/jsx/SheetScrollView.native.js.map +1 -1
  102. package/dist/jsx/nativeSheet.mjs +3 -60
  103. package/dist/jsx/nativeSheet.mjs.map +1 -1
  104. package/dist/jsx/nativeSheet.native.cjs +70 -58
  105. package/dist/jsx/nativeSheet.native.js +70 -58
  106. package/dist/jsx/nativeSheet.native.js.map +1 -1
  107. package/dist/jsx/stableViewportHeight.mjs +8 -0
  108. package/dist/jsx/stableViewportHeight.mjs.map +1 -0
  109. package/dist/jsx/stableViewportHeight.native.cjs +29 -0
  110. package/dist/jsx/stableViewportHeight.native.js +31 -0
  111. package/dist/jsx/stableViewportHeight.native.js.map +1 -0
  112. package/dist/jsx/useSheetOffscreenSize.mjs +3 -1
  113. package/dist/jsx/useSheetOffscreenSize.mjs.map +1 -1
  114. package/dist/jsx/useSheetOffscreenSize.native.cjs +3 -2
  115. package/dist/jsx/useSheetOffscreenSize.native.js +3 -2
  116. package/dist/jsx/useSheetOffscreenSize.native.js.map +1 -1
  117. package/dist/jsx/useSheetOpenState.mjs +14 -7
  118. package/dist/jsx/useSheetOpenState.mjs.map +1 -1
  119. package/dist/jsx/useSheetOpenState.native.cjs +15 -5
  120. package/dist/jsx/useSheetOpenState.native.js +15 -5
  121. package/dist/jsx/useSheetOpenState.native.js.map +1 -1
  122. package/dist/jsx/useSheetProviderProps.mjs +5 -88
  123. package/dist/jsx/useSheetProviderProps.mjs.map +1 -1
  124. package/dist/jsx/useSheetProviderProps.native.cjs +5 -103
  125. package/dist/jsx/useSheetProviderProps.native.js +5 -103
  126. package/dist/jsx/useSheetProviderProps.native.js.map +1 -1
  127. package/dist/jsx/useSheetState.mjs +95 -0
  128. package/dist/jsx/useSheetState.mjs.map +1 -0
  129. package/dist/jsx/useSheetState.native.cjs +131 -0
  130. package/dist/jsx/useSheetState.native.js +133 -0
  131. package/dist/jsx/useSheetState.native.js.map +1 -0
  132. package/package.json +27 -22
  133. package/src/Sheet.tsx +45 -18
  134. package/src/SheetDragSurface.native.tsx +42 -0
  135. package/src/SheetDragSurface.tsx +40 -0
  136. package/src/SheetImplementationCustom.tsx +67 -92
  137. package/src/SheetScrollView.tsx +26 -4
  138. package/src/nativeSheet.native.tsx +110 -0
  139. package/src/nativeSheet.ts +16 -0
  140. package/src/stableViewportHeight.native.ts +9 -0
  141. package/src/stableViewportHeight.ts +15 -0
  142. package/src/types.tsx +44 -1
  143. package/src/useSheetOffscreenSize.tsx +3 -7
  144. package/src/useSheetOpenState.tsx +18 -8
  145. package/src/useSheetProviderProps.tsx +18 -149
  146. package/src/useSheetScrollViewGestures.native.ts +4 -1
  147. package/src/useSheetState.tsx +139 -0
  148. package/types/Sheet.d.ts +71 -167
  149. package/types/Sheet.d.ts.map +1 -1
  150. package/types/SheetDragSurface.d.ts +11 -0
  151. package/types/SheetDragSurface.d.ts.map +1 -0
  152. package/types/SheetDragSurface.native.d.ts +11 -0
  153. package/types/SheetDragSurface.native.d.ts.map +1 -0
  154. package/types/SheetImplementationCustom.d.ts +1 -2
  155. package/types/SheetImplementationCustom.d.ts.map +1 -1
  156. package/types/SheetScrollView.d.ts +3 -3
  157. package/types/SheetScrollView.d.ts.map +1 -1
  158. package/types/nativeSheet.d.ts +8 -9
  159. package/types/nativeSheet.d.ts.map +1 -1
  160. package/types/nativeSheet.native.d.ts +4 -0
  161. package/types/nativeSheet.native.d.ts.map +1 -0
  162. package/types/stableViewportHeight.d.ts +12 -0
  163. package/types/stableViewportHeight.d.ts.map +1 -0
  164. package/types/stableViewportHeight.native.d.ts +6 -0
  165. package/types/stableViewportHeight.native.d.ts.map +1 -0
  166. package/types/types.d.ts +34 -1
  167. package/types/types.d.ts.map +1 -1
  168. package/types/useSheetOffscreenSize.d.ts +1 -1
  169. package/types/useSheetOffscreenSize.d.ts.map +1 -1
  170. package/types/useSheetOpenState.d.ts +3 -1
  171. package/types/useSheetOpenState.d.ts.map +1 -1
  172. package/types/useSheetProviderProps.d.ts +15 -13
  173. package/types/useSheetProviderProps.d.ts.map +1 -1
  174. package/types/useSheetScrollViewGestures.native.d.ts +1 -1
  175. package/types/useSheetScrollViewGestures.native.d.ts.map +1 -1
  176. package/types/useSheetState.d.ts +26 -0
  177. package/types/useSheetState.d.ts.map +1 -0
  178. package/dist/cjs/GestureDetectorWrapper.cjs +0 -44
  179. package/dist/cjs/GestureDetectorWrapper.native.js.map +0 -1
  180. package/dist/esm/GestureDetectorWrapper.mjs +0 -25
  181. package/dist/esm/GestureDetectorWrapper.mjs.map +0 -1
  182. package/dist/esm/GestureDetectorWrapper.native.js +0 -26
  183. package/dist/esm/GestureDetectorWrapper.native.js.map +0 -1
  184. package/dist/jsx/GestureDetectorWrapper.mjs +0 -25
  185. package/dist/jsx/GestureDetectorWrapper.mjs.map +0 -1
  186. package/dist/jsx/GestureDetectorWrapper.native.js.map +0 -1
  187. package/src/GestureDetectorWrapper.tsx +0 -38
  188. package/src/nativeSheet.tsx +0 -86
  189. package/types/GestureDetectorWrapper.d.ts +0 -14
  190. package/types/GestureDetectorWrapper.d.ts.map +0 -1
@@ -1,137 +1,25 @@
1
- import React from 'react'
2
- import type { TamaguiElement } from '@tamagui/core'
3
1
  import { useConfiguration } from '@tamagui/core'
4
2
  import { useConstant } from '@tamagui/use-constant'
5
- import { useControllableState } from '@tamagui/use-controllable-state'
6
3
 
7
4
  import type { ScrollBridge, SheetProps } from './types'
8
5
  import type { SheetOpenState } from './useSheetOpenState'
9
-
10
- export type SheetContextValue = ReturnType<typeof useSheetProviderProps> & {
11
- keyboardOccludedHeight: number
12
- // whether the soft keyboard is currently open. distinct from
13
- // keyboardOccludedHeight (which is 0 once the sheet fits above the keyboard):
14
- // the fit-mode height freeze must persist for the whole time the keyboard is
15
- // open, not just while occluded, or it releases and the sheet collapses.
16
- isKeyboardVisible: boolean
17
- // the sheet's pre-keyboard frame height (web). SheetScrollView pins its height
18
- // to this while the keyboard is open so the frame translates at full size
19
- // instead of collapsing to a consumer maxHeight that shrank with the viewport.
20
- // 0 when not applicable.
21
- keyboardStableFrameHeight: number
22
- setHasScrollView: (val: boolean) => void
23
- }
6
+ import { useSheetState } from './useSheetState'
7
+
8
+ export type SheetContextValue =
9
+ | (ReturnType<typeof useSheetProviderProps> & {
10
+ keyboardOccludedHeight: number
11
+ isKeyboardVisible: boolean
12
+ keyboardStableFrameHeight: number
13
+ setHasScrollView: (val: boolean) => void
14
+ })
15
+ | (Omit<ReturnType<typeof useSheetState>, 'maxContentSize'> & {
16
+ onlyShowContainer: true
17
+ scrollBridge?: undefined
18
+ })
24
19
 
25
20
  export function useSheetProviderProps(props: SheetProps, state: SheetOpenState) {
26
- const handleRef = React.useRef<TamaguiElement>(null)
27
- const contentRef = React.useRef<TamaguiElement>(null)
28
- const [frameSize, setFrameSize] = React.useState<number>(0)
29
- const [maxContentSize, setMaxContentSize] = React.useState<number>(0)
30
- const snapPointsMode = props.snapPointsMode ?? 'percent'
31
- const snapPointsProp: (string | number)[] =
32
- props.snapPoints ??
33
- (snapPointsMode === 'percent'
34
- ? [80]
35
- : snapPointsMode === 'constant'
36
- ? [256]
37
- : ['fit'])
38
- const hasFit = snapPointsProp[0] === 'fit'
39
-
40
- const snapPoints = React.useMemo(
41
- () => (props.dismissOnSnapToBottom ? [...snapPointsProp, 0] : snapPointsProp),
42
-
43
- [JSON.stringify(snapPointsProp), props.dismissOnSnapToBottom]
44
- )
45
-
46
- // lets set -1 to be always the "open = false" position
47
- const [position_, setPositionImmediate] = useControllableState({
48
- prop: props.position,
49
- defaultProp: props.defaultPosition || (state.open ? 0 : -1),
50
- onChange: props.onPositionChange,
51
- strategy: 'most-recent-wins',
52
- })
53
-
54
- const position = state.open === false ? -1 : position_
55
-
56
- const { open } = state
57
-
58
- const setPosition = React.useCallback(
59
- (next: number) => {
60
- // close on dismissOnSnapToBottom (and set position so it animates)
61
- if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {
62
- state.setOpen(false)
63
- } else {
64
- setPositionImmediate(next)
65
- }
66
- },
67
- [props.dismissOnSnapToBottom, snapPoints.length, setPositionImmediate, state.setOpen]
68
- )
69
-
70
- if (process.env.NODE_ENV === 'development') {
71
- if (
72
- snapPointsMode === 'mixed' &&
73
- snapPoints.some((p) => {
74
- if (typeof p === 'string') {
75
- if (p === 'fit') {
76
- return false
77
- }
78
- if (p.endsWith('%')) {
79
- const n = Number(p.slice(0, -1))
80
- return n < 0 || n > 100
81
- }
82
- return true
83
- }
84
- return typeof p !== 'number' || p < 0
85
- })
86
- ) {
87
- console.warn(
88
- '⚠️ Invalid snapPoint given, snapPoints must be positive numeric values, string percentages between 0-100%, or "fit" when snapPointsMode is mixed'
89
- )
90
- }
91
- if (snapPointsMode === 'mixed' && snapPoints.indexOf('fit') > 0) {
92
- console.warn(
93
- '⚠️ Invalid snapPoint given, "fit" must be the first/largest snap point when snapPointsMode is mixed'
94
- )
95
- }
96
- if (
97
- snapPointsMode === 'fit' &&
98
- (snapPoints.length !== (props.dismissOnSnapToBottom ? 2 : 1) ||
99
- snapPoints[0] !== 'fit')
100
- ) {
101
- console.warn(
102
- '⚠️ Invalid snapPoint given, there are no snap points when snapPointsMode is fit'
103
- )
104
- }
105
- if (
106
- snapPointsMode === 'constant' &&
107
- snapPoints.some((p) => typeof p !== 'number' || p < 0)
108
- ) {
109
- console.warn(
110
- '⚠️ Invalid snapPoint given, snapPoints must be positive numeric values when snapPointsMode is constant'
111
- )
112
- }
113
- if (
114
- snapPointsMode === 'percent' &&
115
- snapPoints.some((p) => typeof p !== 'number' || p < 0 || p > 100)
116
- ) {
117
- console.warn(
118
- '⚠️ Invalid snapPoint given, snapPoints must be numeric values between 0 and 100 when snapPointsMode is percent'
119
- )
120
- }
121
- }
122
-
123
- // reset position to fully open on re-open after dismissOnSnapToBottom
124
- if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {
125
- setPositionImmediate(0)
126
- }
127
-
128
- // open must set position
129
- const shouldSetPositionOpen = open && position < 0
130
- React.useEffect(() => {
131
- if (shouldSetPositionOpen) {
132
- setPosition(0)
133
- }
134
- }, [setPosition, shouldSetPositionOpen])
21
+ const { maxContentSize, ...sheetState } = useSheetState(props, state)
22
+ const { frameSize, snapPointsMode, snapPoints, open } = sheetState
135
23
 
136
24
  const { animationDriver } = useConfiguration()
137
25
  if (!animationDriver) {
@@ -181,31 +69,12 @@ export function useSheetProviderProps(props: SheetProps, state: SheetOpenState)
181
69
  ? frameSize / ((typeof maxSnapPoint === 'number' ? maxSnapPoint : 100) / 100)
182
70
  : maxContentSize
183
71
 
184
- const providerProps = {
72
+ return {
73
+ ...sheetState,
185
74
  screenSize,
186
75
  maxSnapPoint,
187
76
  disableRemoveScroll,
188
77
  scrollBridge,
189
- modal: !!props.modal,
190
- open: state.open,
191
- setOpen: state.setOpen,
192
- hidden: !!state.isHidden,
193
- contentRef,
194
- handleRef,
195
- frameSize,
196
- setFrameSize,
197
- dismissOnOverlayPress: props.dismissOnOverlayPress ?? true,
198
- dismissOnSnapToBottom: props.dismissOnSnapToBottom ?? false,
199
- scope: props.scope ?? '',
200
- hasFit,
201
- position,
202
- snapPoints,
203
- snapPointsMode,
204
- setMaxContentSize,
205
- setPosition,
206
- setPositionImmediate,
207
- onlyShowContainer: false,
78
+ onlyShowContainer: false as const,
208
79
  }
209
-
210
- return providerProps
211
80
  }
@@ -1,5 +1,8 @@
1
1
  import { useRef } from 'react'
2
- import type { GestureResponderEvent, ScrollView as RNScrollView } from 'react-native'
2
+ import type {
3
+ GestureResponderEvent,
4
+ ScrollViewInstance as RNScrollView,
5
+ } from 'react-native'
3
6
  import type { ScrollBridge } from './types'
4
7
 
5
8
  interface ResponderState {
@@ -0,0 +1,139 @@
1
+ import React from 'react'
2
+ import type { TamaguiElement } from '@tamagui/core'
3
+ import { useControllableState } from '@tamagui/use-controllable-state'
4
+ import type { SheetProps } from './types'
5
+ import type { SheetOpenState } from './useSheetOpenState'
6
+
7
+ export function useSheetState(props: SheetProps, state: SheetOpenState) {
8
+ const handleRef = React.useRef<TamaguiElement>(null)
9
+ const contentRef = React.useRef<TamaguiElement>(null)
10
+ const [frameSize, setFrameSize] = React.useState<number>(0)
11
+ const [maxContentSize, setMaxContentSize] = React.useState<number>(0)
12
+ const snapPointsMode = props.snapPointsMode ?? 'percent'
13
+ const snapPointsProp: (string | number)[] =
14
+ props.snapPoints ??
15
+ (snapPointsMode === 'percent'
16
+ ? [80]
17
+ : snapPointsMode === 'constant'
18
+ ? [256]
19
+ : ['fit'])
20
+ const hasFit = snapPointsProp[0] === 'fit'
21
+
22
+ const snapPoints = React.useMemo(
23
+ () => (props.dismissOnSnapToBottom ? [...snapPointsProp, 0] : snapPointsProp),
24
+
25
+ [JSON.stringify(snapPointsProp), props.dismissOnSnapToBottom]
26
+ )
27
+
28
+ // lets set -1 to be always the "open = false" position
29
+ const [position_, setPositionImmediate] = useControllableState({
30
+ prop: props.position,
31
+ defaultProp: props.defaultPosition || (state.open ? 0 : -1),
32
+ onChange: props.onPositionChange,
33
+ strategy: state.strategy,
34
+ })
35
+
36
+ const position = state.open === false ? -1 : position_
37
+
38
+ const { open } = state
39
+
40
+ const setPosition = React.useCallback(
41
+ (next: number) => {
42
+ // close on dismissOnSnapToBottom (and set position so it animates)
43
+ if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {
44
+ state.setOpen(false)
45
+ } else {
46
+ setPositionImmediate(next)
47
+ }
48
+ },
49
+ [props.dismissOnSnapToBottom, snapPoints.length, setPositionImmediate, state.setOpen]
50
+ )
51
+
52
+ if (process.env.NODE_ENV === 'development') {
53
+ if (
54
+ snapPointsMode === 'mixed' &&
55
+ snapPoints.some((p) => {
56
+ if (typeof p === 'string') {
57
+ if (p === 'fit') {
58
+ return false
59
+ }
60
+ if (p.endsWith('%')) {
61
+ const n = Number(p.slice(0, -1))
62
+ return n < 0 || n > 100
63
+ }
64
+ return true
65
+ }
66
+ return typeof p !== 'number' || p < 0
67
+ })
68
+ ) {
69
+ console.warn(
70
+ '⚠️ Invalid snapPoint given, snapPoints must be positive numeric values, string percentages between 0-100%, or "fit" when snapPointsMode is mixed'
71
+ )
72
+ }
73
+ if (snapPointsMode === 'mixed' && snapPoints.indexOf('fit') > 0) {
74
+ console.warn(
75
+ '⚠️ Invalid snapPoint given, "fit" must be the first/largest snap point when snapPointsMode is mixed'
76
+ )
77
+ }
78
+ if (
79
+ snapPointsMode === 'fit' &&
80
+ (snapPoints.length !== (props.dismissOnSnapToBottom ? 2 : 1) ||
81
+ snapPoints[0] !== 'fit')
82
+ ) {
83
+ console.warn(
84
+ '⚠️ Invalid snapPoint given, there are no snap points when snapPointsMode is fit'
85
+ )
86
+ }
87
+ if (
88
+ snapPointsMode === 'constant' &&
89
+ snapPoints.some((p) => typeof p !== 'number' || p < 0)
90
+ ) {
91
+ console.warn(
92
+ '⚠️ Invalid snapPoint given, snapPoints must be positive numeric values when snapPointsMode is constant'
93
+ )
94
+ }
95
+ if (
96
+ snapPointsMode === 'percent' &&
97
+ snapPoints.some((p) => typeof p !== 'number' || p < 0 || p > 100)
98
+ ) {
99
+ console.warn(
100
+ '⚠️ Invalid snapPoint given, snapPoints must be numeric values between 0 and 100 when snapPointsMode is percent'
101
+ )
102
+ }
103
+ }
104
+
105
+ // reset position to fully open on re-open after dismissOnSnapToBottom
106
+ if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {
107
+ setPositionImmediate(0)
108
+ }
109
+
110
+ // open must set position
111
+ const shouldSetPositionOpen = open && position < 0
112
+ React.useEffect(() => {
113
+ if (shouldSetPositionOpen) {
114
+ setPosition(0)
115
+ }
116
+ }, [setPosition, shouldSetPositionOpen])
117
+
118
+ return {
119
+ modal: !!props.modal,
120
+ open: state.open,
121
+ setOpen: state.setOpen,
122
+ hidden: !!state.isHidden,
123
+ contentRef,
124
+ handleRef,
125
+ frameSize,
126
+ setFrameSize,
127
+ maxContentSize,
128
+ dismissOnOverlayPress: props.dismissOnOverlayPress ?? true,
129
+ dismissOnSnapToBottom: props.dismissOnSnapToBottom ?? false,
130
+ scope: props.scope ?? '',
131
+ hasFit,
132
+ position,
133
+ snapPoints,
134
+ snapPointsMode,
135
+ setMaxContentSize,
136
+ setPosition,
137
+ setPositionImmediate,
138
+ }
139
+ }