react-native-screens 4.11.0-beta.0 → 4.11.0-beta.2

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.
Files changed (74) hide show
  1. package/RNScreens.podspec +3 -1
  2. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +18 -12
  3. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +48 -97
  4. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +4 -124
  5. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetDelegate.kt +2 -2
  6. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetUtils.kt +23 -0
  7. package/android/src/main/java/com/swmansion/rnscreens/stack/anim/ScreensAnimation.kt +18 -0
  8. package/android/src/main/java/com/swmansion/rnscreens/stack/views/ChildDrawingOrderStrategyImpl.kt +48 -0
  9. package/android/src/main/java/com/swmansion/rnscreens/stack/views/ChildrenDrawingOrderStrategy.kt +24 -0
  10. package/android/src/main/java/com/swmansion/rnscreens/stack/views/ScreensCoordinatorLayout.kt +99 -0
  11. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +1 -2
  12. package/ios/RNSConvert.mm +44 -47
  13. package/ios/RNSFullWindowOverlay.h +2 -0
  14. package/ios/RNSFullWindowOverlay.mm +32 -8
  15. package/ios/RNSScreen.mm +20 -34
  16. package/ios/RNSScreenStack.mm +6 -8
  17. package/ios/RNSScreenStackHeaderConfig.mm +120 -223
  18. package/ios/RNSScreenWindowTraits.mm +19 -37
  19. package/ios/RNSSearchBar.mm +15 -24
  20. package/lib/commonjs/components/FullWindowOverlay.js +2 -1
  21. package/lib/commonjs/components/FullWindowOverlay.js.map +1 -1
  22. package/lib/commonjs/components/ScreenContentWrapper.windows.js +10 -0
  23. package/lib/commonjs/components/ScreenContentWrapper.windows.js.map +1 -0
  24. package/lib/commonjs/components/ScreenFooter.windows.js +11 -0
  25. package/lib/commonjs/components/ScreenFooter.windows.js.map +1 -0
  26. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +1 -0
  27. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  28. package/lib/module/components/FullWindowOverlay.js +2 -1
  29. package/lib/module/components/FullWindowOverlay.js.map +1 -1
  30. package/lib/module/components/ScreenContentWrapper.windows.js +4 -0
  31. package/lib/module/components/ScreenContentWrapper.windows.js.map +1 -0
  32. package/lib/module/components/ScreenFooter.windows.js +6 -0
  33. package/lib/module/components/ScreenFooter.windows.js.map +1 -0
  34. package/lib/module/fabric/FullWindowOverlayNativeComponent.js +3 -0
  35. package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
  36. package/lib/typescript/components/FullWindowOverlay.d.ts +4 -2
  37. package/lib/typescript/components/FullWindowOverlay.d.ts.map +1 -1
  38. package/lib/typescript/components/ScreenContentWrapper.windows.d.ts +4 -0
  39. package/lib/typescript/components/ScreenContentWrapper.windows.d.ts.map +1 -0
  40. package/lib/typescript/components/ScreenFooter.windows.d.ts +6 -0
  41. package/lib/typescript/components/ScreenFooter.windows.d.ts.map +1 -0
  42. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts +3 -1
  43. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts.map +1 -1
  44. package/lib/typescript/native-stack/types.d.ts +1 -1
  45. package/lib/typescript/types.d.ts +2 -2
  46. package/native-stack/README.md +2 -2
  47. package/package.json +1 -1
  48. package/src/components/FullWindowOverlay.tsx +14 -3
  49. package/src/components/ScreenContentWrapper.windows.tsx +5 -0
  50. package/src/components/ScreenFooter.windows.tsx +7 -0
  51. package/src/fabric/FullWindowOverlayNativeComponent.ts +5 -1
  52. package/src/native-stack/types.tsx +1 -1
  53. package/src/types.tsx +2 -2
  54. package/windows/RNScreens/ModalScreenViewManager.cpp +22 -0
  55. package/windows/RNScreens/ModalScreenViewManager.h +13 -0
  56. package/windows/RNScreens/RNScreens.vcxproj +11 -1
  57. package/windows/RNScreens/RNScreens.vcxproj.filters +10 -0
  58. package/windows/RNScreens/ReactPackageProvider.cpp +18 -0
  59. package/windows/RNScreens/Screen.cpp +128 -122
  60. package/windows/RNScreens/Screen.h +6 -2
  61. package/windows/RNScreens/ScreenStackHeaderConfig.cpp +25 -1
  62. package/windows/RNScreens/ScreenStackHeaderConfig.h +10 -1
  63. package/windows/RNScreens/ScreenStackHeaderConfigViewManager.cpp +42 -1
  64. package/windows/RNScreens/ScreenStackHeaderConfigViewManager.h +15 -0
  65. package/windows/RNScreens/ScreenStackHeaderSubview.cpp +43 -0
  66. package/windows/RNScreens/ScreenStackHeaderSubview.h +24 -0
  67. package/windows/RNScreens/ScreenStackHeaderSubviewViewManager.cpp +129 -0
  68. package/windows/RNScreens/ScreenStackHeaderSubviewViewManager.h +77 -0
  69. package/windows/RNScreens/ScreenViewManager.cpp +45 -16
  70. package/windows/RNScreens/ScreenViewManager.h +1 -1
  71. package/windows/RNScreens/SearchBar.cpp +19 -0
  72. package/windows/RNScreens/SearchBar.h +14 -0
  73. package/windows/RNScreens/SearchBarViewManager.cpp +88 -0
  74. package/windows/RNScreens/SearchBarViewManager.h +62 -0
