@sdcx/bottom-sheet 0.15.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 +30 -26
- 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
|
+
};
|
|
@@ -80,14 +80,14 @@
|
|
|
80
80
|
if (gestureRecognizer != self.panGestureRecognizer) {
|
|
81
81
|
return YES;
|
|
82
82
|
}
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
if (self.target) {
|
|
85
85
|
[self.target removeObserver:self forKeyPath:@"contentOffset"];
|
|
86
86
|
}
|
|
87
87
|
self.target = nil;
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
UIView *touchView = touch.view;
|
|
90
|
-
|
|
90
|
+
|
|
91
91
|
while (touchView != nil && [touchView isDescendantOfView:self]) {
|
|
92
92
|
if ([touchView isKindOfClass:[UIScrollView class]]) {
|
|
93
93
|
UIScrollView *scrollView = (UIScrollView *)touchView;
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
if (!self.contentView) {
|
|
156
156
|
return;
|
|
157
157
|
}
|
|
158
|
-
|
|
158
|
+
|
|
159
159
|
if (!CGRectEqualToRect(self.contentView.frame, CGRectZero)) {
|
|
160
160
|
[self calculateOffset];
|
|
161
161
|
if (self.state == RNBottomSheetStateCollapsed) {
|
|
@@ -167,12 +167,12 @@
|
|
|
167
167
|
}
|
|
168
168
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
169
169
|
}
|
|
170
|
-
|
|
170
|
+
|
|
171
171
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
172
172
|
if (self.finalState == RNBottomSheetStateExpanded && self->_isInitialRender) {
|
|
173
173
|
[self settleToState:self.finalState withFling:YES];
|
|
174
174
|
}
|
|
175
|
-
|
|
175
|
+
|
|
176
176
|
self->_isInitialRender = NO;
|
|
177
177
|
});
|
|
178
178
|
}
|
|
@@ -187,16 +187,16 @@
|
|
|
187
187
|
if (!self.draggable || self.state == RNBottomSheetStateSettling) {
|
|
188
188
|
return;
|
|
189
189
|
}
|
|
190
|
-
|
|
190
|
+
|
|
191
191
|
CGFloat translationY = [pan translationInView:self.contentView].y;
|
|
192
192
|
[pan setTranslation:CGPointZero inView:self.contentView];
|
|
193
|
-
|
|
193
|
+
|
|
194
194
|
CGFloat top = self.contentView.frame.origin.y;
|
|
195
|
-
|
|
195
|
+
|
|
196
196
|
if (pan.state == UIGestureRecognizerStateChanged) {
|
|
197
197
|
[self setStateInternal:RNBottomSheetStateDragging];
|
|
198
198
|
}
|
|
199
|
-
|
|
199
|
+
|
|
200
200
|
// 如果有嵌套滚动
|
|
201
201
|
if (self.target) {
|
|
202
202
|
if(translationY > 0 && top < self.maxY && self.target.contentOffset.y <= 0) {
|
|
@@ -205,7 +205,7 @@
|
|
|
205
205
|
self.contentView.frame = CGRectOffset(self.contentView.frame, 0, y - top);
|
|
206
206
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
207
207
|
}
|
|
208
|
-
|
|
208
|
+
|
|
209
209
|
if (translationY < 0 && top > self.minY) {
|
|
210
210
|
//向上拖
|
|
211
211
|
CGFloat y = fmax(top + translationY, self.minY);
|
|
@@ -213,7 +213,7 @@
|
|
|
213
213
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
|
-
|
|
216
|
+
|
|
217
217
|
// 没有嵌套滚动
|
|
218
218
|
if (!self.target) {
|
|
219
219
|
if(translationY > 0 && top < self.maxY) {
|
|
@@ -222,7 +222,7 @@
|
|
|
222
222
|
self.contentView.frame = CGRectOffset(self.contentView.frame, 0, y - top);
|
|
223
223
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
224
224
|
}
|
|
225
|
-
|
|
225
|
+
|
|
226
226
|
if (translationY < 0 && top > self.minY) {
|
|
227
227
|
//向上拖
|
|
228
228
|
CGFloat y = fmax(top + translationY, self.minY);
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
[self dispatchOnSlide:self.contentView.frame.origin.y];
|
|
231
231
|
}
|
|
232
232
|
}
|
|
233
|
-
|
|
233
|
+
|
|
234
234
|
if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateCancelled) {
|
|
235
235
|
// RCTLogInfo(@"velocity:%f", [pan velocityInView:self.contentView].y);
|
|
236
236
|
CGFloat velocity = [pan velocityInView:self.contentView].y;
|
|
@@ -239,7 +239,7 @@
|
|
|
239
239
|
//如果是类似轻扫的那种
|
|
240
240
|
[self settleToState:RNBottomSheetStateCollapsed withFling:YES];
|
|
241
241
|
}
|
|
242
|
-
|
|
242
|
+
|
|
243
243
|
if (!self.target) {
|
|
244
244
|
//如果是类似轻扫的那种
|
|
245
245
|
[self settleToState:RNBottomSheetStateCollapsed withFling:YES];
|
|
@@ -263,18 +263,18 @@
|
|
|
263
263
|
_nextReturn = false;
|
|
264
264
|
return;
|
|
265
265
|
}
|
|
266
|
-
|
|
266
|
+
|
|
267
267
|
if (![keyPath isEqualToString:@"contentOffset"]) {
|
|
268
268
|
return;
|
|
269
269
|
}
|
|
270
|
-
|
|
270
|
+
|
|
271
271
|
CGFloat new = [change[@"new"] CGPointValue].y;
|
|
272
272
|
CGFloat old = [change[@"old"] CGPointValue].y;
|
|
273
273
|
|
|
274
274
|
if (new == old) {
|
|
275
275
|
return;
|
|
276
276
|
}
|
|
277
|
-
|
|
277
|
+
|
|
278
278
|
CGFloat dy = old - new;
|
|
279
279
|
|
|
280
280
|
if (dy > 0) {
|
|
@@ -284,7 +284,7 @@
|
|
|
284
284
|
target.contentOffset = CGPointMake(0, 0);
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
|
-
|
|
287
|
+
|
|
288
288
|
if (dy < 0) {
|
|
289
289
|
//向上
|
|
290
290
|
if (self.contentView.frame.origin.y > self.minY) {
|
|
@@ -309,11 +309,15 @@
|
|
|
309
309
|
self.finalState = state;
|
|
310
310
|
return;
|
|
311
311
|
}
|
|
312
|
-
|
|
312
|
+
|
|
313
313
|
if (self.finalState == state) {
|
|
314
314
|
return;
|
|
315
315
|
}
|
|
316
|
-
|
|
316
|
+
|
|
317
|
+
if (_state == RNBottomSheetStateSettling) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
317
321
|
self.finalState = state;
|
|
318
322
|
|
|
319
323
|
[self settleToState:state withFling:YES];
|
|
@@ -349,19 +353,19 @@
|
|
|
349
353
|
return;
|
|
350
354
|
}
|
|
351
355
|
_state = state;
|
|
352
|
-
|
|
356
|
+
|
|
353
357
|
if (state == RNBottomSheetStateExpanded) {
|
|
354
358
|
[self dispatchOnSlide:self.minY];
|
|
355
359
|
}
|
|
356
|
-
|
|
360
|
+
|
|
357
361
|
if (state == RNBottomSheetStateHidden) {
|
|
358
362
|
[self dispatchOnSlide:self.frame.size.height];
|
|
359
363
|
}
|
|
360
|
-
|
|
364
|
+
|
|
361
365
|
if (state == RNBottomSheetStateCollapsed) {
|
|
362
366
|
[self dispatchOnSlide:self.maxY];
|
|
363
367
|
}
|
|
364
|
-
|
|
368
|
+
|
|
365
369
|
if (state == RNBottomSheetStateCollapsed || state == RNBottomSheetStateExpanded || state == RNBottomSheetStateHidden) {
|
|
366
370
|
[self.eventDispatcher sendEvent:[[RNBottomSheetStateChangedEvent alloc] initWithViewTag:self.reactTag state:state]];
|
|
367
371
|
}
|
|
@@ -393,5 +397,5 @@
|
|
|
393
397
|
CGFloat top = [self.contentView.layer presentationLayer].frame.origin.y;
|
|
394
398
|
[self dispatchOnSlide:top];
|
|
395
399
|
}
|
|
396
|
-
|
|
400
|
+
|
|
397
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
|