@sdcx/bottom-sheet 0.14.0 → 0.16.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/LICENSE +1 -1
- package/android/src/main/java/com/reactnative/bottomsheet/BottomSheet.java +6 -2
- package/{lib → dist}/index.d.ts +1 -1
- package/{lib → dist}/index.js +6 -2
- package/dist/splitLayoutProps.d.ts +405 -0
- package/ios/BottomSheet/RNBottomSheet.m +44 -30
- package/package.json +6 -33
- package/src/index.tsx +36 -26
- package/src/splitLayoutProps.ts +9 -9
- package/lib/splitLayoutProps.d.ts +0 -15
- /package/{lib → dist}/splitLayoutProps.js +0 -0
package/LICENSE
CHANGED
|
@@ -163,7 +163,11 @@ public class BottomSheet extends ReactViewGroup implements NestedScrollingParent
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
public void setState(BottomSheetState state) {
|
|
166
|
-
if (state ==
|
|
166
|
+
if (this.state == state) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (this.state == SETTLING) {
|
|
167
171
|
return;
|
|
168
172
|
}
|
|
169
173
|
|
|
@@ -282,7 +286,7 @@ public class BottomSheet extends ReactViewGroup implements NestedScrollingParent
|
|
|
282
286
|
if (!draggable) {
|
|
283
287
|
return false;
|
|
284
288
|
}
|
|
285
|
-
|
|
289
|
+
|
|
286
290
|
int action = event.getActionMasked();
|
|
287
291
|
if (state == DRAGGING && action == MotionEvent.ACTION_DOWN) {
|
|
288
292
|
return true;
|
package/{lib → dist}/index.d.ts
RENAMED
|
@@ -20,5 +20,5 @@ interface NativeBottomSheetProps extends ViewProps {
|
|
|
20
20
|
}
|
|
21
21
|
declare const BottomSheet: React.ForwardRefExoticComponent<NativeBottomSheetProps & {
|
|
22
22
|
fitToContents?: boolean | undefined;
|
|
23
|
-
} & React.RefAttributes<React.Component<NativeBottomSheetProps, {}, any> &
|
|
23
|
+
} & React.RefAttributes<React.Component<NativeBottomSheetProps, {}, any> & import("react-native").NativeMethods>>;
|
|
24
24
|
export default BottomSheet;
|
package/{lib → dist}/index.js
RENAMED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { requireNativeComponent, StyleSheet, View } from 'react-native';
|
|
2
|
+
import { requireNativeComponent, StyleSheet, View, } from 'react-native';
|
|
3
3
|
import splitLayoutProps from './splitLayoutProps';
|
|
4
4
|
const NativeBottomSheet = requireNativeComponent('BottomSheet');
|
|
5
5
|
const BottomSheet = React.forwardRef((props, ref) => {
|
|
6
6
|
const { style, contentContainerStyle, children, peekHeight = 200, draggable = true, state = 'collapsed', fitToContents, ...rest } = props;
|
|
7
7
|
const { outer, inner } = splitLayoutProps(StyleSheet.flatten(style));
|
|
8
8
|
return (<NativeBottomSheet style={[StyleSheet.absoluteFill, outer]} peekHeight={peekHeight} draggable={draggable} state={state} {...rest} ref={ref}>
|
|
9
|
-
<View style={[
|
|
9
|
+
<View style={[
|
|
10
|
+
fitToContents ? styles.fitToContents : StyleSheet.absoluteFill,
|
|
11
|
+
inner,
|
|
12
|
+
contentContainerStyle,
|
|
13
|
+
]} collapsable={false}>
|
|
10
14
|
{children}
|
|
11
15
|
</View>
|
|
12
16
|
</NativeBottomSheet>);
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { ViewStyle } from 'react-native';
|
|
2
|
+
export default function splitLayoutProps(props?: ViewStyle): {
|
|
3
|
+
outer: {
|
|
4
|
+
[key: string]: string | number | import("react-native").OpaqueColorValue | import("react-native").Animated.AnimatedNode | readonly import("react-native").BoxShadowValue[] | readonly import("react-native").FilterFunction[] | readonly import("react-native").GradientValue[] | Readonly<{
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}> | readonly (({
|
|
8
|
+
scaleX: import("react-native").AnimatableNumericValue;
|
|
9
|
+
} & {
|
|
10
|
+
scaleY?: undefined;
|
|
11
|
+
translateX?: undefined;
|
|
12
|
+
translateY?: undefined;
|
|
13
|
+
perspective?: undefined;
|
|
14
|
+
rotate?: undefined;
|
|
15
|
+
rotateX?: undefined;
|
|
16
|
+
rotateY?: undefined;
|
|
17
|
+
rotateZ?: undefined;
|
|
18
|
+
scale?: undefined;
|
|
19
|
+
skewX?: undefined;
|
|
20
|
+
skewY?: undefined;
|
|
21
|
+
matrix?: undefined;
|
|
22
|
+
}) | ({
|
|
23
|
+
scaleY: import("react-native").AnimatableNumericValue;
|
|
24
|
+
} & {
|
|
25
|
+
scaleX?: undefined;
|
|
26
|
+
translateX?: undefined;
|
|
27
|
+
translateY?: undefined;
|
|
28
|
+
perspective?: undefined;
|
|
29
|
+
rotate?: undefined;
|
|
30
|
+
rotateX?: undefined;
|
|
31
|
+
rotateY?: undefined;
|
|
32
|
+
rotateZ?: undefined;
|
|
33
|
+
scale?: undefined;
|
|
34
|
+
skewX?: undefined;
|
|
35
|
+
skewY?: undefined;
|
|
36
|
+
matrix?: undefined;
|
|
37
|
+
}) | ({
|
|
38
|
+
translateX: import("react-native").AnimatableNumericValue | `${number}%`;
|
|
39
|
+
} & {
|
|
40
|
+
scaleX?: undefined;
|
|
41
|
+
scaleY?: undefined;
|
|
42
|
+
translateY?: undefined;
|
|
43
|
+
perspective?: undefined;
|
|
44
|
+
rotate?: undefined;
|
|
45
|
+
rotateX?: undefined;
|
|
46
|
+
rotateY?: undefined;
|
|
47
|
+
rotateZ?: undefined;
|
|
48
|
+
scale?: undefined;
|
|
49
|
+
skewX?: undefined;
|
|
50
|
+
skewY?: undefined;
|
|
51
|
+
matrix?: undefined;
|
|
52
|
+
}) | ({
|
|
53
|
+
translateY: import("react-native").AnimatableNumericValue | `${number}%`;
|
|
54
|
+
} & {
|
|
55
|
+
scaleX?: undefined;
|
|
56
|
+
scaleY?: undefined;
|
|
57
|
+
translateX?: undefined;
|
|
58
|
+
perspective?: undefined;
|
|
59
|
+
rotate?: undefined;
|
|
60
|
+
rotateX?: undefined;
|
|
61
|
+
rotateY?: undefined;
|
|
62
|
+
rotateZ?: undefined;
|
|
63
|
+
scale?: undefined;
|
|
64
|
+
skewX?: undefined;
|
|
65
|
+
skewY?: undefined;
|
|
66
|
+
matrix?: undefined;
|
|
67
|
+
}) | ({
|
|
68
|
+
perspective: import("react-native").AnimatableNumericValue;
|
|
69
|
+
} & {
|
|
70
|
+
scaleX?: undefined;
|
|
71
|
+
scaleY?: undefined;
|
|
72
|
+
translateX?: undefined;
|
|
73
|
+
translateY?: undefined;
|
|
74
|
+
rotate?: undefined;
|
|
75
|
+
rotateX?: undefined;
|
|
76
|
+
rotateY?: undefined;
|
|
77
|
+
rotateZ?: undefined;
|
|
78
|
+
scale?: undefined;
|
|
79
|
+
skewX?: undefined;
|
|
80
|
+
skewY?: undefined;
|
|
81
|
+
matrix?: undefined;
|
|
82
|
+
}) | ({
|
|
83
|
+
rotate: import("react-native").AnimatableStringValue;
|
|
84
|
+
} & {
|
|
85
|
+
scaleX?: undefined;
|
|
86
|
+
scaleY?: undefined;
|
|
87
|
+
translateX?: undefined;
|
|
88
|
+
translateY?: undefined;
|
|
89
|
+
perspective?: undefined;
|
|
90
|
+
rotateX?: undefined;
|
|
91
|
+
rotateY?: undefined;
|
|
92
|
+
rotateZ?: undefined;
|
|
93
|
+
scale?: undefined;
|
|
94
|
+
skewX?: undefined;
|
|
95
|
+
skewY?: undefined;
|
|
96
|
+
matrix?: undefined;
|
|
97
|
+
}) | ({
|
|
98
|
+
rotateX: import("react-native").AnimatableStringValue;
|
|
99
|
+
} & {
|
|
100
|
+
scaleX?: undefined;
|
|
101
|
+
scaleY?: undefined;
|
|
102
|
+
translateX?: undefined;
|
|
103
|
+
translateY?: undefined;
|
|
104
|
+
perspective?: undefined;
|
|
105
|
+
rotate?: undefined;
|
|
106
|
+
rotateY?: undefined;
|
|
107
|
+
rotateZ?: undefined;
|
|
108
|
+
scale?: undefined;
|
|
109
|
+
skewX?: undefined;
|
|
110
|
+
skewY?: undefined;
|
|
111
|
+
matrix?: undefined;
|
|
112
|
+
}) | ({
|
|
113
|
+
rotateY: import("react-native").AnimatableStringValue;
|
|
114
|
+
} & {
|
|
115
|
+
scaleX?: undefined;
|
|
116
|
+
scaleY?: undefined;
|
|
117
|
+
translateX?: undefined;
|
|
118
|
+
translateY?: undefined;
|
|
119
|
+
perspective?: undefined;
|
|
120
|
+
rotate?: undefined;
|
|
121
|
+
rotateX?: undefined;
|
|
122
|
+
rotateZ?: undefined;
|
|
123
|
+
scale?: undefined;
|
|
124
|
+
skewX?: undefined;
|
|
125
|
+
skewY?: undefined;
|
|
126
|
+
matrix?: undefined;
|
|
127
|
+
}) | ({
|
|
128
|
+
rotateZ: import("react-native").AnimatableStringValue;
|
|
129
|
+
} & {
|
|
130
|
+
scaleX?: undefined;
|
|
131
|
+
scaleY?: undefined;
|
|
132
|
+
translateX?: undefined;
|
|
133
|
+
translateY?: undefined;
|
|
134
|
+
perspective?: undefined;
|
|
135
|
+
rotate?: undefined;
|
|
136
|
+
rotateX?: undefined;
|
|
137
|
+
rotateY?: undefined;
|
|
138
|
+
scale?: undefined;
|
|
139
|
+
skewX?: undefined;
|
|
140
|
+
skewY?: undefined;
|
|
141
|
+
matrix?: undefined;
|
|
142
|
+
}) | ({
|
|
143
|
+
scale: import("react-native").AnimatableNumericValue;
|
|
144
|
+
} & {
|
|
145
|
+
scaleX?: undefined;
|
|
146
|
+
scaleY?: undefined;
|
|
147
|
+
translateX?: undefined;
|
|
148
|
+
translateY?: undefined;
|
|
149
|
+
perspective?: undefined;
|
|
150
|
+
rotate?: undefined;
|
|
151
|
+
rotateX?: undefined;
|
|
152
|
+
rotateY?: undefined;
|
|
153
|
+
rotateZ?: undefined;
|
|
154
|
+
skewX?: undefined;
|
|
155
|
+
skewY?: undefined;
|
|
156
|
+
matrix?: undefined;
|
|
157
|
+
}) | ({
|
|
158
|
+
skewX: import("react-native").AnimatableStringValue;
|
|
159
|
+
} & {
|
|
160
|
+
scaleX?: undefined;
|
|
161
|
+
scaleY?: undefined;
|
|
162
|
+
translateX?: undefined;
|
|
163
|
+
translateY?: undefined;
|
|
164
|
+
perspective?: undefined;
|
|
165
|
+
rotate?: undefined;
|
|
166
|
+
rotateX?: undefined;
|
|
167
|
+
rotateY?: undefined;
|
|
168
|
+
rotateZ?: undefined;
|
|
169
|
+
scale?: undefined;
|
|
170
|
+
skewY?: undefined;
|
|
171
|
+
matrix?: undefined;
|
|
172
|
+
}) | ({
|
|
173
|
+
skewY: import("react-native").AnimatableStringValue;
|
|
174
|
+
} & {
|
|
175
|
+
scaleX?: undefined;
|
|
176
|
+
scaleY?: undefined;
|
|
177
|
+
translateX?: undefined;
|
|
178
|
+
translateY?: undefined;
|
|
179
|
+
perspective?: undefined;
|
|
180
|
+
rotate?: undefined;
|
|
181
|
+
rotateX?: undefined;
|
|
182
|
+
rotateY?: undefined;
|
|
183
|
+
rotateZ?: undefined;
|
|
184
|
+
scale?: undefined;
|
|
185
|
+
skewX?: undefined;
|
|
186
|
+
matrix?: undefined;
|
|
187
|
+
}) | ({
|
|
188
|
+
matrix: import("react-native").AnimatableNumericValue[];
|
|
189
|
+
} & {
|
|
190
|
+
scaleX?: undefined;
|
|
191
|
+
scaleY?: undefined;
|
|
192
|
+
translateX?: undefined;
|
|
193
|
+
translateY?: undefined;
|
|
194
|
+
perspective?: undefined;
|
|
195
|
+
rotate?: undefined;
|
|
196
|
+
rotateX?: undefined;
|
|
197
|
+
rotateY?: undefined;
|
|
198
|
+
rotateZ?: undefined;
|
|
199
|
+
scale?: undefined;
|
|
200
|
+
skewX?: undefined;
|
|
201
|
+
skewY?: undefined;
|
|
202
|
+
}))[] | (string | number)[] | number[] | null | undefined;
|
|
203
|
+
};
|
|
204
|
+
inner: {
|
|
205
|
+
[key: string]: string | number | import("react-native").OpaqueColorValue | import("react-native").Animated.AnimatedNode | readonly import("react-native").BoxShadowValue[] | readonly import("react-native").FilterFunction[] | readonly import("react-native").GradientValue[] | Readonly<{
|
|
206
|
+
width: number;
|
|
207
|
+
height: number;
|
|
208
|
+
}> | readonly (({
|
|
209
|
+
scaleX: import("react-native").AnimatableNumericValue;
|
|
210
|
+
} & {
|
|
211
|
+
scaleY?: undefined;
|
|
212
|
+
translateX?: undefined;
|
|
213
|
+
translateY?: undefined;
|
|
214
|
+
perspective?: undefined;
|
|
215
|
+
rotate?: undefined;
|
|
216
|
+
rotateX?: undefined;
|
|
217
|
+
rotateY?: undefined;
|
|
218
|
+
rotateZ?: undefined;
|
|
219
|
+
scale?: undefined;
|
|
220
|
+
skewX?: undefined;
|
|
221
|
+
skewY?: undefined;
|
|
222
|
+
matrix?: undefined;
|
|
223
|
+
}) | ({
|
|
224
|
+
scaleY: import("react-native").AnimatableNumericValue;
|
|
225
|
+
} & {
|
|
226
|
+
scaleX?: undefined;
|
|
227
|
+
translateX?: undefined;
|
|
228
|
+
translateY?: undefined;
|
|
229
|
+
perspective?: undefined;
|
|
230
|
+
rotate?: undefined;
|
|
231
|
+
rotateX?: undefined;
|
|
232
|
+
rotateY?: undefined;
|
|
233
|
+
rotateZ?: undefined;
|
|
234
|
+
scale?: undefined;
|
|
235
|
+
skewX?: undefined;
|
|
236
|
+
skewY?: undefined;
|
|
237
|
+
matrix?: undefined;
|
|
238
|
+
}) | ({
|
|
239
|
+
translateX: import("react-native").AnimatableNumericValue | `${number}%`;
|
|
240
|
+
} & {
|
|
241
|
+
scaleX?: undefined;
|
|
242
|
+
scaleY?: undefined;
|
|
243
|
+
translateY?: undefined;
|
|
244
|
+
perspective?: undefined;
|
|
245
|
+
rotate?: undefined;
|
|
246
|
+
rotateX?: undefined;
|
|
247
|
+
rotateY?: undefined;
|
|
248
|
+
rotateZ?: undefined;
|
|
249
|
+
scale?: undefined;
|
|
250
|
+
skewX?: undefined;
|
|
251
|
+
skewY?: undefined;
|
|
252
|
+
matrix?: undefined;
|
|
253
|
+
}) | ({
|
|
254
|
+
translateY: import("react-native").AnimatableNumericValue | `${number}%`;
|
|
255
|
+
} & {
|
|
256
|
+
scaleX?: undefined;
|
|
257
|
+
scaleY?: undefined;
|
|
258
|
+
translateX?: undefined;
|
|
259
|
+
perspective?: undefined;
|
|
260
|
+
rotate?: undefined;
|
|
261
|
+
rotateX?: undefined;
|
|
262
|
+
rotateY?: undefined;
|
|
263
|
+
rotateZ?: undefined;
|
|
264
|
+
scale?: undefined;
|
|
265
|
+
skewX?: undefined;
|
|
266
|
+
skewY?: undefined;
|
|
267
|
+
matrix?: undefined;
|
|
268
|
+
}) | ({
|
|
269
|
+
perspective: import("react-native").AnimatableNumericValue;
|
|
270
|
+
} & {
|
|
271
|
+
scaleX?: undefined;
|
|
272
|
+
scaleY?: undefined;
|
|
273
|
+
translateX?: undefined;
|
|
274
|
+
translateY?: undefined;
|
|
275
|
+
rotate?: undefined;
|
|
276
|
+
rotateX?: undefined;
|
|
277
|
+
rotateY?: undefined;
|
|
278
|
+
rotateZ?: undefined;
|
|
279
|
+
scale?: undefined;
|
|
280
|
+
skewX?: undefined;
|
|
281
|
+
skewY?: undefined;
|
|
282
|
+
matrix?: undefined;
|
|
283
|
+
}) | ({
|
|
284
|
+
rotate: import("react-native").AnimatableStringValue;
|
|
285
|
+
} & {
|
|
286
|
+
scaleX?: undefined;
|
|
287
|
+
scaleY?: undefined;
|
|
288
|
+
translateX?: undefined;
|
|
289
|
+
translateY?: undefined;
|
|
290
|
+
perspective?: undefined;
|
|
291
|
+
rotateX?: undefined;
|
|
292
|
+
rotateY?: undefined;
|
|
293
|
+
rotateZ?: undefined;
|
|
294
|
+
scale?: undefined;
|
|
295
|
+
skewX?: undefined;
|
|
296
|
+
skewY?: undefined;
|
|
297
|
+
matrix?: undefined;
|
|
298
|
+
}) | ({
|
|
299
|
+
rotateX: import("react-native").AnimatableStringValue;
|
|
300
|
+
} & {
|
|
301
|
+
scaleX?: undefined;
|
|
302
|
+
scaleY?: undefined;
|
|
303
|
+
translateX?: undefined;
|
|
304
|
+
translateY?: undefined;
|
|
305
|
+
perspective?: undefined;
|
|
306
|
+
rotate?: undefined;
|
|
307
|
+
rotateY?: undefined;
|
|
308
|
+
rotateZ?: undefined;
|
|
309
|
+
scale?: undefined;
|
|
310
|
+
skewX?: undefined;
|
|
311
|
+
skewY?: undefined;
|
|
312
|
+
matrix?: undefined;
|
|
313
|
+
}) | ({
|
|
314
|
+
rotateY: import("react-native").AnimatableStringValue;
|
|
315
|
+
} & {
|
|
316
|
+
scaleX?: undefined;
|
|
317
|
+
scaleY?: undefined;
|
|
318
|
+
translateX?: undefined;
|
|
319
|
+
translateY?: undefined;
|
|
320
|
+
perspective?: undefined;
|
|
321
|
+
rotate?: undefined;
|
|
322
|
+
rotateX?: undefined;
|
|
323
|
+
rotateZ?: undefined;
|
|
324
|
+
scale?: undefined;
|
|
325
|
+
skewX?: undefined;
|
|
326
|
+
skewY?: undefined;
|
|
327
|
+
matrix?: undefined;
|
|
328
|
+
}) | ({
|
|
329
|
+
rotateZ: import("react-native").AnimatableStringValue;
|
|
330
|
+
} & {
|
|
331
|
+
scaleX?: undefined;
|
|
332
|
+
scaleY?: undefined;
|
|
333
|
+
translateX?: undefined;
|
|
334
|
+
translateY?: undefined;
|
|
335
|
+
perspective?: undefined;
|
|
336
|
+
rotate?: undefined;
|
|
337
|
+
rotateX?: undefined;
|
|
338
|
+
rotateY?: undefined;
|
|
339
|
+
scale?: undefined;
|
|
340
|
+
skewX?: undefined;
|
|
341
|
+
skewY?: undefined;
|
|
342
|
+
matrix?: undefined;
|
|
343
|
+
}) | ({
|
|
344
|
+
scale: import("react-native").AnimatableNumericValue;
|
|
345
|
+
} & {
|
|
346
|
+
scaleX?: undefined;
|
|
347
|
+
scaleY?: undefined;
|
|
348
|
+
translateX?: undefined;
|
|
349
|
+
translateY?: undefined;
|
|
350
|
+
perspective?: undefined;
|
|
351
|
+
rotate?: undefined;
|
|
352
|
+
rotateX?: undefined;
|
|
353
|
+
rotateY?: undefined;
|
|
354
|
+
rotateZ?: undefined;
|
|
355
|
+
skewX?: undefined;
|
|
356
|
+
skewY?: undefined;
|
|
357
|
+
matrix?: undefined;
|
|
358
|
+
}) | ({
|
|
359
|
+
skewX: import("react-native").AnimatableStringValue;
|
|
360
|
+
} & {
|
|
361
|
+
scaleX?: undefined;
|
|
362
|
+
scaleY?: undefined;
|
|
363
|
+
translateX?: undefined;
|
|
364
|
+
translateY?: undefined;
|
|
365
|
+
perspective?: undefined;
|
|
366
|
+
rotate?: undefined;
|
|
367
|
+
rotateX?: undefined;
|
|
368
|
+
rotateY?: undefined;
|
|
369
|
+
rotateZ?: undefined;
|
|
370
|
+
scale?: undefined;
|
|
371
|
+
skewY?: undefined;
|
|
372
|
+
matrix?: undefined;
|
|
373
|
+
}) | ({
|
|
374
|
+
skewY: import("react-native").AnimatableStringValue;
|
|
375
|
+
} & {
|
|
376
|
+
scaleX?: undefined;
|
|
377
|
+
scaleY?: undefined;
|
|
378
|
+
translateX?: undefined;
|
|
379
|
+
translateY?: undefined;
|
|
380
|
+
perspective?: undefined;
|
|
381
|
+
rotate?: undefined;
|
|
382
|
+
rotateX?: undefined;
|
|
383
|
+
rotateY?: undefined;
|
|
384
|
+
rotateZ?: undefined;
|
|
385
|
+
scale?: undefined;
|
|
386
|
+
skewX?: undefined;
|
|
387
|
+
matrix?: undefined;
|
|
388
|
+
}) | ({
|
|
389
|
+
matrix: import("react-native").AnimatableNumericValue[];
|
|
390
|
+
} & {
|
|
391
|
+
scaleX?: undefined;
|
|
392
|
+
scaleY?: undefined;
|
|
393
|
+
translateX?: undefined;
|
|
394
|
+
translateY?: undefined;
|
|
395
|
+
perspective?: undefined;
|
|
396
|
+
rotate?: undefined;
|
|
397
|
+
rotateX?: undefined;
|
|
398
|
+
rotateY?: undefined;
|
|
399
|
+
rotateZ?: undefined;
|
|
400
|
+
scale?: undefined;
|
|
401
|
+
skewX?: undefined;
|
|
402
|
+
skewY?: undefined;
|
|
403
|
+
}))[] | (string | number)[] | number[] | null | undefined;
|
|
404
|
+
};
|
|
405
|
+
};
|
|
@@ -22,10 +22,13 @@
|
|
|
22
22
|
@property(nonatomic, strong) CADisplayLink *displayLink;
|
|
23
23
|
@property(nonatomic, strong) RCTEventDispatcher *eventDispatcher;
|
|
24
24
|
|
|
25
|
+
@property(nonatomic, assign) RNBottomSheetState finalState;
|
|
26
|
+
|
|
25
27
|
@end
|
|
26
28
|
|
|
27
29
|
@implementation RNBottomSheet {
|
|
28
30
|
__weak RCTRootContentView *_rootView;
|
|
31
|
+
BOOL _isInitialRender;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher {
|
|
@@ -33,7 +36,9 @@
|
|
|
33
36
|
_panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
|
|
34
37
|
_panGestureRecognizer.delegate = self;
|
|
35
38
|
_state = RNBottomSheetStateCollapsed;
|
|
39
|
+
_finalState = RNBottomSheetStateCollapsed;
|
|
36
40
|
_eventDispatcher = eventDispatcher;
|
|
41
|
+
_isInitialRender = YES;
|
|
37
42
|
}
|
|
38
43
|
return self;
|
|
39
44
|
}
|
|
@@ -75,14 +80,14 @@
|
|
|
75
80
|
if (gestureRecognizer != self.panGestureRecognizer) {
|
|
76
81
|
return YES;
|
|
77
82
|
}
|
|
78
|
-
|
|
83
|
+
|
|
79
84
|
if (self.target) {
|
|
80
85
|
[self.target removeObserver:self forKeyPath:@"contentOffset"];
|
|
81
86
|
}
|
|
82
87
|
self.target = nil;
|
|
83
|
-
|
|
88
|
+
|
|
84
89
|
UIView *touchView = touch.view;
|
|
85
|
-
|
|
90
|
+
|
|
86
91
|
while (touchView != nil && [touchView isDescendantOfView:self]) {
|
|
87
92
|
if ([touchView isKindOfClass:[UIScrollView class]]) {
|
|
88
93
|
UIScrollView *scrollView = (UIScrollView *)touchView;
|
|
@@ -150,7 +155,7 @@
|
|
|
150
155
|
if (!self.contentView) {
|
|
151
156
|
return;
|
|
152
157
|
}
|
|
153
|
-
|
|
158
|
+
|
|
154
159
|
if (!CGRectEqualToRect(self.contentView.frame, CGRectZero)) {
|
|
155
160
|
[self calculateOffset];
|
|
156
161
|
if (self.state == RNBottomSheetStateCollapsed) {
|
|
@@ -162,6 +167,14 @@
|
|
|
162
167
|
}
|
|
163
168
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
164
169
|
}
|
|
170
|
+
|
|
171
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
172
|
+
if (self.finalState == RNBottomSheetStateExpanded && self->_isInitialRender) {
|
|
173
|
+
[self settleToState:self.finalState withFling:YES];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
self->_isInitialRender = NO;
|
|
177
|
+
});
|
|
165
178
|
}
|
|
166
179
|
|
|
167
180
|
- (void)calculateOffset {
|
|
@@ -171,19 +184,19 @@
|
|
|
171
184
|
}
|
|
172
185
|
|
|
173
186
|
- (void)handlePan:(UIPanGestureRecognizer *)pan {
|
|
174
|
-
if (!self.draggable) {
|
|
187
|
+
if (!self.draggable || self.state == RNBottomSheetStateSettling) {
|
|
175
188
|
return;
|
|
176
189
|
}
|
|
177
|
-
|
|
190
|
+
|
|
178
191
|
CGFloat translationY = [pan translationInView:self.contentView].y;
|
|
179
192
|
[pan setTranslation:CGPointZero inView:self.contentView];
|
|
180
|
-
|
|
193
|
+
|
|
181
194
|
CGFloat top = self.contentView.frame.origin.y;
|
|
182
|
-
|
|
195
|
+
|
|
183
196
|
if (pan.state == UIGestureRecognizerStateChanged) {
|
|
184
197
|
[self setStateInternal:RNBottomSheetStateDragging];
|
|
185
198
|
}
|
|
186
|
-
|
|
199
|
+
|
|
187
200
|
// 如果有嵌套滚动
|
|
188
201
|
if (self.target) {
|
|
189
202
|
if(translationY > 0 && top < self.maxY && self.target.contentOffset.y <= 0) {
|
|
@@ -192,7 +205,7 @@
|
|
|
192
205
|
self.contentView.frame = CGRectOffset(self.contentView.frame, 0, y - top);
|
|
193
206
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
194
207
|
}
|
|
195
|
-
|
|
208
|
+
|
|
196
209
|
if (translationY < 0 && top > self.minY) {
|
|
197
210
|
//向上拖
|
|
198
211
|
CGFloat y = fmax(top + translationY, self.minY);
|
|
@@ -200,7 +213,7 @@
|
|
|
200
213
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
201
214
|
}
|
|
202
215
|
}
|
|
203
|
-
|
|
216
|
+
|
|
204
217
|
// 没有嵌套滚动
|
|
205
218
|
if (!self.target) {
|
|
206
219
|
if(translationY > 0 && top < self.maxY) {
|
|
@@ -209,7 +222,7 @@
|
|
|
209
222
|
self.contentView.frame = CGRectOffset(self.contentView.frame, 0, y - top);
|
|
210
223
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
211
224
|
}
|
|
212
|
-
|
|
225
|
+
|
|
213
226
|
if (translationY < 0 && top > self.minY) {
|
|
214
227
|
//向上拖
|
|
215
228
|
CGFloat y = fmax(top + translationY, self.minY);
|
|
@@ -217,7 +230,7 @@
|
|
|
217
230
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
218
231
|
}
|
|
219
232
|
}
|
|
220
|
-
|
|
233
|
+
|
|
221
234
|
if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateCancelled) {
|
|
222
235
|
// RCTLogInfo(@"velocity:%f", [pan velocityInView:self.contentView].y);
|
|
223
236
|
CGFloat velocity = [pan velocityInView:self.contentView].y;
|
|
@@ -226,7 +239,7 @@
|
|
|
226
239
|
//如果是类似轻扫的那种
|
|
227
240
|
[self settleToState:RNBottomSheetStateCollapsed withFling:YES];
|
|
228
241
|
}
|
|
229
|
-
|
|
242
|
+
|
|
230
243
|
if (!self.target) {
|
|
231
244
|
//如果是类似轻扫的那种
|
|
232
245
|
[self settleToState:RNBottomSheetStateCollapsed withFling:YES];
|
|
@@ -250,18 +263,18 @@
|
|
|
250
263
|
_nextReturn = false;
|
|
251
264
|
return;
|
|
252
265
|
}
|
|
253
|
-
|
|
266
|
+
|
|
254
267
|
if (![keyPath isEqualToString:@"contentOffset"]) {
|
|
255
268
|
return;
|
|
256
269
|
}
|
|
257
|
-
|
|
270
|
+
|
|
258
271
|
CGFloat new = [change[@"new"] CGPointValue].y;
|
|
259
272
|
CGFloat old = [change[@"old"] CGPointValue].y;
|
|
260
273
|
|
|
261
274
|
if (new == old) {
|
|
262
275
|
return;
|
|
263
276
|
}
|
|
264
|
-
|
|
277
|
+
|
|
265
278
|
CGFloat dy = old - new;
|
|
266
279
|
|
|
267
280
|
if (dy > 0) {
|
|
@@ -271,7 +284,7 @@
|
|
|
271
284
|
target.contentOffset = CGPointMake(0, 0);
|
|
272
285
|
}
|
|
273
286
|
}
|
|
274
|
-
|
|
287
|
+
|
|
275
288
|
if (dy < 0) {
|
|
276
289
|
//向上
|
|
277
290
|
if (self.contentView.frame.origin.y > self.minY) {
|
|
@@ -292,20 +305,21 @@
|
|
|
292
305
|
}
|
|
293
306
|
|
|
294
307
|
- (void)setState:(RNBottomSheetState)state {
|
|
295
|
-
if (
|
|
308
|
+
if (_isInitialRender) {
|
|
309
|
+
self.finalState = state;
|
|
296
310
|
return;
|
|
297
311
|
}
|
|
298
312
|
|
|
299
|
-
if (self.
|
|
300
|
-
[self.layer removeAllAnimations];
|
|
313
|
+
if (self.finalState == state) {
|
|
301
314
|
return;
|
|
302
315
|
}
|
|
303
|
-
|
|
304
|
-
if (
|
|
305
|
-
[self setStateInternal:state];
|
|
316
|
+
|
|
317
|
+
if (_state == RNBottomSheetStateSettling) {
|
|
306
318
|
return;
|
|
307
319
|
}
|
|
308
|
-
|
|
320
|
+
|
|
321
|
+
self.finalState = state;
|
|
322
|
+
|
|
309
323
|
[self settleToState:state withFling:YES];
|
|
310
324
|
}
|
|
311
325
|
|
|
@@ -339,19 +353,19 @@
|
|
|
339
353
|
return;
|
|
340
354
|
}
|
|
341
355
|
_state = state;
|
|
342
|
-
|
|
356
|
+
|
|
343
357
|
if (state == RNBottomSheetStateExpanded) {
|
|
344
358
|
[self dispatchOnSlide:self.minY];
|
|
345
359
|
}
|
|
346
|
-
|
|
360
|
+
|
|
347
361
|
if (state == RNBottomSheetStateHidden) {
|
|
348
362
|
[self dispatchOnSlide:self.frame.size.height];
|
|
349
363
|
}
|
|
350
|
-
|
|
364
|
+
|
|
351
365
|
if (state == RNBottomSheetStateCollapsed) {
|
|
352
366
|
[self dispatchOnSlide:self.maxY];
|
|
353
367
|
}
|
|
354
|
-
|
|
368
|
+
|
|
355
369
|
if (state == RNBottomSheetStateCollapsed || state == RNBottomSheetStateExpanded || state == RNBottomSheetStateHidden) {
|
|
356
370
|
[self.eventDispatcher sendEvent:[[RNBottomSheetStateChangedEvent alloc] initWithViewTag:self.reactTag state:state]];
|
|
357
371
|
}
|
|
@@ -383,5 +397,5 @@
|
|
|
383
397
|
CGFloat top = [self.contentView.layer presentationLayer].frame.origin.y;
|
|
384
398
|
[self dispatchOnSlide:top];
|
|
385
399
|
}
|
|
386
|
-
|
|
400
|
+
|
|
387
401
|
@end
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sdcx/bottom-sheet",
|
|
3
3
|
"description": "A react-native BottomSheet component.",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"main": "./
|
|
6
|
-
"typings": "./
|
|
4
|
+
"version": "0.16.0",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"typings": "./dist/index.d.ts",
|
|
7
7
|
"react-native": "src/index",
|
|
8
8
|
"nativePackage": true,
|
|
9
9
|
"files": [
|
|
10
10
|
"src",
|
|
11
|
-
"
|
|
11
|
+
"dist",
|
|
12
12
|
"android",
|
|
13
13
|
"ios",
|
|
14
14
|
"docs",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"bottom-sheet"
|
|
27
27
|
],
|
|
28
28
|
"scripts": {
|
|
29
|
-
"build": "rm -rf ./
|
|
29
|
+
"build": "rm -rf ./dist && tsc -p tsconfig.json",
|
|
30
30
|
"prepare": "npm run build",
|
|
31
31
|
"tsc": "tsc",
|
|
32
32
|
"test": "jest",
|
|
@@ -36,32 +36,5 @@
|
|
|
36
36
|
"react": ">=16.8",
|
|
37
37
|
"react-native": ">=0.60"
|
|
38
38
|
},
|
|
39
|
-
"devDependencies": {
|
|
40
|
-
"@babel/core": "^7.13.10",
|
|
41
|
-
"@babel/runtime": "^7.13.10",
|
|
42
|
-
"@react-native-community/eslint-config": "^3.0.0",
|
|
43
|
-
"@types/jest": "^27.0.1",
|
|
44
|
-
"@types/react": "^17.0.2",
|
|
45
|
-
"@types/react-native": "^0.67.0",
|
|
46
|
-
"@types/react-test-renderer": "17.0.2",
|
|
47
|
-
"babel-jest": "^27.0.6",
|
|
48
|
-
"jest": "^27.0.6",
|
|
49
|
-
"metro-react-native-babel-preset": "^0.66.2",
|
|
50
|
-
"react": "17.0.2",
|
|
51
|
-
"react-native": "^0.67.4",
|
|
52
|
-
"react-test-renderer": "17.0.2",
|
|
53
|
-
"eslint": "^7.32.0",
|
|
54
|
-
"typescript": "^4.6.4"
|
|
55
|
-
},
|
|
56
|
-
"jest": {
|
|
57
|
-
"preset": "react-native",
|
|
58
|
-
"moduleFileExtensions": [
|
|
59
|
-
"ts",
|
|
60
|
-
"tsx",
|
|
61
|
-
"js",
|
|
62
|
-
"jsx",
|
|
63
|
-
"json",
|
|
64
|
-
"node"
|
|
65
|
-
]
|
|
66
|
-
}
|
|
39
|
+
"devDependencies": {}
|
|
67
40
|
}
|
package/src/index.tsx
CHANGED
|
@@ -1,36 +1,42 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
NativeSyntheticEvent,
|
|
4
|
+
requireNativeComponent,
|
|
5
|
+
StyleSheet,
|
|
6
|
+
View,
|
|
7
|
+
ViewProps,
|
|
8
|
+
} from 'react-native';
|
|
9
|
+
import splitLayoutProps from './splitLayoutProps';
|
|
4
10
|
|
|
5
11
|
export interface OffsetChangedEventData {
|
|
6
|
-
progress: number
|
|
7
|
-
offset: number
|
|
8
|
-
expandedOffset: number
|
|
9
|
-
collapsedOffset: number
|
|
12
|
+
progress: number;
|
|
13
|
+
offset: number;
|
|
14
|
+
expandedOffset: number;
|
|
15
|
+
collapsedOffset: number;
|
|
10
16
|
}
|
|
11
17
|
|
|
12
|
-
export type BottomSheetState = 'collapsed' | 'expanded' | 'hidden'
|
|
18
|
+
export type BottomSheetState = 'collapsed' | 'expanded' | 'hidden';
|
|
13
19
|
|
|
14
20
|
export interface StateChangedEventData {
|
|
15
|
-
state: BottomSheetState
|
|
21
|
+
state: BottomSheetState;
|
|
16
22
|
}
|
|
17
23
|
|
|
18
24
|
interface NativeBottomSheetProps extends ViewProps {
|
|
19
|
-
onSlide?: (event: NativeSyntheticEvent<OffsetChangedEventData>) => void
|
|
20
|
-
onStateChanged?: (event: NativeSyntheticEvent<StateChangedEventData>) => void
|
|
21
|
-
peekHeight?: number
|
|
22
|
-
draggable?: boolean
|
|
23
|
-
state?: BottomSheetState
|
|
24
|
-
contentContainerStyle?: ViewProps['style']
|
|
25
|
+
onSlide?: (event: NativeSyntheticEvent<OffsetChangedEventData>) => void;
|
|
26
|
+
onStateChanged?: (event: NativeSyntheticEvent<StateChangedEventData>) => void;
|
|
27
|
+
peekHeight?: number;
|
|
28
|
+
draggable?: boolean;
|
|
29
|
+
state?: BottomSheetState;
|
|
30
|
+
contentContainerStyle?: ViewProps['style'];
|
|
25
31
|
}
|
|
26
32
|
|
|
27
33
|
type BottomSheetProps = NativeBottomSheetProps & {
|
|
28
|
-
fitToContents?: boolean
|
|
29
|
-
}
|
|
34
|
+
fitToContents?: boolean;
|
|
35
|
+
};
|
|
30
36
|
|
|
31
|
-
const NativeBottomSheet = requireNativeComponent<NativeBottomSheetProps>('BottomSheet')
|
|
37
|
+
const NativeBottomSheet = requireNativeComponent<NativeBottomSheetProps>('BottomSheet');
|
|
32
38
|
|
|
33
|
-
type NativeBottomSheetInstance = InstanceType<typeof NativeBottomSheet
|
|
39
|
+
type NativeBottomSheetInstance = InstanceType<typeof NativeBottomSheet>;
|
|
34
40
|
|
|
35
41
|
const BottomSheet = React.forwardRef<NativeBottomSheetInstance, BottomSheetProps>((props, ref) => {
|
|
36
42
|
const {
|
|
@@ -42,8 +48,8 @@ const BottomSheet = React.forwardRef<NativeBottomSheetInstance, BottomSheetProps
|
|
|
42
48
|
state = 'collapsed',
|
|
43
49
|
fitToContents,
|
|
44
50
|
...rest
|
|
45
|
-
} = props
|
|
46
|
-
const {
|
|
51
|
+
} = props;
|
|
52
|
+
const {outer, inner} = splitLayoutProps(StyleSheet.flatten(style));
|
|
47
53
|
return (
|
|
48
54
|
<NativeBottomSheet
|
|
49
55
|
style={[StyleSheet.absoluteFill, outer]}
|
|
@@ -53,13 +59,17 @@ const BottomSheet = React.forwardRef<NativeBottomSheetInstance, BottomSheetProps
|
|
|
53
59
|
{...rest}
|
|
54
60
|
ref={ref}>
|
|
55
61
|
<View
|
|
56
|
-
style={[
|
|
62
|
+
style={[
|
|
63
|
+
fitToContents ? styles.fitToContents : StyleSheet.absoluteFill,
|
|
64
|
+
inner,
|
|
65
|
+
contentContainerStyle,
|
|
66
|
+
]}
|
|
57
67
|
collapsable={false}>
|
|
58
68
|
{children}
|
|
59
69
|
</View>
|
|
60
70
|
</NativeBottomSheet>
|
|
61
|
-
)
|
|
62
|
-
})
|
|
71
|
+
);
|
|
72
|
+
});
|
|
63
73
|
|
|
64
74
|
const styles = StyleSheet.create({
|
|
65
75
|
fitToContents: {
|
|
@@ -68,6 +78,6 @@ const styles = StyleSheet.create({
|
|
|
68
78
|
right: 0,
|
|
69
79
|
bottom: 0,
|
|
70
80
|
},
|
|
71
|
-
})
|
|
81
|
+
});
|
|
72
82
|
|
|
73
|
-
export default BottomSheet
|
|
83
|
+
export default BottomSheet;
|
package/src/splitLayoutProps.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {ViewStyle} from 'react-native';
|
|
2
2
|
|
|
3
|
-
type StyleKey = keyof ViewStyle
|
|
3
|
+
type StyleKey = keyof ViewStyle;
|
|
4
4
|
|
|
5
5
|
export default function splitLayoutProps(props?: ViewStyle) {
|
|
6
|
-
let outer: {
|
|
7
|
-
let inner: {
|
|
6
|
+
let outer: {[key: string]: ViewStyle[StyleKey]} = {};
|
|
7
|
+
let inner: {[key: string]: ViewStyle[StyleKey]} = {};
|
|
8
8
|
|
|
9
9
|
if (props != null) {
|
|
10
10
|
for (const prop of Object.keys(props) as StyleKey[]) {
|
|
@@ -34,14 +34,14 @@ export default function splitLayoutProps(props?: ViewStyle) {
|
|
|
34
34
|
case 'top':
|
|
35
35
|
case 'transform':
|
|
36
36
|
case 'zIndex':
|
|
37
|
-
outer[prop] = props[prop]
|
|
38
|
-
break
|
|
37
|
+
outer[prop] = props[prop];
|
|
38
|
+
break;
|
|
39
39
|
default:
|
|
40
|
-
inner[prop] = props[prop]
|
|
41
|
-
break
|
|
40
|
+
inner[prop] = props[prop];
|
|
41
|
+
break;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
return {
|
|
46
|
+
return {outer, inner};
|
|
47
47
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ViewStyle } from 'react-native';
|
|
2
|
-
export default function splitLayoutProps(props?: ViewStyle): {
|
|
3
|
-
outer: {
|
|
4
|
-
[key: string]: string | number | import("react-native").OpaqueColorValue | {
|
|
5
|
-
width: number;
|
|
6
|
-
height: number;
|
|
7
|
-
} | (import("react-native").PerpectiveTransform | import("react-native").RotateTransform | import("react-native").RotateXTransform | import("react-native").RotateYTransform | import("react-native").RotateZTransform | import("react-native").ScaleTransform | import("react-native").ScaleXTransform | import("react-native").ScaleYTransform | import("react-native").TranslateXTransform | import("react-native").TranslateYTransform | import("react-native").SkewXTransform | import("react-native").SkewYTransform | import("react-native").MatrixTransform)[] | number[] | undefined;
|
|
8
|
-
};
|
|
9
|
-
inner: {
|
|
10
|
-
[key: string]: string | number | import("react-native").OpaqueColorValue | {
|
|
11
|
-
width: number;
|
|
12
|
-
height: number;
|
|
13
|
-
} | (import("react-native").PerpectiveTransform | import("react-native").RotateTransform | import("react-native").RotateXTransform | import("react-native").RotateYTransform | import("react-native").RotateZTransform | import("react-native").ScaleTransform | import("react-native").ScaleXTransform | import("react-native").ScaleYTransform | import("react-native").TranslateXTransform | import("react-native").TranslateYTransform | import("react-native").SkewXTransform | import("react-native").SkewYTransform | import("react-native").MatrixTransform)[] | number[] | undefined;
|
|
14
|
-
};
|
|
15
|
-
};
|
|
File without changes
|