@@ -35,7 +35,10 @@
35
35
  namespace react = facebook::react;
36
36
  #endif // RCT_NEW_ARCH_ENABLED
37
37
 
38
- #ifndef RCT_NEW_ARCH_ENABLED
38
+ static constexpr auto DEFAULT_TITLE_FONT_SIZE = @17;
39
+ static constexpr auto DEFAULT_TITLE_LARGE_FONT_SIZE = @34;
40
+
41
+ #if !defined(RCT_NEW_ARCH_ENABLED)
39
42
  // Some RN private method hacking below. Couldn't figure out better way to access image data
40
43
  // of a given RCTImageView. See more comments in the code section processing SubviewTypeBackButton
41
44
  @interface RCTImageView (Private)
@@ -276,96 +279,9 @@ RNS_IGNORE_SUPER_CALL_END
276
279
  + (void)setAnimatedConfig:(UIViewController *)vc withConfig:(RNSScreenStackHeaderConfig *)config
277
280
  {
278
281
  UINavigationBar *navbar = ((UINavigationController *)vc.parentViewController).navigationBar;
279
- // It is workaround for loading custom back icon when transitioning from a screen without header to the screen which
280
- // has one. This action fails when navigating to the screen with header for the second time and loads default back
281
- // button. It looks like changing the tint color of navbar triggers an update of the items belonging to it and it
282
- // seems to load the custom back image so we change the tint color's alpha by a very small amount and then set it to
283
- // the one it should have.
284
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_14_0) && \
285
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0
286
- // it brakes the behavior of `headerRight` in iOS 14, where the bug desribed above seems to be fixed, so we do nothing
287
- // in iOS 14
288
- if (@available(iOS 14.0, *)) {
289
- } else
290
- #endif
291
- {
292
- [navbar setTintColor:[config.color colorWithAlphaComponent:CGColorGetAlpha(config.color.CGColor) - 0.01]];
293
- }
294
282
  [navbar setTintColor:config.color];
295
283
 
296
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
297
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
298
- if (@available(iOS 13.0, *)) {
299
- // font customized on the navigation item level, so nothing to do here
300
- } else
301
- #endif
302
- {
303
- BOOL hideShadow = config.hideShadow;
304
-
305
- if (config.backgroundColor && CGColorGetAlpha(config.backgroundColor.CGColor) == 0.) {
306
- [navbar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
307
- [navbar setBarTintColor:[UIColor clearColor]];
308
- hideShadow = YES;
309
- } else {
310
- [navbar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
311
- [navbar setBarTintColor:config.backgroundColor];
312
- }
313
- [navbar setTranslucent:config.translucent];
314
- [navbar setValue:@(hideShadow ? YES : NO) forKey:@"hidesShadow"];
315
-
316
- if (config.titleFontFamily || config.titleFontSize || config.titleFontWeight || config.titleColor) {
317
- NSMutableDictionary *attrs = [NSMutableDictionary new];
318
-
319
- if (config.titleColor) {
320
- attrs[NSForegroundColorAttributeName] = config.titleColor;
321
- }
322
-
323
- NSString *family = config.titleFontFamily ?: nil;
324
- NSNumber *size = config.titleFontSize ?: @17;
325
- NSString *weight = config.titleFontWeight ?: nil;
326
- if (family || weight) {
327
- attrs[NSFontAttributeName] = [RCTFont updateFont:nil
328
- withFamily:family
329
- size:size
330
- weight:weight
331
- style:nil
332
- variant:nil
333
- scaleMultiplier:1.0];
334
- } else {
335
- attrs[NSFontAttributeName] = [UIFont boldSystemFontOfSize:[size floatValue]];
336
- }
337
- [navbar setTitleTextAttributes:attrs];
338
- }
339
-
340
- #if !TARGET_OS_TV && !TARGET_OS_VISION
341
- if (@available(iOS 11.0, *)) {
342
- if (config.largeTitle &&
343
- (config.largeTitleFontFamily || config.largeTitleFontSize || config.largeTitleFontWeight ||
344
- config.largeTitleColor || config.titleColor)) {
345
- NSMutableDictionary *largeAttrs = [NSMutableDictionary new];
346
- if (config.largeTitleColor || config.titleColor) {
347
- largeAttrs[NSForegroundColorAttributeName] =
348
- config.largeTitleColor ? config.largeTitleColor : config.titleColor;
349
- }
350
- NSString *largeFamily = config.largeTitleFontFamily ?: nil;
351
- NSNumber *largeSize = config.largeTitleFontSize ?: @34;
352
- NSString *largeWeight = config.largeTitleFontWeight ?: nil;
353
- if (largeFamily || largeWeight) {
354
- largeAttrs[NSFontAttributeName] = [RCTFont updateFont:nil
355
- withFamily:largeFamily
356
- size:largeSize
357
- weight:largeWeight
358
- style:nil
359
- variant:nil
360
- scaleMultiplier:1.0];
361
- } else {
362
- largeAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:[largeSize floatValue] weight:UIFontWeightBold];
363
- }
364
- [navbar setLargeTitleTextAttributes:largeAttrs];
365
- }
366
- }
367
- #endif
368
- }
284
+ // font customized on the navigation item level, so nothing to do here
369
285
  }
370
286
 
371
287
  + (void)setTitleAttibutes:(NSDictionary *)attrs forButton:(UIBarButtonItem *)button
@@ -476,8 +392,6 @@ RNS_IGNORE_SUPER_CALL_END
476
392
  }
