@lodev09/react-native-true-sheet 4.0.0-beta.27 → 4.0.0-beta.29

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.
@@ -77,6 +77,9 @@ static char TrueSheetAccessibilityWindowPreviousElementsKey;
77
77
  @implementation TrueSheetViewController {
78
78
  TrueSheetPositionState _lastEmittedPositionState;
79
79
  CGSize _lastReportedSize;
80
+ // Net of the footer's baked-in inset, snapshotted together: the inset updates
81
+ // with the footer's layout, but a size change mid-present is deferred to
82
+ // didPresent, so subtracting it live pairs a new inset with a stale height.
80
83
  CGFloat _autoDetentHeight;
81
84
  CGFloat _peekDetentHeight;
82
85
  NSInteger _pendingDetentIndex;
@@ -1576,8 +1579,8 @@ static BOOL TrueSheetIsPhoneIdiom(void) {
1576
1579
  */
1577
1580
  - (void)setupSheetDetentsForSizeChange {
1578
1581
  if (@available(iOS 16.0, *)) {
1579
- CGFloat autoHeight = [_detentCalculator autoHeightForKeyboardHeight:_keyboardHeight];
1580
- CGFloat peekHeight = [_detentCalculator peekHeight];
1582
+ CGFloat autoHeight = [_detentCalculator autoHeightForKeyboardHeight:_keyboardHeight] - [self autoDetentBottomInset];
1583
+ CGFloat peekHeight = [_detentCalculator peekHeight] - [self peekDetentBottomInset];
1581
1584
 
1582
1585
  if (fabs(autoHeight - _autoDetentHeight) < 0.5 && fabs(peekHeight - _peekDetentHeight) < 0.5) {
1583
1586
  return;
@@ -1617,8 +1620,8 @@ static BOOL TrueSheetIsPhoneIdiom(void) {
1617
1620
  [_detentCalculator clearResolvedHeights];
1618
1621
  _hingeCorrections = 0;
1619
1622
 
1620
- _autoDetentHeight = [_detentCalculator autoHeightForKeyboardHeight:_keyboardHeight];
1621
- _peekDetentHeight = [_detentCalculator peekHeight];
1623
+ _autoDetentHeight = [_detentCalculator autoHeightForKeyboardHeight:_keyboardHeight] - [self autoDetentBottomInset];
1624
+ _peekDetentHeight = [_detentCalculator peekHeight] - [self peekDetentBottomInset];
1622
1625
 
1623
1626
  for (NSInteger index = 0; index < self.detents.count; index++) {
1624
1627
  id detent = self.detents[index];
@@ -1681,7 +1684,7 @@ static BOOL TrueSheetIsPhoneIdiom(void) {
1681
1684
  return [self customDetentWithIdentifier:@"custom-auto"
1682
1685
  atIndex:index
1683
1686
  heightBlock:^CGFloat {
1684
- return self->_autoDetentHeight - [self autoDetentBottomInset];
1687
+ return self->_autoDetentHeight;
1685
1688
  }];
1686
1689
  } else {
1687
1690
  return [UISheetPresentationControllerDetent mediumDetent];
@@ -1693,7 +1696,7 @@ static BOOL TrueSheetIsPhoneIdiom(void) {
1693
1696
  return [self customDetentWithIdentifier:@"custom-peek"
1694
1697
  atIndex:index
1695
1698
  heightBlock:^CGFloat {
1696
- return self->_peekDetentHeight - [self peekDetentBottomInset];
1699
+ return self->_peekDetentHeight;
1697
1700
  }];
1698
1701
  } else {
1699
1702
  return [UISheetPresentationControllerDetent mediumDetent];
@@ -22,8 +22,7 @@ using namespace facebook::react;
22
22
  NSInteger _presenterScreenTag;
23
23
  NSMutableSet<NSNumber *> *_screenTags;
24
24
  __weak UIViewController *_presenterScreenController;
25
- __weak UIViewController *_parentScreenController;
26
- __weak UIWindow *_window;
25
+ NSHashTable<UIViewController *> *_parentScreenControllers;
27
26
  BOOL _dismissedByNavigation;
28
27
  BOOL _pendingInteractiveDismiss;
29
28
  BOOL _pendingInteractiveAppear;
@@ -39,8 +38,7 @@ using namespace facebook::react;
39
38
  _presenterScreenTag = 0;
40
39
  _screenTags = [NSMutableSet new];
41
40
  _presenterScreenController = nil;
42
- _parentScreenController = nil;
43
- _window = nil;
41
+ _parentScreenControllers = [NSHashTable weakObjectsHashTable];
44
42
  }
45
43
  return self;
46
44
  }
@@ -143,8 +141,7 @@ using namespace facebook::react;
143
141
  _presenterScreenTag = 0;
144
142
  [_screenTags removeAllObjects];
145
143
  _presenterScreenController = nil;
146
- _parentScreenController = nil;
147
- _window = view.window;
144
+ [_parentScreenControllers removeAllObjects];
148
145
 
149
146
  Class screenViewClass = NSClassFromString(@"RNSScreenView");
150
147
  if (!screenViewClass)
@@ -165,8 +162,8 @@ using namespace facebook::react;
165
162
  if (!_presenterScreenController) {
166
163
  _presenterScreenTag = current.tag;
167
164
  _presenterScreenController = screenVC;
168
- } else if (!_parentScreenController && screenVC) {
169
- _parentScreenController = screenVC;
165
+ } else if (screenVC) {
166
+ [_parentScreenControllers addObject:screenVC];
170
167
  }
171
168
  }
172
169
  }
@@ -239,27 +236,16 @@ using namespace facebook::react;
239
236
  }
240
237
 
241
238
  - (BOOL)shouldDismissForScreenTag:(NSInteger)screenTag {
242
- // For parent screens (not immediate presenter), check if the presenter screen is being removed
243
- // This handles nested stack removal case
239
+ // For parent screens, dismiss if one was popped or covered in its own stack. The presenter
240
+ // may already be detached (e.g. its nested stack unmounting), so it can't be checked here.
241
+ // Skip if all are still top (e.g. modal dismiss - sheet dismisses naturally)
244
242
  if (screenTag != _presenterScreenTag) {
245
- UINavigationController *parentNav = _parentScreenController.navigationController;
246
-
247
- // Modal case: parent's nav is presented -> let sheet dismiss naturally
248
- // Nested stack case: parent's nav is not presented (embedded) -> need to dismiss
249
- if (parentNav.presentingViewController != nil) {
250
- return NO;
251
- }
252
-
253
- if (!_parentScreenController) {
254
- return NO;
255
- }
256
-
257
- // If presenter view is no longer in window, the nested stack is being removed
258
- UIView *presenterView = [_window viewWithTag:_presenterScreenTag];
259
- if (presenterView == nil || presenterView.window == nil) {
260
- return YES;
243
+ for (UIViewController *screen in _parentScreenControllers) {
244
+ UINavigationController *nav = screen.navigationController;
245
+ if (nav && nav.topViewController != screen) {
246
+ return YES;
247
+ }
261
248
  }
262
-
263
249
  return NO;
264
250
  }
265
251
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodev09/react-native-true-sheet",
3
- "version": "4.0.0-beta.27",
3
+ "version": "4.0.0-beta.29",
4
4
  "description": "The true native bottom sheet experience for your React Native Apps.",
5
5
  "source": "./src/index.ts",
6
6
  "main": "./lib/module/index.js",