@sdcx/bottom-sheet 0.15.0 → 0.17.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 +14 -14
- 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 +17 -7
- 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,7 @@ 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
167
|
return;
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -182,7 +182,7 @@ public class BottomSheet extends ReactViewGroup implements NestedScrollingParent
|
|
|
182
182
|
View findScrollingChild(View view) {
|
|
183
183
|
if (ViewCompat.isNestedScrollingEnabled(view)) {
|
|
184
184
|
if (!view.canScrollHorizontally(1) && !view.canScrollHorizontally(-1) &&
|
|
185
|
-
|
|
185
|
+
(view.canScrollVertically(-1) || view.canScrollVertically(1))) {
|
|
186
186
|
return view;
|
|
187
187
|
}
|
|
188
188
|
}
|
|
@@ -255,7 +255,7 @@ public class BottomSheet extends ReactViewGroup implements NestedScrollingParent
|
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
ignoreEvents = activePointerId == MotionEvent.INVALID_POINTER_ID
|
|
258
|
-
|
|
258
|
+
&& !isPointInChildBounds(contentView, initialX, initialY);
|
|
259
259
|
break;
|
|
260
260
|
default: // fall out
|
|
261
261
|
}
|
|
@@ -269,12 +269,12 @@ public class BottomSheet extends ReactViewGroup implements NestedScrollingParent
|
|
|
269
269
|
// happening over the scrolling content as nested scrolling logic handles that case.
|
|
270
270
|
View scroll = nestedScrollingChildRef != null ? nestedScrollingChildRef.get() : null;
|
|
271
271
|
return action == MotionEvent.ACTION_MOVE
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
272
|
+
&& scroll != null
|
|
273
|
+
&& !ignoreEvents
|
|
274
|
+
&& state != DRAGGING
|
|
275
|
+
&& !isPointInChildBounds(scroll, (int) event.getX(), (int) event.getY())
|
|
276
|
+
&& viewDragHelper != null
|
|
277
|
+
&& Math.abs(initialY - event.getY()) > viewDragHelper.getTouchSlop();
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
@Override
|
|
@@ -282,7 +282,7 @@ public class BottomSheet extends ReactViewGroup implements NestedScrollingParent
|
|
|
282
282
|
if (!draggable) {
|
|
283
283
|
return false;
|
|
284
284
|
}
|
|
285
|
-
|
|
285
|
+
|
|
286
286
|
int action = event.getActionMasked();
|
|
287
287
|
if (state == DRAGGING && action == MotionEvent.ACTION_DOWN) {
|
|
288
288
|
return true;
|
|
@@ -547,10 +547,10 @@ public class BottomSheet extends ReactViewGroup implements NestedScrollingParent
|
|
|
547
547
|
|
|
548
548
|
void startSettlingAnimation(View child, BottomSheetState state, int top, boolean settleFromViewDragHelper) {
|
|
549
549
|
boolean startedSettling =
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
550
|
+
viewDragHelper != null
|
|
551
|
+
&& (settleFromViewDragHelper
|
|
552
|
+
? viewDragHelper.settleCapturedViewAt(child.getLeft(), top)
|
|
553
|
+
: viewDragHelper.smoothSlideViewTo(child, child.getLeft(), top));
|
|
554
554
|
if (startedSettling) {
|
|
555
555
|
setStateInternal(SETTLING);
|
|
556
556
|
// STATE_SETTLING won't animate the material shape, so do that here with the target state.
|
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
|
+
};
|
|
@@ -24,10 +24,12 @@
|
|
|
24
24
|
|
|
25
25
|
@property(nonatomic, assign) RNBottomSheetState finalState;
|
|
26
26
|
|
|
27
|
+
@property(nonatomic, strong) UIViewPropertyAnimator *animator;
|
|
28
|
+
|
|
27
29
|
@end
|
|
28
30
|
|
|
29
31
|
@implementation RNBottomSheet {
|
|
30
|
-
__weak
|
|
32
|
+
__weak UIView *_rootView;
|
|
31
33
|
BOOL _isInitialRender;
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -315,7 +317,7 @@
|
|
|
315
317
|
}
|
|
316
318
|
|
|
317
319
|
self.finalState = state;
|
|
318
|
-
|
|
320
|
+
|
|
319
321
|
[self settleToState:state withFling:YES];
|
|
320
322
|
}
|
|
321
323
|
|
|
@@ -333,14 +335,22 @@
|
|
|
333
335
|
self.target.pagingEnabled = YES;
|
|
334
336
|
[self setStateInternal:RNBottomSheetStateSettling];
|
|
335
337
|
[self startWatchBottomSheetTransition];
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
338
|
+
|
|
339
|
+
if (self.animator) {
|
|
340
|
+
[self.animator stopAnimation:YES];
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseOut;
|
|
344
|
+
|
|
345
|
+
self.animator = [UIViewPropertyAnimator runningPropertyAnimatorWithDuration:0.3 delay:0 options:options animations:^{
|
|
339
346
|
self.contentView.frame = CGRectOffset(self.contentView.frame, 0, top - self.contentView.frame.origin.y);
|
|
340
|
-
} completion:^(
|
|
347
|
+
} completion:^(UIViewAnimatingPosition finalPosition) {
|
|
341
348
|
self.target.pagingEnabled = NO;
|
|
349
|
+
self.animator = nil;
|
|
342
350
|
[self stopWatchBottomSheetTransition];
|
|
343
|
-
|
|
351
|
+
if (self.finalState == state) {
|
|
352
|
+
[self setStateInternal:state];
|
|
353
|
+
}
|
|
344
354
|
}];
|
|
345
355
|
}
|
|
346
356
|
|
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.17.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
|