477
393
  }
478
394
 
479
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
480
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
481
395
  + (UINavigationBarAppearance *)buildAppearance:(UIViewController *)vc
482
396
  withConfig:(RNSScreenStackHeaderConfig *)config API_AVAILABLE(ios(13.0))
483
397
  {
@@ -525,7 +439,7 @@ RNS_IGNORE_SUPER_CALL_END
525
439
  #endif
526
440
 
527
441
  NSString *family = config.titleFontFamily ?: nil;
528
- NSNumber *size = config.titleFontSize ?: @17;
442
+ NSNumber *size = config.titleFontSize ?: DEFAULT_TITLE_FONT_SIZE;
529
443
  NSString *weight = config.titleFontWeight ?: nil;
530
444
  if (family || weight) {
531
445
  attrs[NSFontAttributeName] = [RCTFont updateFont:nil
@@ -553,7 +467,7 @@ RNS_IGNORE_SUPER_CALL_END
553
467
  #endif
554
468
 
555
469
  NSString *largeFamily = config.largeTitleFontFamily ?: nil;
556
- NSNumber *largeSize = config.largeTitleFontSize ?: @34;
470
+ NSNumber *largeSize = config.largeTitleFontSize ?: DEFAULT_TITLE_LARGE_FONT_SIZE;
557
471
  NSString *largeWeight = config.largeTitleFontWeight ?: nil;
558
472
  if (largeFamily || largeWeight) {
559
473
  largeAttrs[NSFontAttributeName] = [RCTFont updateFont:nil
@@ -578,7 +492,6 @@ RNS_IGNORE_SUPER_CALL_END
578
492
  }
579
493
  return appearance;
580
494
  }
581
- #endif // Check for >= iOS 13.0
582
495
 
583
496
  + (void)updateViewController:(UIViewController *)vc
584
497
  withConfig:(RNSScreenStackHeaderConfig *)config
@@ -603,7 +516,7 @@ RNS_IGNORE_SUPER_CALL_END
603
516
  BOOL shouldHide = config == nil || !config.shouldHeaderBeVisible;
604
517
 
605
518
  if (!shouldHide && !config.translucent) {
606
- // when nav bar is not translucent we chage edgesForExtendedLayout to avoid system laying out
519
+ // when nav bar is not translucent we change edgesForExtendedLayout to avoid system laying out
607
520
  // the screen underneath navigation controllers
608
521
  vc.edgesForExtendedLayout = UIRectEdgeNone;
609
522
  } else {
@@ -621,118 +534,44 @@ RNS_IGNORE_SUPER_CALL_END
621
534
  }
622
535
 
623
536
  #if !TARGET_OS_TV
624
- const auto isBackTitleBlank = [NSString rnscreens_isBlankOrNull:config.backTitle] == YES;
625
- NSString *resolvedBackTitle = isBackTitleBlank ? prevItem.title : config.backTitle;
626
- RNSUIBarButtonItem *backBarButtonItem = [[RNSUIBarButtonItem alloc] initWithTitle:resolvedBackTitle
627
- style:UIBarButtonItemStylePlain
628
- target:nil
629
- action:nil];
630
- [backBarButtonItem setMenuHidden:config.disableBackButtonMenu];
631
-
632
- auto shouldUseCustomBackBarButtonItem = !isBackTitleBlank || config.disableBackButtonMenu;
633
-
634
- // This has any effect only in case the `backBarButtonItem` is not set.
635
- // We apply it before we configure the back item, because it might get overriden.
636
- prevItem.backButtonDisplayMode = config.backButtonDisplayMode;
637
-
638
- if (config.isBackTitleVisible) {
639
- if ((config.backTitleFontFamily &&
640
- // While being used by react-navigation, the `backTitleFontFamily` will
641
- // be set to "System" by default - which is the system default font.
642
- // To avoid always considering the font as customized, we need to have an additional check.
643
- // See: https://github.com/software-mansion/react-native-screens/pull/2105#discussion_r1565222738
644
- ![config.backTitleFontFamily isEqual:@"System"]) ||
645
- config.backTitleFontSize) {
646
- shouldUseCustomBackBarButtonItem = YES;
647
- NSMutableDictionary *attrs = [NSMutableDictionary new];
648
- NSNumber *size = config.backTitleFontSize ?: @17;
649
- if (config.backTitleFontFamily) {
650
- attrs[NSFontAttributeName] = [RCTFont updateFont:nil
651
- withFamily:config.backTitleFontFamily
652
- size:size
653
- weight:nil
654
- style:nil
655
- variant:nil
656
- scaleMultiplier:1.0];
657
- } else {
658
- attrs[NSFontAttributeName] = [UIFont boldSystemFontOfSize:[size floatValue]];
659
- }
660
- [self setTitleAttibutes:attrs forButton:backBarButtonItem];
661
- }
662
- } else {
663
- // back button title should be not visible next to back button,
664
- // but it should still appear in back menu (if one is enabled)
665
-
666
- prevItem.backButtonTitle = resolvedBackTitle;
667
- prevItem.backButtonDisplayMode = UINavigationItemBackButtonDisplayModeMinimal;
668
- shouldUseCustomBackBarButtonItem = NO;
669
- }
670
-
671
- // Prevent unnecessary assignment of backBarButtonItem if it is not customized,
672
- // as assigning one will override the native behavior of automatically shortening
673
- // the title to "Back" or hide the back title if there's not enough space.
674
- // See: https://github.com/software-mansion/react-native-screens/issues/1589
675
- if (shouldUseCustomBackBarButtonItem) {
676
- prevItem.backBarButtonItem = backBarButtonItem;
677
- }
537
+ [config configureBackItem:prevItem];
678
538
 
679
- if (@available(iOS 11.0, *)) {
680
- if (config.largeTitle) {
681
- navctr.navigationBar.prefersLargeTitles = YES;
682
- }
683
- navitem.largeTitleDisplayMode =
684
- config.largeTitle ? UINavigationItemLargeTitleDisplayModeAlways : UINavigationItemLargeTitleDisplayModeNever;
539
+ if (config.largeTitle) {
540
+ navctr.navigationBar.prefersLargeTitles = YES;
685
541
  }
542
+ navitem.largeTitleDisplayMode =
543
+ config.largeTitle ? UINavigationItemLargeTitleDisplayModeAlways : UINavigationItemLargeTitleDisplayModeNever;
686
544
  #endif
687
545
 
688
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
689
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
690
- if (@available(iOS 13.0, tvOS 13.0, *)) {
691
- UINavigationBarAppearance *appearance = [self buildAppearance:vc withConfig:config];
692
- navitem.standardAppearance = appearance;
693
- navitem.compactAppearance = appearance;
546
+ UINavigationBarAppearance *appearance = [self buildAppearance:vc withConfig:config];
547
+ navitem.standardAppearance = appearance;
548
+ navitem.compactAppearance = appearance;
694
549
 
695
550
  // appearance does not apply to the tvOS so we need to use lagacy customization
696
551
  #if TARGET_OS_TV
697
- navctr.navigationBar.titleTextAttributes = appearance.titleTextAttributes;
698
- navctr.navigationBar.backgroundColor = appearance.backgroundColor;
552
+ navctr.navigationBar.titleTextAttributes = appearance.titleTextAttributes;
553
+ navctr.navigationBar.backgroundColor = appearance.backgroundColor;
699
554
  #endif
700
555
 
701
- UINavigationBarAppearance *scrollEdgeAppearance =
702
- [[UINavigationBarAppearance alloc] initWithBarAppearance:appearance];
703
- if (config.largeTitleBackgroundColor != nil) {
704
- // Add support for using a fully transparent bar when the backgroundColor is set to transparent.
705
- if (CGColorGetAlpha(config.largeTitleBackgroundColor.CGColor) == 0.) {
706
- // This will also remove the background blur effect in the large title which is otherwise inherited from the
707
- // standard appearance.
708
- [scrollEdgeAppearance configureWithTransparentBackground];
709
- // This must be set to nil otherwise a default view will be added to the navigation bar background with an
710
- // opaque background.
711
- scrollEdgeAppearance.backgroundColor = nil;
712
- } else {
713
- scrollEdgeAppearance.backgroundColor = config.largeTitleBackgroundColor;
714
- }
715
- }
716
- if (config.largeTitleHideShadow) {
717
- scrollEdgeAppearance.shadowColor = nil;
718
- }
719
- navitem.scrollEdgeAppearance = scrollEdgeAppearance;
720
- } else
721
- #endif
722
- {
723
- #if !TARGET_OS_TV
724
- // updating backIndicatotImage does not work when called during transition. On iOS pre 13 we need
725
- // to update it before the navigation starts.
726
- UIImage *backButtonImage = [config loadBackButtonImageInViewController:vc];
727
- if (backButtonImage) {
728
- navctr.navigationBar.backIndicatorImage = backButtonImage;
729
- navctr.navigationBar.backIndicatorTransitionMaskImage = backButtonImage;
730
- } else if (navctr.navigationBar.backIndicatorImage) {
731
- navctr.navigationBar.backIndicatorImage = nil;
732
- navctr.navigationBar.backIndicatorTransitionMaskImage = nil;
556
+ UINavigationBarAppearance *scrollEdgeAppearance =
557
+ [[UINavigationBarAppearance alloc] initWithBarAppearance:appearance];
558
+ if (config.largeTitleBackgroundColor != nil) {
559
+ // Add support for using a fully transparent bar when the backgroundColor is set to transparent.
560
+ if (CGColorGetAlpha(config.largeTitleBackgroundColor.CGColor) == 0.) {
561
+ // This will also remove the background blur effect in the large title which is otherwise inherited from the
562
+ // standard appearance.
563
+ [scrollEdgeAppearance configureWithTransparentBackground];
564
+ // This must be set to nil otherwise a default view will be added to the navigation bar background with an
565
+ // opaque background.
566
+ scrollEdgeAppearance.backgroundColor = nil;
567
+ } else {
568
+ scrollEdgeAppearance.backgroundColor = config.largeTitleBackgroundColor;
733
569
  }
734
- #endif
735
570
  }
571
+ if (config.largeTitleHideShadow) {
572
+ scrollEdgeAppearance.shadowColor = nil;
573
+ }
574
+ navitem.scrollEdgeAppearance = scrollEdgeAppearance;
736
575
  #if !TARGET_OS_TV
737
576
  navitem.hidesBackButton = config.hideBackButton;
738
577
  #endif
@@ -828,6 +667,71 @@ RNS_IGNORE_SUPER_CALL_END
828
667
  }
829
668
  }
830
669
 
670
+ - (void)configureBackItem:(nullable UINavigationItem *)prevItem API_UNAVAILABLE(tvos)
671
+ {
672
+ #if !TARGET_OS_TV
673
+ if (prevItem == nil) {
674
+ return;
675
+ }
676
+
677
+ const auto *config = self;
678
+
679
+ const auto isBackTitleBlank = [NSString rnscreens_isBlankOrNull:config.backTitle] == YES;
680
+ NSString *resolvedBackTitle = isBackTitleBlank ? prevItem.title : config.backTitle;
681
+ RNSUIBarButtonItem *backBarButtonItem = [[RNSUIBarButtonItem alloc] initWithTitle:resolvedBackTitle
682
+ style:UIBarButtonItemStylePlain
683
+ target:nil
684
+ action:nil];
685
+ [backBarButtonItem setMenuHidden:config.disableBackButtonMenu];
686
+
687
+ auto shouldUseCustomBackBarButtonItem = config.disableBackButtonMenu;
688
+
689
+ // This has any effect only in case the `backBarButtonItem` is not set.
690
+ // We apply it before we configure the back item, because it might get overriden.
691
+ prevItem.backButtonDisplayMode = config.backButtonDisplayMode;
692
+ prevItem.backButtonTitle = resolvedBackTitle;
693
+
694
+ if (config.isBackTitleVisible) {
695
+ if ((config.backTitleFontFamily &&
696
+ // While being used by react-navigation, the `backTitleFontFamily` will
697
+ // be set to "System" by default - which is the system default font.
698
+ // To avoid always considering the font as customized, we need to have an additional check.
699
+ // See: https://github.com/software-mansion/react-native-screens/pull/2105#discussion_r1565222738
700
+ ![config.backTitleFontFamily isEqual:@"System"]) ||
701
+ config.backTitleFontSize) {
702
+ shouldUseCustomBackBarButtonItem = YES;
703
+ NSMutableDictionary *attrs = [NSMutableDictionary new];
704
+ NSNumber *size = config.backTitleFontSize ?: @17;
705
+ if (config.backTitleFontFamily) {
706
+ attrs[NSFontAttributeName] = [RCTFont updateFont:nil
707
+ withFamily:config.backTitleFontFamily
708
+ size:size
709
+ weight:nil
710
+ style:nil
711
+ variant:nil
712
+ scaleMultiplier:1.0];
713
+ } else {
714
+ attrs[NSFontAttributeName] = [UIFont boldSystemFontOfSize:[size floatValue]];
715
+ }
716
+ [RNSScreenStackHeaderConfig setTitleAttibutes:attrs forButton:backBarButtonItem];
717
+ }
718
+ } else {
719
+ // back button title should be not visible next to back button,
720
+ // but it should still appear in back menu
721
+ prevItem.backButtonDisplayMode = UINavigationItemBackButtonDisplayModeMinimal;
722
+ shouldUseCustomBackBarButtonItem = NO;
723
+ }
724
+
725
+ // Prevent unnecessary assignment of backBarButtonItem if it is not customized,
726
+ // as assigning one will override the native behavior of automatically shortening
727
+ // the title to "Back" or hide the back title if there's not enough space.
728
+ // See: https://github.com/software-mansion/react-native-screens/issues/1589
729
+ if (shouldUseCustomBackBarButtonItem) {
730
+ prevItem.backBarButtonItem = backBarButtonItem;
731
+ }
732
+ #endif
733
+ }
734
+
831
735
  - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *)navCtrl
832
736
  {
833
737
  if ((self.direction == UISemanticContentAttributeForceLeftToRight ||
@@ -1239,35 +1143,28 @@ RCT_EXPORT_VIEW_PROPERTY(translucent, BOOL)
1239
1143
  @"extraLight" : @(RNSBlurEffectStyleExtraLight),
1240
1144
  @"light" : @(RNSBlurEffectStyleLight),
1241
1145
  @"dark" : @(RNSBlurEffectStyleDark),
1146
+ @"regular" : @(RNSBlurEffectStyleRegular),
1147
+ @"prominent" : @(RNSBlurEffectStyleProminent),
1242
1148
  }];
1243
1149
 
1244
- if (@available(iOS 10.0, *)) {
1245
- [blurEffects addEntriesFromDictionary:@{
1246
- @"regular" : @(RNSBlurEffectStyleRegular),
1247
- @"prominent" : @(RNSBlurEffectStyleProminent),
1248
- }];
1249
- }
1250
- #if !TARGET_OS_TV && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
1251
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
1252
- if (@available(iOS 13.0, *)) {
1253
- [blurEffects addEntriesFromDictionary:@{
1254
- @"systemUltraThinMaterial" : @(RNSBlurEffectStyleSystemUltraThinMaterial),
1255
- @"systemThinMaterial" : @(RNSBlurEffectStyleSystemThinMaterial),
1256
- @"systemMaterial" : @(RNSBlurEffectStyleSystemMaterial),
1257
- @"systemThickMaterial" : @(RNSBlurEffectStyleSystemThickMaterial),
1258
- @"systemChromeMaterial" : @(RNSBlurEffectStyleSystemChromeMaterial),
1259
- @"systemUltraThinMaterialLight" : @(RNSBlurEffectStyleSystemUltraThinMaterialLight),
1260
- @"systemThinMaterialLight" : @(RNSBlurEffectStyleSystemThinMaterialLight),
1261
- @"systemMaterialLight" : @(RNSBlurEffectStyleSystemMaterialLight),
1262
- @"systemThickMaterialLight" : @(RNSBlurEffectStyleSystemThickMaterialLight),
1263
- @"systemChromeMaterialLight" : @(RNSBlurEffectStyleSystemChromeMaterialLight),
1264
- @"systemUltraThinMaterialDark" : @(RNSBlurEffectStyleSystemUltraThinMaterialDark),
1265
- @"systemThinMaterialDark" : @(RNSBlurEffectStyleSystemThinMaterialDark),
1266
- @"systemMaterialDark" : @(RNSBlurEffectStyleSystemMaterialDark),
1267
- @"systemThickMaterialDark" : @(RNSBlurEffectStyleSystemThickMaterialDark),
1268
- @"systemChromeMaterialDark" : @(RNSBlurEffectStyleSystemChromeMaterialDark),
1269
- }];
1270
- }
1150
+ #if !TARGET_OS_TV
1151
+ [blurEffects addEntriesFromDictionary:@{
1152
+ @"systemUltraThinMaterial" : @(RNSBlurEffectStyleSystemUltraThinMaterial),
1153
+ @"systemThinMaterial" : @(RNSBlurEffectStyleSystemThinMaterial),
1154
+ @"systemMaterial" : @(RNSBlurEffectStyleSystemMaterial),
1155
+ @"systemThickMaterial" : @(RNSBlurEffectStyleSystemThickMaterial),
1156
+ @"systemChromeMaterial" : @(RNSBlurEffectStyleSystemChromeMaterial),
1157
+ @"systemUltraThinMaterialLight" : @(RNSBlurEffectStyleSystemUltraThinMaterialLight),
1158
+ @"systemThinMaterialLight" : @(RNSBlurEffectStyleSystemThinMaterialLight),
1159
+ @"systemMaterialLight" : @(RNSBlurEffectStyleSystemMaterialLight),
1160
+ @"systemThickMaterialLight" : @(RNSBlurEffectStyleSystemThickMaterialLight),
1161
+ @"systemChromeMaterialLight" : @(RNSBlurEffectStyleSystemChromeMaterialLight),
1162
+ @"systemUltraThinMaterialDark" : @(RNSBlurEffectStyleSystemUltraThinMaterialDark),
1163
+ @"systemThinMaterialDark" : @(RNSBlurEffectStyleSystemThinMaterialDark),
1164
+ @"systemMaterialDark" : @(RNSBlurEffectStyleSystemMaterialDark),
1165
+ @"systemThickMaterialDark" : @(RNSBlurEffectStyleSystemThickMaterialDark),
1166
+ @"systemChromeMaterialDark" : @(RNSBlurEffectStyleSystemChromeMaterialDark),
1167
+ }];
1271
1168
  #endif
1272
1169
  return blurEffects;
1273
1170
  }
@@ -40,32 +40,22 @@
40
40
  #if !TARGET_OS_TV
41
41
  + (UIStatusBarStyle)statusBarStyleForRNSStatusBarStyle:(RNSStatusBarStyle)statusBarStyle
42
42
  {
43
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
44
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
45
- if (@available(iOS 13.0, *)) {
46
- switch (statusBarStyle) {
47
- case RNSStatusBarStyleAuto:
48
- return [UITraitCollection.currentTraitCollection userInterfaceStyle] == UIUserInterfaceStyleDark
49
- ? UIStatusBarStyleLightContent
50
- : UIStatusBarStyleDarkContent;
51
- case RNSStatusBarStyleInverted:
52
- return [UITraitCollection.currentTraitCollection userInterfaceStyle] == UIUserInterfaceStyleDark
53
- ? UIStatusBarStyleDarkContent
54
- : UIStatusBarStyleLightContent;
55
- case RNSStatusBarStyleLight:
56
- return UIStatusBarStyleLightContent;
57
- case RNSStatusBarStyleDark:
58
- return UIStatusBarStyleDarkContent;
59
- default:
60
- return UIStatusBarStyleLightContent;
61
- }
62
- }
63
- #endif
64
- // it is the only non-default style available for iOS < 13
65
- if (statusBarStyle == RNSStatusBarStyleLight) {
66
- return UIStatusBarStyleLightContent;
43
+ switch (statusBarStyle) {
44
+ case RNSStatusBarStyleAuto:
45
+ return [UITraitCollection.currentTraitCollection userInterfaceStyle] == UIUserInterfaceStyleDark
46
+ ? UIStatusBarStyleLightContent
47
+ : UIStatusBarStyleDarkContent;
48
+ case RNSStatusBarStyleInverted:
49
+ return [UITraitCollection.currentTraitCollection userInterfaceStyle] == UIUserInterfaceStyleDark
50
+ ? UIStatusBarStyleDarkContent
51
+ : UIStatusBarStyleLightContent;
52
+ case RNSStatusBarStyleLight:
53
+ return UIStatusBarStyleLightContent;
54
+ case RNSStatusBarStyleDark:
55
+ return UIStatusBarStyleDarkContent;
56
+ default:
57
+ return UIStatusBarStyleLightContent;
67
58
  }
68
- return UIStatusBarStyleDefault;
69
59
  }
70
60
  #endif
71
61
 
@@ -194,19 +184,11 @@
194
184
  // https://stackoverflow.com/questions/57965701/statusbarorientation-was-deprecated-in-ios-13-0-when-attempting-to-get-app-ori/61249908#61249908
195
185
  + (UIInterfaceOrientation)interfaceOrientation
196
186
  {
197
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
198
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
199
- if (@available(iOS 13.0, *)) {
200
- UIWindowScene *windowScene = RCTKeyWindow().windowScene;
201
- if (windowScene == nil) {
202
- return UIInterfaceOrientationUnknown;
203
- }
204
- return windowScene.interfaceOrientation;
205
- } else
206
- #endif
207
- {
208
- return UIApplication.sharedApplication.statusBarOrientation;
187
+ UIWindowScene *windowScene = RCTKeyWindow().windowScene;
188
+ if (windowScene == nil) {
189
+ return UIInterfaceOrientationUnknown;
209
190
  }
191
+ return windowScene.interfaceOrientation;
210
192
  }
211
193
  #endif
212
194
 
@@ -173,11 +173,8 @@ namespace react = facebook::react;
173
173
 
174
174
  - (void)setBarTintColor:(UIColor *)barTintColor
175
175
  {
176
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
177
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 && !TARGET_OS_TV
178
- if (@available(iOS 13.0, *)) {
179
- [_controller.searchBar.searchTextField setBackgroundColor:barTintColor];
180
- }
176
+ #if !TARGET_OS_TV
177
+ [_controller.searchBar.searchTextField setBackgroundColor:barTintColor];
181
178
  #endif
182
179
  }
183
180
 
@@ -188,12 +185,9 @@ namespace react = facebook::react;
188
185
 
189
186
  - (void)setTextColor:(UIColor *)textColor
190
187
  {
191
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
192
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 && !TARGET_OS_TV
188
+ #if !TARGET_OS_TV
193
189
  _textColor = textColor;
194
- if (@available(iOS 13.0, *)) {
195
- [_controller.searchBar.searchTextField setTextColor:_textColor];
196
- }
190
+ [_controller.searchBar.searchTextField setTextColor:_textColor];
197
191
  #endif
198
192
  }
199
193
 
@@ -205,11 +199,11 @@ namespace react = facebook::react;
205
199
  - (void)hideCancelButton
206
200
  {
207
201
  #if !TARGET_OS_TV
208
- if (@available(iOS 13, *)) {
202
+ if (!_controller.automaticallyShowsCancelButton) {
203
+ [_controller.searchBar setShowsCancelButton:NO animated:YES];
204
+ } else {
209
205
  // On iOS 13+ UISearchController automatically shows/hides cancel button
210
206
  // https://developer.apple.com/documentation/uikit/uisearchcontroller/3152926-automaticallyshowscancelbutton?language=objc
211
- } else {
212
- [_controller.searchBar setShowsCancelButton:NO animated:YES];
213
207
  }
214
208
  #endif
215
209
  }
@@ -217,11 +211,11 @@ namespace react = facebook::react;
217
211
  - (void)showCancelButton
218
212
  {
219
213
  #if !TARGET_OS_TV
220
- if (@available(iOS 13, *)) {
214
+ if (!_controller.automaticallyShowsCancelButton) {
215
+ [_controller.searchBar setShowsCancelButton:YES animated:YES];
216
+ } else {
221
217
  // On iOS 13+ UISearchController automatically shows/hides cancel button
222
218
  // https://developer.apple.com/documentation/uikit/uisearchcontroller/3152926-automaticallyshowscancelbutton?language=objc
223
- } else {
224
- [_controller.searchBar setShowsCancelButton:YES animated:YES];
225
219
  }
226
220
  #endif
227
221
  }
@@ -246,14 +240,11 @@ namespace react = facebook::react;
246
240
 
247
241
  - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
248
242
  {
249
- #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
250
- __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 && !TARGET_OS_TV
251
- if (@available(iOS 13.0, *)) {
252
- // for some reason, the color does not change when set at the beginning,
253
- // so we apply it again here
254
- if (_textColor != nil) {
255
- [_controller.searchBar.searchTextField setTextColor:_textColor];
256
- }
243
+ #if !TARGET_OS_TV
244
+ // for some reason, the color does not change when set at the beginning,
245
+ // so we apply it again here
246
+ if (_textColor != nil) {
247
+ [_controller.searchBar.searchTextField setTextColor:_textColor];
257
248
  }
258
249
  #endif
259
250
 
@@ -24,7 +24,8 @@ function FullWindowOverlay(props) {
24
24
  style: [_reactNative.StyleSheet.absoluteFill, {
25
25
  width,
26
26
  height
27
- }]
27
+ }],
28
+ accessibilityContainerViewIsModal: props.unstable_accessibilityContainerViewIsModal
28
29
  }, props.children);
29
30
  }
30
31
  var _default = exports.default = FullWindowOverlay;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_FullWindowOverlayNativeComponent","e","__esModule","default","NativeFullWindowOverlay","FullWindowOverlayNativeComponent","FullWindowOverlay","props","width","height","useWindowDimensions","Platform","OS","console","warn","createElement","View","style","StyleSheet","absoluteFill","children","_default","exports"],"sourceRoot":"../../../src","sources":["components/FullWindowOverlay.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAUA,IAAAE,iCAAA,GAAAH,sBAAA,CAAAC,OAAA;AAA0F,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAD1F;;AAEA,MAAMG,uBAIL,GAAGC,yCAAuC;AAE3C,SAASC,iBAAiBA,CAACC,KAA8B,EAAE;EACzD,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAG,IAAAC,gCAAmB,EAAC,CAAC;EAC/C,IAAIC,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;IACzBC,OAAO,CAACC,IAAI,CAAC,uDAAuD,CAAC;IACrE,oBAAOlB,MAAA,CAAAO,OAAA,CAAAY,aAAA,CAAChB,YAAA,CAAAiB,IAAI,EAAKT,KAAQ,CAAC;EAC5B;EACA,oBACEX,MAAA,CAAAO,OAAA,CAAAY,aAAA,CAACX,uBAAuB;IACtBa,KAAK,EAAE,CAACC,uBAAU,CAACC,YAAY,EAAE;MAAEX,KAAK;MAAEC;IAAO,CAAC;EAAE,GACnDF,KAAK,CAACa,QACgB,CAAC;AAE9B;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAnB,OAAA,GAEcG,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_FullWindowOverlayNativeComponent","e","__esModule","default","NativeFullWindowOverlay","FullWindowOverlayNativeComponent","FullWindowOverlay","props","width","height","useWindowDimensions","Platform","OS","console","warn","createElement","View","style","StyleSheet","absoluteFill","accessibilityContainerViewIsModal","unstable_accessibilityContainerViewIsModal","children","_default","exports"],"sourceRoot":"../../../src","sources":["components/FullWindowOverlay.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAUA,IAAAE,iCAAA,GAAAH,sBAAA,CAAAC,OAAA;AAA0F,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAD1F;;AAIA,MAAMG,uBAKL,GAAGC,yCAAuC;AAO3C,SAASC,iBAAiBA,CAACC,KAA6B,EAAE;EACxD,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAG,IAAAC,gCAAmB,EAAC,CAAC;EAC/C,IAAIC,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;IACzBC,OAAO,CAACC,IAAI,CAAC,uDAAuD,CAAC;IACrE,oBAAOlB,MAAA,CAAAO,OAAA,CAAAY,aAAA,CAAChB,YAAA,CAAAiB,IAAI,EAAKT,KAAQ,CAAC;EAC5B;EACA,oBACEX,MAAA,CAAAO,OAAA,CAAAY,aAAA,CAACX,uBAAuB;IACtBa,KAAK,EAAE,CAACC,uBAAU,CAACC,YAAY,EAAE;MAAEX,KAAK;MAAEC;IAAO,CAAC,CAAE;IACpDW,iCAAiC,EAC/Bb,KAAK,CAACc;EACP,GACAd,KAAK,CAACe,QACgB,CAAC;AAE9B;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAArB,OAAA,GAEcG,iBAAiB","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactNative = require("react-native");
8
+ const ScreenContentWrapper = _reactNative.View;
9
+ var _default = exports.default = ScreenContentWrapper;
10
+ //# sourceMappingURL=ScreenContentWrapper.windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","ScreenContentWrapper","View","_default","exports","default"],"sourceRoot":"../../../src","sources":["components/ScreenContentWrapper.windows.tsx"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,MAAMC,oBAAoB,GAAGC,iBAAI;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEnBJ,oBAAoB","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.FooterComponent = void 0;
7
+ var _reactNative = require("react-native");
8
+ const ScreenFooter = _reactNative.View;
9
+ const FooterComponent = exports.FooterComponent = _reactNative.View;
10
+ var _default = exports.default = ScreenFooter;
11
+ //# sourceMappingURL=ScreenFooter.windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","ScreenFooter","View","FooterComponent","exports","_default","default"],"sourceRoot":"../../../src","sources":["components/ScreenFooter.windows.tsx"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,MAAMC,YAAY,GAAGC,iBAAI;AACzB,MAAMC,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAGD,iBAAI;AAAC,IAAAG,QAAA,GAAAD,OAAA,CAAAE,OAAA,GAEdL,YAAY","ignoreList":[]}
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _codegenNativeComponent = _interopRequireDefault(require("react-native/Libraries/Utilities/codegenNativeComponent"));
9
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ // Internal export, not part of stable library API.
10
11
  var _default = exports.default = (0, _codegenNativeComponent.default)('RNSFullWindowOverlay', {
11
12
  interfaceOnly: true
12
13
  });
@@ -1 +1 @@
1
- {"version":3,"names":["Object","defineProperty","exports","value","default","_codegenNativeComponent","_interopRequireDefault","require","e","__esModule","_default","codegenNativeComponent","interfaceOnly"],"sourceRoot":"../../../src","sources":["fabric/FullWindowOverlayNativeComponent.ts"],"mappings":";AAAA,YAAY;;AAACA,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,OAAA;AAEb,IAAAC,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA6F,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAJ,OAAA,EAAAI,CAAA;AAAA,IAAAE,QAAA,GAAAR,OAAA,CAAAE,OAAA,GAK9E,IAAAO,+BAAsB,EAAc,sBAAsB,EAAE;EACzEC,aAAa,EAAE;AACjB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Object","defineProperty","exports","value","default","_codegenNativeComponent","_interopRequireDefault","require","e","__esModule","_default","codegenNativeComponent","interfaceOnly"],"sourceRoot":"../../../src","sources":["fabric/FullWindowOverlayNativeComponent.ts"],"mappings":";AAAA,YAAY;;AAACA,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,OAAA;AAEb,IAAAC,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA6F,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAJ,OAAA,EAAAI,CAAA;AAI7F;AAAA,IAAAE,QAAA,GAAAR,OAAA,CAAAE,OAAA,GAKe,IAAAO,+BAAsB,EAAc,sBAAsB,EAAE;EACzEC,aAAa,EAAE;AACjB,CAAC,CAAC","ignoreList":[]}
@@ -17,7 +17,8 @@ function FullWindowOverlay(props) {
17
17
  style: [StyleSheet.absoluteFill, {
18
18
  width,
19
19
  height
20
- }]
20
+ }],
21
+ accessibilityContainerViewIsModal: props.unstable_accessibilityContainerViewIsModal
21
22
  }, props.children);
22
23
  }
23
24
  export default FullWindowOverlay;