@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 http://www.sdcx.tech
3
+ Copyright (c) 2025 listenzz@163.com
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -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 == this.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;
@@ -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> & Readonly<import("react-native").NativeMethods>>>;
23
+ } & React.RefAttributes<React.Component<NativeBottomSheetProps, {}, any> & import("react-native").NativeMethods>>;
24
24
  export default BottomSheet;
@@ -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={[fitToContents ? styles.fitToContents : StyleSheet.absoluteFill, inner, contentContainerStyle]} collapsable={false}>
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 (_state == state) {
308
+ if (_isInitialRender) {
309
+ self.finalState = state;
296
310
  return;
297
311
  }
298
312
 
299
- if (self.state == RNBottomSheetStateSettling) {
300
- [self.layer removeAllAnimations];
313
+ if (self.finalState == state) {
301
314
  return;
302
315
  }
303
-
304
- if (CGRectEqualToRect(self.contentView.frame, CGRectZero)) {
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.14.0",
5
- "main": "./lib/index.js",
6
- "typings": "./lib/index.d.ts",
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
- "lib",
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 ./lib && tsc -p tsconfig.build.json",
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 { NativeSyntheticEvent, requireNativeComponent, StyleSheet, View, ViewProps } from 'react-native'
3
- import splitLayoutProps from './splitLayoutProps'
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 { outer, inner } = splitLayoutProps(StyleSheet.flatten(style))
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={[fitToContents ? styles.fitToContents : StyleSheet.absoluteFill, inner, contentContainerStyle]}
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;
@@ -1,10 +1,10 @@
1
- import { ViewStyle } from 'react-native'
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: { [key: string]: ViewStyle[StyleKey] } = {}
7
- let inner: { [key: string]: ViewStyle[StyleKey] } = {}
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 { outer, inner }
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