react-native-screens 4.12.0 → 4.13.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.
Files changed (235) hide show
  1. package/RNScreens.podspec +29 -2
  2. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +4 -0
  3. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +9 -1
  4. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +0 -1
  5. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +4 -4
  6. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +1 -1
  7. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +4 -4
  8. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingViewManager.kt +8 -2
  9. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAnimationDelegate.kt +1 -2
  10. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenEventEmitter.kt +16 -13
  11. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/BaseEventEmitter.kt +22 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/FragmentProviding.kt +11 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/NamingAwareEventType.kt +13 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/EventHelpers.kt +6 -0
  15. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/FragmentManagerHelper.kt +76 -0
  16. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/SystemDrawable.kt +33 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreen.kt +101 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenDelegate.kt +17 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenEventEmitter.kt +46 -0
  20. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenFragment.kt +37 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt +178 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHost.kt +433 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostEventEmitter.kt +14 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt +177 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidAppearEvent.kt +30 -0
  26. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidDisappearEvent.kt +30 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillAppearEvent.kt +30 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillDisappearEvent.kt +30 -0
  29. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabsHostNativeFocusChangeEvent.kt +36 -0
  30. package/android/src/main/java/com/swmansion/rnscreens/stack/views/ChildDrawingOrderStrategyImpl.kt +0 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/transition/ExternalBoundaryValuesEvaluator.kt +9 -2
  32. package/android/src/main/java/com/swmansion/rnscreens/utils/FragmentTransactionKt.kt +4 -1
  33. package/android/src/main/jni/rnscreens.h +1 -0
  34. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java +76 -0
  35. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java +33 -0
  36. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java +97 -0
  37. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java +40 -0
  38. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +2 -2
  39. package/android/src/versioned/backgroundcolor/76/ViewBackgroundUtils.kt +0 -1
  40. package/android/src/versioned/backgroundcolor/latest/ViewBackgroundUtils.kt +0 -3
  41. package/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
  42. package/android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
  43. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsComponentDescriptor.h +31 -0
  44. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.cpp +20 -0
  45. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.h +32 -0
  46. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.cpp +22 -0
  47. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.h +44 -0
  48. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +8 -0
  49. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenComponentDescriptor.h +40 -0
  50. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.cpp +13 -0
  51. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.h +36 -0
  52. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenState.h +32 -0
  53. package/cpp/RNScreensTurboModule.h +5 -0
  54. package/ios/RNSEnums.h +6 -0
  55. package/ios/RNSScreen.h +2 -1
  56. package/ios/RNSScreen.mm +48 -1
  57. package/ios/RNSScreenContainer.mm +6 -0
  58. package/ios/RNSScreenStack.h +3 -1
  59. package/ios/RNSScreenStack.mm +39 -2
  60. package/ios/RNSScreenStackHeaderConfig.mm +1 -1
  61. package/ios/RNSScrollViewBehaviorOverriding.h +24 -0
  62. package/ios/RNSScrollViewFinder.h +13 -0
  63. package/ios/RNSScrollViewFinder.mm +22 -0
  64. package/ios/RNSScrollViewHelper.h +10 -0
  65. package/ios/RNSScrollViewHelper.mm +15 -0
  66. package/ios/RNScreens-Bridging-Header.h +4 -0
  67. package/ios/UIScrollView+RNScreens.h +14 -0
  68. package/ios/UIScrollView+RNScreens.mm +15 -0
  69. package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.h +18 -0
  70. package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.mm +25 -0
  71. package/ios/bottom-tabs/RNSBottomTabsHostComponentView.h +80 -0
  72. package/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm +486 -0
  73. package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.h +11 -0
  74. package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm +48 -0
  75. package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.h +53 -0
  76. package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.mm +57 -0
  77. package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h +95 -0
  78. package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm +492 -0
  79. package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.h +9 -0
  80. package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm +55 -0
  81. package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.h +53 -0
  82. package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.mm +106 -0
  83. package/ios/bottom-tabs/RNSBottomTabsSpecialEffectsSupporting.h +17 -0
  84. package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.h +34 -0
  85. package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm +243 -0
  86. package/ios/bottom-tabs/RNSTabBarAppearanceProvider.h +23 -0
  87. package/ios/bottom-tabs/RNSTabBarController.h +132 -0
  88. package/ios/bottom-tabs/RNSTabBarController.mm +206 -0
  89. package/ios/bottom-tabs/RNSTabBarControllerDelegate.h +9 -0
  90. package/ios/bottom-tabs/RNSTabBarControllerDelegate.mm +63 -0
  91. package/ios/bottom-tabs/RNSTabsScreenViewController.h +42 -0
  92. package/ios/bottom-tabs/RNSTabsScreenViewController.mm +105 -0
  93. package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.h +21 -0
  94. package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.mm +22 -0
  95. package/ios/bridging/RNSReactBaseView.h +31 -0
  96. package/ios/bridging/RNSReactBaseView.mm +5 -0
  97. package/ios/bridging/Swift-Bridging.h +7 -0
  98. package/ios/conversion/RNSConversions-BottomTabs.mm +216 -0
  99. package/ios/conversion/RNSConversions-SplitView.mm +63 -0
  100. package/ios/conversion/RNSConversions.h +53 -0
  101. package/ios/gamma/ReactMountingTransactionObserving.swift +7 -0
  102. package/ios/gamma/split-view/RNSSplitViewHostComponentView.h +29 -0
  103. package/ios/gamma/split-view/RNSSplitViewHostComponentView.mm +209 -0
  104. package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.h +11 -0
  105. package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.mm +7 -0
  106. package/ios/gamma/split-view/RNSSplitViewHostController.swift +98 -0
  107. package/ios/gamma/split-view/RNSSplitViewNavigationController.swift +31 -0
  108. package/ios/gamma/split-view/RNSSplitViewScreenComponentView.h +24 -0
  109. package/ios/gamma/split-view/RNSSplitViewScreenComponentView.mm +106 -0
  110. package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.h +11 -0
  111. package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.mm +7 -0
  112. package/ios/gamma/split-view/RNSSplitViewScreenController.swift +86 -0
  113. package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.h +35 -0
  114. package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.mm +56 -0
  115. package/ios/gamma/stack/RNSScreenStackHostComponentView.h +16 -0
  116. package/ios/gamma/stack/RNSScreenStackHostComponentView.mm +143 -0
  117. package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.h +11 -0
  118. package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.mm +7 -0
  119. package/ios/gamma/stack/RNSStackController.swift +65 -0
  120. package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.h +37 -0
  121. package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.mm +60 -0
  122. package/ios/gamma/stack/RNSStackScreenComponentView.h +36 -0
  123. package/ios/gamma/stack/RNSStackScreenComponentView.mm +124 -0
  124. package/ios/gamma/stack/RNSStackScreenComponentViewManager.h +11 -0
  125. package/ios/gamma/stack/RNSStackScreenComponentViewManager.mm +7 -0
  126. package/ios/gamma/stack/RNSStackScreenController.swift +56 -0
  127. package/ios/utils/NSString+RNSUtility.h +17 -0
  128. package/ios/utils/NSString+RNSUtility.mm +37 -0
  129. package/lib/commonjs/components/BottomTabs.js +54 -0
  130. package/lib/commonjs/components/BottomTabs.js.map +1 -0
  131. package/lib/commonjs/components/BottomTabsScreen.js +149 -0
  132. package/lib/commonjs/components/BottomTabsScreen.js.map +1 -0
  133. package/lib/commonjs/components/gamma/ScreenStackHost.js +27 -0
  134. package/lib/commonjs/components/gamma/ScreenStackHost.js.map +1 -0
  135. package/lib/commonjs/components/gamma/SplitViewHost.js +57 -0
  136. package/lib/commonjs/components/gamma/SplitViewHost.js.map +1 -0
  137. package/lib/commonjs/components/gamma/SplitViewScreen.js +22 -0
  138. package/lib/commonjs/components/gamma/SplitViewScreen.js.map +1 -0
  139. package/lib/commonjs/components/gamma/StackScreen.js +51 -0
  140. package/lib/commonjs/components/gamma/StackScreen.js.map +1 -0
  141. package/lib/commonjs/fabric/BottomTabsNativeComponent.js +19 -0
  142. package/lib/commonjs/fabric/BottomTabsNativeComponent.js.map +1 -0
  143. package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js +14 -0
  144. package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
  145. package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js +11 -0
  146. package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
  147. package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js +11 -0
  148. package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
  149. package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js +13 -0
  150. package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
  151. package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js +12 -0
  152. package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
  153. package/lib/commonjs/flags.js +70 -0
  154. package/lib/commonjs/flags.js.map +1 -0
  155. package/lib/commonjs/index.js +66 -3
  156. package/lib/commonjs/index.js.map +1 -1
  157. package/lib/commonjs/utils.js +0 -28
  158. package/lib/commonjs/utils.js.map +1 -1
  159. package/lib/module/components/BottomTabs.js +48 -0
  160. package/lib/module/components/BottomTabs.js.map +1 -0
  161. package/lib/module/components/BottomTabsScreen.js +144 -0
  162. package/lib/module/components/BottomTabsScreen.js.map +1 -0
  163. package/lib/module/components/gamma/ScreenStackHost.js +20 -0
  164. package/lib/module/components/gamma/ScreenStackHost.js.map +1 -0
  165. package/lib/module/components/gamma/SplitViewHost.js +50 -0
  166. package/lib/module/components/gamma/SplitViewHost.js.map +1 -0
  167. package/lib/module/components/gamma/SplitViewScreen.js +15 -0
  168. package/lib/module/components/gamma/SplitViewScreen.js.map +1 -0
  169. package/lib/module/components/gamma/StackScreen.js +44 -0
  170. package/lib/module/components/gamma/StackScreen.js.map +1 -0
  171. package/lib/module/fabric/BottomTabsNativeComponent.js +15 -0
  172. package/lib/module/fabric/BottomTabsNativeComponent.js.map +1 -0
  173. package/lib/module/fabric/BottomTabsScreenNativeComponent.js +12 -0
  174. package/lib/module/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
  175. package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js +5 -0
  176. package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
  177. package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js +5 -0
  178. package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
  179. package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js +7 -0
  180. package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
  181. package/lib/module/fabric/gamma/StackScreenNativeComponent.js +8 -0
  182. package/lib/module/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
  183. package/lib/module/flags.js +64 -0
  184. package/lib/module/flags.js.map +1 -0
  185. package/lib/module/index.js +16 -1
  186. package/lib/module/index.js.map +1 -1
  187. package/lib/module/utils.js +0 -27
  188. package/lib/module/utils.js.map +1 -1
  189. package/lib/typescript/components/BottomTabs.d.ts +30 -0
  190. package/lib/typescript/components/BottomTabs.d.ts.map +1 -0
  191. package/lib/typescript/components/BottomTabsScreen.d.ts +56 -0
  192. package/lib/typescript/components/BottomTabsScreen.d.ts.map +1 -0
  193. package/lib/typescript/components/gamma/ScreenStackHost.d.ts +13 -0
  194. package/lib/typescript/components/gamma/ScreenStackHost.d.ts.map +1 -0
  195. package/lib/typescript/components/gamma/SplitViewHost.d.ts +13 -0
  196. package/lib/typescript/components/gamma/SplitViewHost.d.ts.map +1 -0
  197. package/lib/typescript/components/gamma/SplitViewScreen.d.ts +13 -0
  198. package/lib/typescript/components/gamma/SplitViewScreen.d.ts.map +1 -0
  199. package/lib/typescript/components/gamma/StackScreen.d.ts +21 -0
  200. package/lib/typescript/components/gamma/StackScreen.d.ts.map +1 -0
  201. package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts +31 -0
  202. package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts.map +1 -0
  203. package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts +51 -0
  204. package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts.map +1 -0
  205. package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts +7 -0
  206. package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts.map +1 -0
  207. package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts +16 -0
  208. package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts.map +1 -0
  209. package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts +7 -0
  210. package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts.map +1 -0
  211. package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts +15 -0
  212. package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts.map +1 -0
  213. package/lib/typescript/flags.d.ts +45 -0
  214. package/lib/typescript/flags.d.ts.map +1 -0
  215. package/lib/typescript/index.d.ts +14 -1
  216. package/lib/typescript/index.d.ts.map +1 -1
  217. package/lib/typescript/utils.d.ts +0 -26
  218. package/lib/typescript/utils.d.ts.map +1 -1
  219. package/package.json +34 -6
  220. package/react-native.config.js +2 -1
  221. package/src/components/BottomTabs.tsx +115 -0
  222. package/src/components/BottomTabsScreen.tsx +291 -0
  223. package/src/components/gamma/ScreenStackHost.tsx +32 -0
  224. package/src/components/gamma/SplitViewHost.tsx +84 -0
  225. package/src/components/gamma/SplitViewScreen.tsx +26 -0
  226. package/src/components/gamma/StackScreen.tsx +64 -0
  227. package/src/fabric/BottomTabsNativeComponent.ts +82 -0
  228. package/src/fabric/BottomTabsScreenNativeComponent.ts +107 -0
  229. package/src/fabric/gamma/ScreenStackHostNativeComponent.ts +8 -0
  230. package/src/fabric/gamma/SplitViewHostNativeComponent.ts +39 -0
  231. package/src/fabric/gamma/SplitViewScreenNativeComponent.ts +10 -0
  232. package/src/fabric/gamma/StackScreenNativeComponent.ts +25 -0
  233. package/src/flags.ts +72 -0
  234. package/src/index.tsx +18 -1
  235. package/src/utils.ts +0 -28
