@lodev09/react-native-true-sheet 4.0.0-beta.28 → 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.
@@ -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.28",
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",