@@ -0,0 +1,206 @@
1
+ #import "RNSTabBarController.h"
2
+ #import <React/RCTAssert.h>
3
+ #import <React/RCTLog.h>
4
+
5
+ @implementation RNSTabBarController {
6
+ NSArray<RNSTabsScreenViewController *> *_Nullable _tabScreenControllers;
7
+
8
+ #if !RCT_NEW_ARCH_ENABLED
9
+ BOOL _isControllerFlushBlockScheduled;
10
+ #endif // !RCT_NEW_ARCH_ENABLED
11
+ }
12
+
13
+ - (instancetype)init
14
+ {
15
+ if (self = [super init]) {
16
+ _tabScreenControllers = nil;
17
+ _tabBarAppearanceCoordinator = [RNSTabBarAppearanceCoordinator new];
18
+ _tabsHostComponentView = nil;
19
+
20
+ #if !RCT_NEW_ARCH_ENABLED
21
+ _isControllerFlushBlockScheduled = NO;
22
+ #endif // !RCT_NEW_ARCH_ENABLED
23
+ }
24
+ return self;
25
+ }
26
+
27
+ - (instancetype)initWithTabsHostComponentView:(nullable RNSBottomTabsHostComponentView *)tabsHostComponentView
28
+ {
29
+ if (self = [self init]) {
30
+ _tabsHostComponentView = tabsHostComponentView;
31
+ }
32
+ return self;
33
+ }
34
+
35
+ - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
36
+ {
37
+ NSLog(@"TabBar: %@ didSelectItem: %@", tabBar, item);
38
+ }
39
+
40
+ #pragma mark-- Signals
41
+
42
+ - (void)childViewControllersHaveChangedTo:(NSArray<RNSTabsScreenViewController *> *)reactChildControllers
43
+ {
44
+ _tabScreenControllers = reactChildControllers;
45
+ self.needsUpdateOfReactChildrenControllers = true;
46
+ }
47
+
48
+ - (void)setNeedsUpdateOfReactChildrenControllers:(bool)needsReactChildrenUpdate
49
+ {
50
+ _needsUpdateOfReactChildrenControllers = true;
51
+ self.needsUpdateOfSelectedTab = true;
52
+ #if !RCT_NEW_ARCH_ENABLED
53
+ [self scheduleControllerUpdateIfNeeded];
54
+ #endif // !RCT_NEW_ARCH_ENABLED
55
+ }
56
+
57
+ - (void)setNeedsUpdateOfSelectedTab:(bool)needsSelectedTabUpdate
58
+ {
59
+ _needsUpdateOfSelectedTab = needsSelectedTabUpdate;
60
+ #if !RCT_NEW_ARCH_ENABLED
61
+ [self scheduleControllerUpdateIfNeeded];
62
+ #endif // !RCT_NEW_ARCH_ENABLED
63
+ }
64
+
65
+ - (void)setNeedsUpdateOfTabBarAppearance:(bool)needsUpdateOfTabBarAppearance
66
+ {
67
+ _needsUpdateOfTabBarAppearance = needsUpdateOfTabBarAppearance;
68
+ #if !RCT_NEW_ARCH_ENABLED
69
+ [self scheduleControllerUpdateIfNeeded];
70
+ #endif // !RCT_NEW_ARCH_ENABLED
71
+ }
72
+
73
+ #pragma mark-- RNSReactTransactionObserving
74
+
75
+ - (void)reactMountingTransactionWillMount
76
+ {
77
+ NSLog(@"TabBarCtrl mountintTransactionWillMount");
78
+ }
79
+
80
+ - (void)reactMountingTransactionDidMount
81
+ {
82
+ NSLog(@"TabBarCtrl mountintTransactionDidMount running updates");
83
+ [self updateReactChildrenControllersIfNeeded];
84
+ [self updateSelectedViewControllerIfNeeded];
85
+ [self updateTabBarAppearanceIfNeeded];
86
+ }
87
+
88
+ #pragma mark-- Signals related
89
+
90
+ - (void)updateReactChildrenControllersIfNeeded
91
+ {
92
+ if (_needsUpdateOfReactChildrenControllers) {
93
+ [self updateReactChildrenControllers];
94
+ }
95
+ }
96
+
97
+ - (void)updateReactChildrenControllers
98
+ {
99
+ NSLog(@"TabBarCtrl updateReactChildrenControllers");
100
+ _needsUpdateOfReactChildrenControllers = false;
101
+
102
+ if (_tabScreenControllers == nil) {
103
+ RCTLogWarn(@"[RNScreens] Attempt to update react children while the _updatedChildren array is nil!");
104
+ return;
105
+ }
106
+
107
+ [self setViewControllers:_tabScreenControllers animated:[[self viewControllers] count] != 0];
108
+ }
109
+
110
+ - (void)updateSelectedViewControllerIfNeeded
111
+ {
112
+ if (_needsUpdateOfSelectedTab) {
113
+ [self updateSelectedViewController];
114
+ }
115
+ }
116
+
117
+ - (void)updateSelectedViewController
118
+ {
119
+ NSLog(@"TabBarCtrl updateSelectedViewController");
120
+ _needsUpdateOfSelectedTab = false;
121
+
122
+ #if !defined(NDEBUG)
123
+ [self assertExactlyOneFocusedTab];
124
+ #endif
125
+
126
+ RNSTabsScreenViewController *_Nullable selectedViewController = nil;
127
+ for (RNSTabsScreenViewController *tabViewController in self.viewControllers) {
128
+ NSLog(
129
+ @"Update Selected View Controller [%ld] isFocused %d",
130
+ tabViewController.tabScreenComponentView.tag,
131
+ tabViewController.tabScreenComponentView.isSelectedScreen);
132
+ if (tabViewController.tabScreenComponentView.isSelectedScreen == true) {
133
+ selectedViewController = tabViewController;
134
+ break;
135
+ }
136
+ }
137
+
138
+ RCTAssert(selectedViewController != nil, @"[RNScreens] No selected view controller!");
139
+
140
+ NSLog(@"Change selected view controller to: %@", selectedViewController);
141
+
142
+ [selectedViewController.tabScreenComponentView overrideScrollViewBehaviorInFirstDescendantChainIfNeeded];
143
+ [self setSelectedViewController:selectedViewController];
144
+ }
145
+
146
+ - (void)updateTabBarAppearanceIfNeeded
147
+ {
148
+ if (_needsUpdateOfTabBarAppearance) {
149
+ [self updateTabBarAppearance];
150
+ }
151
+ }
152
+
153
+ - (void)updateTabBarAppearance
154
+ {
155
+ NSLog(@"TabBarCtrl updateTabBarAppearance");
156
+ _needsUpdateOfTabBarAppearance = false;
157
+
158
+ [_tabBarAppearanceCoordinator updateAppearanceOfTabBar:[self tabBar]
159
+ withHostComponentView:self.tabsHostComponentView
160
+ tabScreenControllers:_tabScreenControllers
161
+ imageLoader:[self.tabsHostComponentView reactImageLoader]];
162
+ }
163
+
164
+ #if !defined(NDEBUG)
165
+ - (void)assertExactlyOneFocusedTab
166
+ {
167
+ int selectedCount = 0;
168
+ for (RNSTabsScreenViewController *tabViewController in _tabScreenControllers) {
169
+ if (tabViewController.tabScreenComponentView.isSelectedScreen) {
170
+ ++selectedCount;
171
+ }
172
+ }
173
+ RCTAssert(
174
+ selectedCount == 1, @"[RNScreens] Invariant violation. Expected exactly 1 focused tab, got: %d", selectedCount);
175
+ }
176
+ #endif
177
+
178
+ #if !RCT_NEW_ARCH_ENABLED
179
+
180
+ #pragma mark - LEGACY Paper scheduling methods
181
+
182
+ // TODO: These could be moved to separate scheduler class
183
+
184
+ - (void)scheduleControllerUpdateIfNeeded
185
+ {
186
+ if (_isControllerFlushBlockScheduled) {
187
+ return;
188
+ }
189
+
190
+ _isControllerFlushBlockScheduled = YES;
191
+
192
+ auto *__weak weakSelf = self;
193
+ dispatch_async(dispatch_get_main_queue(), ^{
194
+ auto *strongSelf = weakSelf;
195
+ if (strongSelf == nil) {
196
+ return;
197
+ }
198
+ strongSelf->_isControllerFlushBlockScheduled = NO;
199
+ [strongSelf reactMountingTransactionWillMount];
200
+ [strongSelf reactMountingTransactionDidMount];
201
+ });
202
+ }
203
+
204
+ #endif // !RCT_NEW_ARCH_ENABLED
205
+
206
+ @end
@@ -0,0 +1,9 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ @interface RNSTabBarControllerDelegate : NSObject <UITabBarControllerDelegate>
6
+
7
+ @end
8
+
9
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,63 @@
1
+ #import "RNSTabBarControllerDelegate.h"
2
+ #import <React/RCTAssert.h>
3
+ #import "RNSTabBarController.h"
4
+ #import "RNSTabsScreenViewController.h"
5
+
6
+ @implementation RNSTabBarControllerDelegate
7
+
8
+ - (BOOL)tabBarController:(UITabBarController *)tabBarController
9
+ shouldSelectViewController:(UIViewController *)viewController
10
+ {
11
+ // TODO: This will crash with "More" view controller.
12
+ RCTAssert(
13
+ [tabBarController isKindOfClass:RNSTabBarController.class],
14
+ @"[RNScreens] Unexpected type of controller: %@",
15
+ tabBarController.class);
16
+ RCTAssert(
17
+ [viewController isKindOfClass:RNSTabsScreenViewController.class],
18
+ @"[RNScreens] Unexpected type of controller: %@",
19
+ viewController.class);
20
+
21
+ RNSTabBarController *tabBarCtrl = static_cast<RNSTabBarController *>(tabBarController);
22
+ RNSTabsScreenViewController *tabScreenCtrl = static_cast<RNSTabsScreenViewController *>(viewController);
23
+
24
+ bool repeatedSelectionHandledNatively = false;
25
+
26
+ // Detect repeated selection and inform tabScreenController
27
+ if ([tabBarCtrl selectedViewController] == tabScreenCtrl) {
28
+ repeatedSelectionHandledNatively = [tabScreenCtrl tabScreenSelectedRepeatedly];
29
+ }
30
+
31
+ // TODO: send an event with information about event being handled natively
32
+ if (!repeatedSelectionHandledNatively) {
33
+ [tabBarCtrl.tabsHostComponentView
34
+ emitOnNativeFocusChangeRequestSelectedTabScreen:tabScreenCtrl.tabScreenComponentView];
35
+
36
+ // TODO: handle overrideScrollViewBehaviorInFirstDescendantChainIfNeeded for natively-driven tabs
37
+ return ![self shouldPreventNativeTabChangeWithinTabBarController:tabBarCtrl];
38
+ }
39
+
40
+ // As we're selecting the same controller, returning both true and false works here.
41
+ return true;
42
+ }
43
+
44
+ - (void)tabBarController:(UITabBarController *)tabBarController
45
+ didSelectViewController:(UIViewController *)viewController
46
+ {
47
+ RCTAssert(
48
+ [tabBarController isKindOfClass:RNSTabBarController.class],
49
+ @"[RNScreens] Unexpected type of controller: %@",
50
+ tabBarController.class);
51
+ RCTAssert(
52
+ [viewController isKindOfClass:RNSTabsScreenViewController.class],
53
+ @"[RNScreens] Unexpected type of controller: %@",
54
+ viewController.class);
55
+ }
56
+
57
+ - (bool)shouldPreventNativeTabChangeWithinTabBarController:(nonnull RNSTabBarController *)tabBarCtrl
58
+ {
59
+ // This handles the tabsHostComponentView nullability
60
+ return [tabBarCtrl.tabsHostComponentView experimental_controlNavigationStateInJS] ?: NO;
61
+ }
62
+
63
+ @end
@@ -0,0 +1,42 @@
1
+ #import <UIKit/UIKit.h>
2
+ #import "RNSBottomTabsScreenComponentView.h"
3
+ #import "RNSBottomTabsSpecialEffectsSupporting.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ @interface RNSTabsScreenViewController : UIViewController
8
+
9
+ @property (nonatomic, strong, readonly, nullable) RNSBottomTabsScreenComponentView *tabScreenComponentView;
10
+ @property (nonatomic, weak, readonly, nullable) id<RNSBottomTabsSpecialEffectsSupporting> tabsSpecialEffectsDelegate;
11
+
12
+ /**
13
+ * Tell the controller that the tab screen it owns has got its react-props-focus changed.
14
+ */
15
+ - (void)tabScreenFocusHasChanged;
16
+
17
+ /**
18
+ * Tell the controller that the tab screen it owns has got its react-props related to appearance changed.
19
+ */
20
+ - (void)tabItemAppearanceHasChanged;
21
+
22
+ /**
23
+ * Tell the controller that the tab item related to this controller has been selected again after being presented.
24
+ * Returns boolean indicating whether the action has been handled.
25
+ */
26
+ - (bool)tabScreenSelectedRepeatedly;
27
+
28
+ /**
29
+ * Set new special effects delegate.
30
+ */
31
+ - (void)setTabsSpecialEffectsDelegate:(nonnull id<RNSBottomTabsSpecialEffectsSupporting>)delegate;
32
+
33
+ /**
34
+ * Inform the controller about resignation from being special effects delegate. If resignation comes from current
35
+ * tabsSpecialEffectsDelegate, this method sets tabsSpecialEffectsDelegate to nil. If tabsSpecialEffectsDelegate has
36
+ * already changed (to other delegate or nil), this method does nothing.
37
+ */
38
+ - (void)clearTabsSpecialEffectsDelegateIfNeeded:(nonnull id<RNSBottomTabsSpecialEffectsSupporting>)delegate;
39
+
40
+ @end
41
+
42
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,105 @@
1
+ #import "RNSTabsScreenViewController.h"
2
+ #import "RNSScrollViewFinder.h"
3
+ #import "RNSTabBarController.h"
4
+ #import "UIScrollView+RNScreens.h"
5
+
6
+ @implementation RNSTabsScreenViewController
7
+
8
+ - (nullable RNSTabBarController *)findTabBarController
9
+ {
10
+ return static_cast<RNSTabBarController *_Nullable>(self.tabBarController);
11
+ }
12
+
13
+ - (nullable RNSBottomTabsScreenComponentView *)tabScreenComponentView
14
+ {
15
+ return static_cast<RNSBottomTabsScreenComponentView *>(self.view);
16
+ }
17
+
18
+ - (void)tabScreenFocusHasChanged
19
+ {
20
+ NSLog(
21
+ @"TabScreen [%ld] changed focus: %d",
22
+ self.tabScreenComponentView.tag,
23
+ self.tabScreenComponentView.isSelectedScreen);
24
+
25
+ // The focus of owned tab has been updated from react. We tell the parent controller that it should update the
26
+ // container.
27
+ [[self findTabBarController] setNeedsUpdateOfSelectedTab:true];
28
+ }
29
+
30
+ - (void)tabItemAppearanceHasChanged
31
+ {
32
+ [[self findTabBarController] setNeedsUpdateOfTabBarAppearance:true];
33
+ }
34
+
35
+ - (void)viewWillAppear:(BOOL)animated
36
+ {
37
+ [self.tabScreenComponentView.reactEventEmitter emitOnWillAppear];
38
+ }
39
+
40
+ - (void)viewDidAppear:(BOOL)animated
41
+ {
42
+ [self.tabScreenComponentView.reactEventEmitter emitOnDidAppear];
43
+ }
44
+
45
+ - (void)viewWillDisappear:(BOOL)animated
46
+ {
47
+ [self.tabScreenComponentView.reactEventEmitter emitOnWillDisappear];
48
+ }
49
+
50
+ - (void)viewDidDisappear:(BOOL)animated
51
+ {
52
+ [self.tabScreenComponentView.reactEventEmitter emitOnDidDisappear];
53
+ }
54
+
55
+ - (void)didMoveToParentViewController:(UIViewController *)parent
56
+ {
57
+ NSLog(@"TabScreen [%ld] ctrl moved to parent: %@", self.tabScreenComponentView.tag, parent);
58
+
59
+ if (parent == nil) {
60
+ return;
61
+ }
62
+
63
+ RCTAssert(
64
+ [parent isKindOfClass:RNSTabBarController.class],
65
+ @"[RNScreens] TabScreenViewController added to parent of unexpected type: %@",
66
+ parent.class);
67
+
68
+ RNSTabBarController *tabBarCtrl = [self findTabBarController];
69
+
70
+ RCTAssert(
71
+ tabBarCtrl != nil, @"[RNScreens] nullish tabBarCtrl after TabScreenViewController has been added to parent");
72
+
73
+ [tabBarCtrl setNeedsUpdateOfTabBarAppearance:true];
74
+ [tabBarCtrl updateTabBarAppearanceIfNeeded];
75
+ }
76
+
77
+ - (void)setTabsSpecialEffectsDelegate:(id<RNSBottomTabsSpecialEffectsSupporting>)delegate
78
+ {
79
+ RCTAssert(
80
+ delegate != nil,
81
+ @"[RNScreens] can't set special effects delegate to nil. Use clearTabsSpecialEffectsDelegateIfNeeded instead.");
82
+ _tabsSpecialEffectsDelegate = delegate;
83
+ }
84
+
85
+ - (void)clearTabsSpecialEffectsDelegateIfNeeded:(id<RNSBottomTabsSpecialEffectsSupporting>)delegate
86
+ {
87
+ if (_tabsSpecialEffectsDelegate == delegate) {
88
+ _tabsSpecialEffectsDelegate = nil;
89
+ }
90
+ }
91
+
92
+ - (bool)tabScreenSelectedRepeatedly
93
+ {
94
+ if ([self tabsSpecialEffectsDelegate] != nil) {
95
+ return [[self tabsSpecialEffectsDelegate] onRepeatedTabSelectionOfTabScreenController:self];
96
+ } else if (self.tabScreenComponentView.shouldUseRepeatedTabSelectionScrollToTopSpecialEffect) {
97
+ UIScrollView *scrollView =
98
+ [RNSScrollViewFinder findScrollViewInFirstDescendantChainFrom:[self tabScreenComponentView]];
99
+ return [scrollView rnscreens_scrollToTop];
100
+ }
101
+
102
+ return false;
103
+ }
104
+
105
+ @end
@@ -0,0 +1,21 @@
1
+ #import "RNSBottomTabsHostComponentView.h"
2
+
3
+ #if defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
4
+ #import "RNSBottomTabsShadowNode.h"
5
+ #endif // defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
6
+
7
+ NS_ASSUME_NONNULL_BEGIN
8
+
9
+ #if defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
10
+
11
+ @class RCTImageLoader;
12
+
13
+ @interface RNSBottomTabsHostComponentView (RNSImageLoader)
14
+
15
+ - (nullable RCTImageLoader *)retrieveImageLoaderFromState:(facebook::react::RNSBottomTabsShadowNode::ConcreteState::Shared)state;
16
+
17
+ @end
18
+
19
+ #endif // defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
20
+
21
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,22 @@
1
+ #import "RNSBottomTabsHostComponentView+RNSImageLoader.h"
2
+
3
+ #if RCT_NEW_ARCH_ENABLED
4
+
5
+ #import <React/RCTImageLoader.h>
6
+ #import <react/utils/ManagedObjectWrapper.h>
7
+
8
+ @implementation RNSBottomTabsHostComponentView (RNSImageLoader)
9
+
10
+ - (nullable RCTImageLoader *)retrieveImageLoaderFromState:(facebook::react::RNSBottomTabsShadowNode::ConcreteState::Shared)receivedState
11
+ {
12
+ if (auto imgLoaderPtr = receivedState.get()->getData().getImageLoader().lock()) {
13
+ return react::unwrapManagedObject(imgLoaderPtr);
14
+ }
15
+
16
+ RCTLogWarn(@"[RNScreens] unable to retrieve RCTImageLoader");
17
+ return nil;
18
+ }
19
+
20
+ @end
21
+
22
+ #endif // RCT_NEW_ARCH_ENABLED
@@ -0,0 +1,31 @@
1
+ // Hide C++ symbols from C compiler used when building Swift module
2
+ #if defined(__cplusplus)
3
+
4
+ #pragma mark - New architecture definitions
5
+ #if RCT_NEW_ARCH_ENABLED
6
+
7
+ #import <React/RCTViewComponentView.h>
8
+
9
+ @interface RNSReactBaseView : RCTViewComponentView
10
+ @end
11
+
12
+ #else
13
+ #pragma mark - Legacy architecture definitions
14
+
15
+ #import <React/RCTView.h>
16
+
17
+ @interface RNSReactBaseView : RCTView
18
+ @end
19
+
20
+ #endif // RCT_NEW_ARCH_ENABLED
21
+
22
+ #else
23
+
24
+ NS_ASSUME_NONNULL_BEGIN
25
+
26
+ @interface RNSReactBaseView : UIView
27
+ @end
28
+
29
+ NS_ASSUME_NONNULL_END
30
+
31
+ #endif // __cplusplus
@@ -0,0 +1,5 @@
1
+ #import "RNSReactBaseView.h"
2
+
3
+ @implementation RNSReactBaseView
4
+
5
+ @end
@@ -0,0 +1,7 @@
1
+ #pragma once
2
+
3
+ #if __has_include(<RNScreens/RNScreens-Swift.h>)
4
+ #import <RNScreens/RNScreens-Swift.h>
5
+ #else
6
+ #import "RNScreens-Swift.h"
7
+ #endif