react-native-screens 5.0.0-alpha.2 → 5.0.0-alpha.4

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 (456) hide show
  1. package/Package.swift +87 -0
  2. package/README.md +0 -11
  3. package/android/build.gradle +1 -0
  4. package/android/consumer-rules.pro +3 -0
  5. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderConfigViewGroup.kt +2 -0
  6. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderSubviewViewGroup.kt +2 -0
  7. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledViewGroup.kt +18 -3
  8. package/android/src/main/cpp/NativeProxy.cpp +30 -6
  9. package/android/src/main/cpp/NativeProxy.h +7 -1
  10. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +7 -3
  12. package/android/src/main/java/com/swmansion/rnscreens/common/colorscheme/ColorSchemeCoordinator.kt +11 -1
  13. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +17 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/common/container/ContainerItem.kt +13 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/common/text/ReactTextAppearance.kt +62 -0
  16. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearance.kt +20 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearanceDefaults.kt +65 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetAppearanceCoordinator.kt +2 -2
  19. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetBehaviorController.kt +51 -20
  20. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetDimensionsCoordinator.kt +159 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetKeyboardCoordinator.kt +101 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetNativeDismissCoordinator.kt +2 -8
  23. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetAvailableHeightProvider.kt +44 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetContainer.kt +1 -1
  25. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialog.kt +36 -4
  26. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetDialogManager.kt +107 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeDelegate.kt +1 -1
  28. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeProvider.kt +1 -1
  29. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetDialogEventEmitter.kt +3 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetConfig.kt +1 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/model/FormSheetDetents.kt +152 -0
  32. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetAnimatorFactory.kt +9 -10
  33. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDimmingManager.kt +103 -0
  34. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDismissalOrigin.kt +22 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentation.kt +173 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentationManager.kt +290 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationState.kt +2 -2
  38. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetStackRegistry.kt +28 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/ext/FragmentManagerExt.kt +6 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/helpers/FragmentManagerHelper.kt +0 -3
  41. package/android/src/main/java/com/swmansion/rnscreens/helpers/NoTintDrawable.kt +31 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/helpers/PropIconResolver.kt +17 -23
  43. package/android/src/main/java/com/swmansion/rnscreens/helpers/ViewFinder.kt +0 -17
  44. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +32 -3
  45. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenContainer.kt +35 -3
  46. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +15 -0
  47. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderConfig.kt +7 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderSubviewManager.kt +7 -0
  49. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackViewManager.kt +6 -0
  50. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/DimmingView.kt +2 -0
  51. package/android/src/main/java/com/swmansion/rnscreens/legacy/stack/views/ScreensCoordinatorLayout.kt +2 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapper.kt +3 -3
  53. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapperViewManager.kt +1 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDetentChangedEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidAppearEvent.kt +1 -1
  56. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidDisappearEvent.kt +1 -1
  57. package/android/src/main/java/com/swmansion/rnscreens/react/modals/formsheet/event/FormSheetDismissEvent.kt +29 -0
  58. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissEvent.kt +1 -1
  59. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissPreventedEvent.kt +1 -1
  60. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetSyncFlushEvent.kt +1 -1
  61. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillAppearEvent.kt +1 -1
  62. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillDisappearEvent.kt +1 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetContentView.kt +3 -3
  64. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHost.kt +5 -3
  65. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostEventEmitter.kt +17 -10
  66. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostViewManager.kt +11 -9
  67. package/android/src/main/java/com/swmansion/rnscreens/safearea/OnInterfaceInsetsChangeListener.kt +15 -0
  68. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaProvider.kt +8 -8
  69. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaView.kt +3 -2
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +360 -101
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderBackPressHandler.kt +11 -0
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +211 -113
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +156 -24
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderContentScrimDrawable.kt +36 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderToolbar.kt +74 -0
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderCollapsedTitleGravityMode.kt +6 -0
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +162 -228
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +385 -12
  79. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +5 -6
  80. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +29 -6
  81. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderDelegate.kt +0 -7
  82. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +8 -7
  83. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +27 -280
  84. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuController.kt +448 -0
  85. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuDelegate.kt +10 -0
  86. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +28 -20
  87. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuConfig.kt +3 -55
  88. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuGroupMetadata.kt +1 -10
  89. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuItemConfig.kt +1 -3
  90. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuModel.kt +180 -0
  91. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementOptions.kt +57 -6
  92. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +3 -1
  93. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +1 -0
  94. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +4 -3
  95. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueue.kt +23 -9
  96. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperation.kt +1 -0
  97. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperationExecutor.kt +2 -1
  98. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +159 -21
  99. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerDelegate.kt +7 -0
  100. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerUpdateCoordinator.kt +5 -3
  101. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +27 -5
  102. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHostViewManager.kt +14 -0
  103. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackUpdateBatchStateProviding.kt +10 -0
  104. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/PreventNativeDismissCallback.kt +2 -2
  105. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +4 -0
  106. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +50 -10
  107. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragmentDelegate.kt +12 -0
  108. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceApplicator.kt +106 -10
  109. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +46 -7
  110. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceModel.kt +3 -0
  111. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/CustomBottomNavigationView.kt +21 -1
  112. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/MenuHelpers.kt +5 -23
  113. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +72 -36
  114. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainerDelegate.kt +11 -0
  115. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +22 -2
  116. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHostA11yCoordinator.kt +23 -2
  117. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +58 -17
  118. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenDelegate.kt +6 -0
  119. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenFragment.kt +3 -0
  120. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIcon.kt +82 -0
  121. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIconTinting.kt +17 -0
  122. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenViewManager.kt +26 -19
  123. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +20 -6
  124. package/android/src/main/java/com/swmansion/rnscreens/utils/RNSLog.kt +22 -6
  125. package/android/src/main/java/com/swmansion/rnscreens/utils/StyleUtils.kt +22 -0
  126. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_available_space.xml +8 -0
  127. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_entire_space.xml +8 -0
  128. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_available_space.xml +8 -0
  129. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_entire_space.xml +8 -0
  130. package/cpp/legacy/RNSScreenRemovalListener.cpp +31 -1
  131. package/cpp/legacy/RNSScreenRemovalListener.h +18 -3
  132. package/ios/RNSEnums.h +16 -1
  133. package/ios/conversion/RNSConversions.h +7 -108
  134. package/ios/helpers/image/RNSImageLoadingHelper.h +7 -0
  135. package/ios/helpers/image/RNSImageLoadingHelper.mm +9 -0
  136. package/ios/legacy/RNSBarButtonItem.mm +15 -0
  137. package/ios/legacy/RNSConvert.h +6 -0
  138. package/ios/legacy/RNSConvert.mm +17 -0
  139. package/ios/legacy/RNSFullWindowOverlay.mm +1 -1
  140. package/ios/legacy/RNSModalScreen.mm +1 -1
  141. package/ios/legacy/RNSNavigationBar.h +31 -0
  142. package/ios/legacy/RNSNavigationBar.mm +15 -0
  143. package/ios/legacy/RNSScreen.mm +130 -31
  144. package/ios/legacy/RNSScreenContentWrapper.mm +4 -1
  145. package/ios/legacy/RNSScreenStack.mm +202 -15
  146. package/ios/legacy/RNSScreenStackHeaderConfig.h +30 -0
  147. package/ios/legacy/RNSScreenStackHeaderConfig.mm +72 -17
  148. package/ios/legacy/RNSScreenStackHeaderSubview.mm +34 -1
  149. package/ios/legacy/RNSScreenWindowTraits.mm +5 -13
  150. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.h +1 -3
  151. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.mm +11 -22
  152. package/ios/modals/form-sheet/RNSFormSheetContentController.h +1 -1
  153. package/ios/modals/form-sheet/RNSFormSheetContentController.mm +7 -18
  154. package/ios/modals/form-sheet/RNSFormSheetHostComponentView.mm +4 -4
  155. package/ios/modals/form-sheet/RNSFormSheetHostShadowStateProxy.mm +2 -2
  156. package/ios/modals/form-sheet/RNSFormSheetUpdateFlags.h +3 -0
  157. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +3 -14
  158. package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.mm +2 -3
  159. package/ios/split/RNSSplitAppearanceApplicator.h +4 -4
  160. package/ios/split/RNSSplitAppearanceApplicator.mm +53 -56
  161. package/ios/split/RNSSplitHostComponentEventEmitter.h +1 -0
  162. package/ios/split/RNSSplitHostComponentEventEmitter.mm +1 -1
  163. package/ios/split/RNSSplitHostComponentView.h +5 -15
  164. package/ios/split/RNSSplitHostComponentView.mm +55 -6
  165. package/ios/split/RNSSplitHostController.h +25 -6
  166. package/ios/split/RNSSplitHostController.mm +24 -92
  167. package/ios/split/RNSSplitHostProviders.h +67 -0
  168. package/ios/split/RNSSplitScreenComponentView.h +0 -39
  169. package/ios/split/RNSSplitScreenComponentView.mm +27 -10
  170. package/ios/split/RNSSplitScreenController.h +26 -3
  171. package/ios/split/RNSSplitScreenController.mm +13 -30
  172. package/ios/split/RNSSplitScreenShadowStateProxy.h +1 -40
  173. package/ios/split/RNSSplitScreenShadowStateProxy.mm +1 -26
  174. package/ios/split/conversion/RNSConversions-SplitView.h +56 -0
  175. package/ios/{conversion → split/conversion}/RNSConversions-SplitView.mm +4 -1
  176. package/ios/stack/conversion/RNSConversions-Stack.h +62 -0
  177. package/ios/stack/conversion/RNSConversions-Stack.mm +134 -0
  178. package/ios/stack/header/RNSHeaderItemVisibilityPriority.h +9 -0
  179. package/ios/stack/header/RNSStackHeaderAppearanceMapper.h +26 -0
  180. package/ios/stack/header/RNSStackHeaderAppearanceMapper.mm +88 -0
  181. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +14 -1
  182. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +103 -37
  183. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +11 -0
  184. package/ios/stack/header/RNSStackHeaderConfigShadowStateProxy.mm +1 -1
  185. package/ios/stack/header/RNSStackHeaderContentFactory.mm +3 -0
  186. package/ios/stack/header/RNSStackHeaderIconResolver.mm +7 -0
  187. package/ios/stack/header/RNSStackHeaderItemComponentView.h +12 -3
  188. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +72 -5
  189. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +7 -0
  190. package/ios/stack/header/RNSStackHeaderItemShadowStateProxy.mm +1 -1
  191. package/ios/stack/header/RNSStackHeaderItemSpacerComponentView.mm +2 -1
  192. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +13 -0
  193. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +24 -0
  194. package/ios/stack/header/RNSStackHeaderMenuFinder.h +8 -1
  195. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +26 -9
  196. package/ios/stack/header/RNSStackHeaderMenuMapper.mm +4 -0
  197. package/ios/stack/host/RNSStackNavigationBar.h +25 -0
  198. package/ios/stack/host/RNSStackNavigationBar.mm +80 -0
  199. package/ios/stack/host/RNSStackNavigationBarCoordinator.h +8 -0
  200. package/ios/stack/host/RNSStackNavigationBarCoordinator.mm +11 -0
  201. package/ios/stack/host/RNSStackNavigationController.mm +13 -5
  202. package/ios/stack/host/RNSStackOperation.h +0 -2
  203. package/ios/stack/screen/RNSStackScreenComponentView.h +2 -1
  204. package/ios/stack/screen/RNSStackScreenComponentView.mm +32 -2
  205. package/ios/stack/screen/RNSStackScreenController.mm +12 -0
  206. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +8 -0
  207. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +179 -24
  208. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +110 -16
  209. package/ios/tabs/RNSTabBarItemCoordinator.h +16 -0
  210. package/ios/tabs/RNSTabBarItemCoordinator.mm +143 -0
  211. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +1 -1
  212. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +1 -1
  213. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +1 -1
  214. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm +1 -1
  215. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm +1 -1
  216. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.h +24 -0
  217. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.mm +22 -0
  218. package/ios/tabs/conversion/RNSConversions-Tabs.h +100 -0
  219. package/ios/{conversion → tabs/conversion}/RNSConversions-Tabs.mm +105 -74
  220. package/ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h +1 -1
  221. package/ios/tabs/host/RNSTabBarController.h +16 -0
  222. package/ios/tabs/host/RNSTabBarController.mm +516 -107
  223. package/ios/tabs/host/RNSTabsHostComponentView.h +4 -0
  224. package/ios/tabs/host/RNSTabsHostComponentView.mm +41 -4
  225. package/ios/tabs/host/RNSTabsHostEventEmitter.mm +1 -1
  226. package/ios/tabs/screen/RNSTabsScreenComponentView.h +21 -0
  227. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +56 -56
  228. package/ios/tabs/screen/RNSTabsScreenViewController.mm +1 -0
  229. package/ios/utils/RNSDefines.h +15 -7
  230. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +37 -21
  231. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  232. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +41 -4
  233. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  234. package/lib/commonjs/components/stack/header/StackHeaderConfig.js +17 -0
  235. package/lib/commonjs/components/stack/header/StackHeaderConfig.js.map +1 -0
  236. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  237. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  238. package/lib/commonjs/components/stack/host/StackHost.js +17 -7
  239. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  240. package/lib/commonjs/components/stack/host/StackHost.web.js +0 -2
  241. package/lib/commonjs/components/stack/host/StackHost.web.js.map +1 -1
  242. package/lib/commonjs/components/stack/index.js.map +1 -1
  243. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +3 -0
  244. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  245. package/lib/commonjs/components/tabs/host/{TabsHost.web.js → TabsHost.js} +1 -1
  246. package/lib/commonjs/components/tabs/host/TabsHost.js.map +1 -0
  247. package/lib/commonjs/components/tabs/index.js.map +1 -1
  248. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js +3 -1
  249. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js.map +1 -1
  250. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js +10 -1
  251. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  252. package/lib/commonjs/components/tabs/screen/{TabsScreen.web.js → TabsScreen.js} +1 -1
  253. package/lib/commonjs/components/tabs/screen/TabsScreen.js.map +1 -0
  254. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js → tabs/screen/TabsScreenIcon.types.js} +1 -1
  255. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  256. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  257. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  258. package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  259. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  260. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  261. package/lib/commonjs/fabric/stack/StackHostNativeComponent.js.map +1 -1
  262. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  263. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  264. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  265. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  266. package/lib/commonjs/legacy/components/ScreenStackItem.js +31 -11
  267. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  268. package/lib/module/components/stack/header/StackHeaderConfig.android.js +39 -23
  269. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  270. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +43 -6
  271. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  272. package/lib/module/components/stack/header/StackHeaderConfig.js +10 -0
  273. package/lib/module/components/stack/header/StackHeaderConfig.js.map +1 -0
  274. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  275. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  276. package/lib/module/components/stack/host/StackHost.js +18 -8
  277. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  278. package/lib/module/components/stack/host/StackHost.web.js +0 -3
  279. package/lib/module/components/stack/host/StackHost.web.js.map +1 -1
  280. package/lib/module/components/stack/index.js.map +1 -1
  281. package/lib/module/components/tabs/host/TabsHost.ios.js +3 -0
  282. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  283. package/{src/components/tabs/host/TabsHost.web.tsx → lib/module/components/tabs/host/TabsHost.js} +1 -2
  284. package/lib/module/components/tabs/host/TabsHost.js.map +1 -0
  285. package/lib/module/components/tabs/index.js.map +1 -1
  286. package/lib/module/components/tabs/screen/TabsScreen.android.js +3 -1
  287. package/lib/module/components/tabs/screen/TabsScreen.android.js.map +1 -1
  288. package/lib/module/components/tabs/screen/TabsScreen.ios.js +10 -1
  289. package/lib/module/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  290. package/{src/components/tabs/screen/TabsScreen.web.tsx → lib/module/components/tabs/screen/TabsScreen.js} +1 -2
  291. package/lib/module/components/tabs/screen/TabsScreen.js.map +1 -0
  292. package/lib/module/components/tabs/screen/TabsScreenIcon.types.js +2 -0
  293. package/lib/module/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  294. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  295. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  296. package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  297. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  298. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  299. package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
  300. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  301. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  302. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  303. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  304. package/lib/module/legacy/components/ScreenStackItem.js +31 -11
  305. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  306. package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +1 -1
  307. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts +6 -3
  308. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  309. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +620 -24
  310. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  311. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts +8 -0
  312. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts.map +1 -0
  313. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts +6 -3
  314. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  315. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +361 -2
  316. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  317. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +4 -2
  318. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts.map +1 -1
  319. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  320. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +7 -0
  321. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  322. package/lib/typescript/components/stack/host/StackHost.d.ts +1 -1
  323. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  324. package/lib/typescript/components/stack/host/StackHost.types.d.ts +47 -0
  325. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  326. package/lib/typescript/components/stack/host/StackHost.web.d.ts +1 -3
  327. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  328. package/lib/typescript/components/stack/index.d.ts +4 -3
  329. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  330. package/lib/typescript/components/tabs/host/TabsHost.d.ts +5 -0
  331. package/lib/typescript/components/tabs/host/TabsHost.d.ts.map +1 -0
  332. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  333. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +72 -0
  334. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  335. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +3 -0
  336. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -1
  337. package/lib/typescript/components/tabs/index.d.ts +4 -6
  338. package/lib/typescript/components/tabs/index.d.ts.map +1 -1
  339. package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts.map +1 -1
  340. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts +42 -7
  341. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts.map +1 -1
  342. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts +5 -0
  343. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts.map +1 -0
  344. package/lib/typescript/components/tabs/screen/TabsScreen.ios.d.ts.map +1 -1
  345. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts +78 -13
  346. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts.map +1 -1
  347. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts +91 -0
  348. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts.map +1 -0
  349. package/lib/typescript/components/tabs/screen/index.d.ts +1 -0
  350. package/lib/typescript/components/tabs/screen/index.d.ts.map +1 -1
  351. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -0
  352. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  353. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +1 -0
  354. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  355. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +52 -0
  356. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
  357. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +29 -1
  358. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  359. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +8 -0
  360. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  361. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +3 -1
  362. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
  363. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +4 -0
  364. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  365. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +6 -0
  366. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  367. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +10 -1
  368. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  369. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +25 -0
  370. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  371. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +4 -0
  372. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  373. package/lib/typescript/legacy/types.d.ts +30 -0
  374. package/lib/typescript/legacy/types.d.ts.map +1 -1
  375. package/package.json +11 -8
  376. package/react-native.config.js +3 -0
  377. package/src/components/modals/form-sheet/FormSheet.types.ts +1 -1
  378. package/src/components/stack/header/StackHeaderConfig.android.tsx +54 -43
  379. package/src/components/stack/header/StackHeaderConfig.android.types.ts +641 -24
  380. package/src/components/stack/header/StackHeaderConfig.ios.tsx +55 -17
  381. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +384 -2
  382. package/src/components/stack/header/StackHeaderConfig.tsx +12 -0
  383. package/src/components/stack/header/StackHeaderConfig.types.ts +4 -2
  384. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +9 -1
  385. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +7 -0
  386. package/src/components/stack/host/StackHost.tsx +12 -3
  387. package/src/components/stack/host/StackHost.types.ts +50 -0
  388. package/src/components/stack/host/StackHost.web.tsx +1 -4
  389. package/src/components/stack/index.ts +14 -1
  390. package/src/components/tabs/host/TabsHost.ios.tsx +3 -0
  391. package/src/components/tabs/host/TabsHost.ios.types.ts +76 -0
  392. package/src/components/tabs/host/TabsHost.tsx +7 -0
  393. package/src/components/tabs/host/TabsHost.types.ts +3 -0
  394. package/src/components/tabs/index.ts +9 -0
  395. package/src/components/tabs/screen/TabsScreen.android.tsx +8 -3
  396. package/src/components/tabs/screen/TabsScreen.android.types.ts +42 -7
  397. package/src/components/tabs/screen/TabsScreen.ios.tsx +22 -5
  398. package/src/components/tabs/screen/TabsScreen.ios.types.ts +79 -17
  399. package/src/components/tabs/screen/TabsScreen.tsx +7 -0
  400. package/src/components/tabs/screen/TabsScreenIcon.types.ts +117 -0
  401. package/src/components/tabs/screen/index.ts +1 -0
  402. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -0
  403. package/src/fabric/legacy/ScreenStackNativeComponent.ts +2 -0
  404. package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +78 -0
  405. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +43 -0
  406. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +13 -0
  407. package/src/fabric/stack/StackHostNativeComponent.ts +11 -2
  408. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +8 -0
  409. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +9 -0
  410. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +20 -2
  411. package/src/legacy/components/ScreenStackItem.tsx +59 -12
  412. package/src/legacy/types.ts +31 -0
  413. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenModalFragment.kt +0 -281
  414. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogRootView.kt +0 -104
  415. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogScreen.kt +0 -26
  416. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingView.kt +0 -83
  417. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewManager.kt +0 -89
  418. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewPointerEvents.kt +0 -18
  419. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetDimensionsCoordinator.kt +0 -134
  420. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialogManager.kt +0 -162
  421. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/model/FormSheetDetents.kt +0 -106
  422. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentationManager.kt +0 -198
  423. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuSelectionController.kt +0 -83
  424. package/ios/conversion/RNSConversions-Stack.h +0 -32
  425. package/ios/conversion/RNSConversions-Stack.mm +0 -41
  426. package/ios/conversion/always_false.h +0 -31
  427. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js +0 -10
  428. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  429. package/lib/commonjs/components/tabs/host/TabsHost.d.js +0 -2
  430. package/lib/commonjs/components/tabs/host/TabsHost.d.js.map +0 -1
  431. package/lib/commonjs/components/tabs/host/TabsHost.web.js.map +0 -1
  432. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js +0 -2
  433. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js.map +0 -1
  434. package/lib/commonjs/components/tabs/screen/TabsScreen.web.js.map +0 -1
  435. package/lib/module/components/stack/header/StackHeaderConfig.d.js +0 -2
  436. package/lib/module/components/stack/header/StackHeaderConfig.web.js +0 -4
  437. package/lib/module/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  438. package/lib/module/components/tabs/host/TabsHost.d.js +0 -2
  439. package/lib/module/components/tabs/host/TabsHost.d.js.map +0 -1
  440. package/lib/module/components/tabs/host/TabsHost.web.js +0 -4
  441. package/lib/module/components/tabs/host/TabsHost.web.js.map +0 -1
  442. package/lib/module/components/tabs/screen/TabsScreen.d.js +0 -2
  443. package/lib/module/components/tabs/screen/TabsScreen.d.js.map +0 -1
  444. package/lib/module/components/tabs/screen/TabsScreen.web.js +0 -4
  445. package/lib/module/components/tabs/screen/TabsScreen.web.js.map +0 -1
  446. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +0 -7
  447. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +0 -1
  448. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +0 -7
  449. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +0 -1
  450. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +0 -7
  451. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +0 -1
  452. package/src/components/stack/header/StackHeaderConfig.d.ts +0 -22
  453. package/src/components/stack/header/StackHeaderConfig.web.tsx +0 -5
  454. package/src/components/tabs/host/TabsHost.d.ts +0 -12
  455. package/src/components/tabs/screen/TabsScreen.d.ts +0 -12
  456. /package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.h +0 -0
@@ -1,6 +1,8 @@
1
1
  #import "RNSStackHeaderConfigComponentView.h"
2
+ #import "RNSConversions-Stack.h"
2
3
  #import "RNSConversions.h"
3
4
  #import "RNSImageLoadingHelper.h"
5
+ #import "RNSStackHeaderAppearanceMapper.h"
4
6
  #import "RNSStackHeaderConfigEventEmitter.h"
5
7
  #import "RNSStackHeaderConfigShadowStateProxy.h"
6
8
  #import "RNSStackHeaderItemComponentView.h"
@@ -12,7 +14,6 @@
12
14
  #import "RNSStackNavigationController.h"
13
15
  #import "RNSStackScreenComponentView.h"
14
16
  #import "RNSStackScreenController.h"
15
- #import "RNSStackScreenHeaderCoordinator.h"
16
17
 
17
18
  #import <React/RCTConversions.h>
18
19
  #import <React/RCTConvert.h>
@@ -20,8 +21,8 @@
20
21
  #import <React/RCTLog.h>
21
22
  #import <react/renderer/components/rnscreens/Props.h>
22
23
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
24
+ #import <react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
23
25
  #import <react/utils/ManagedObjectWrapper.h>
24
- #import <rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
25
26
 
26
27
  namespace react = facebook::react;
27
28
 
@@ -67,7 +68,19 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
67
68
  _largeTitle = nil;
68
69
  _largeSubtitle = nil;
69
70
  _largeTitleEnabled = NO;
71
+ _prompt = nil;
72
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
73
+ if (@available(iOS 27.0, *)) {
74
+ _minimizationBehavior = UIBarMinimizationBehaviorAutomatic;
75
+ _restorationBehavior = UIBarMinimizationRestorationBehaviorAutomatic;
76
+ }
77
+ #endif // Check for iOS >= 27
78
+ _backButtonTitle = nil;
79
+ _backButtonDisplayMode = UINavigationItemBackButtonDisplayModeDefault;
80
+ _backButtonMenuEnabled = YES;
70
81
  _titleMenu = nil;
82
+ _standardAppearance = nil;
83
+ _scrollEdgeAppearance = nil;
71
84
  }
72
85
 
73
86
  - (NSArray<id> *)children
@@ -123,18 +136,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
123
136
  {
124
137
  if (self.window != nil) {
125
138
  [[self requireNavigationController] setNavigationBarFrameChangeDelegate:self];
126
- RNSStackScreenHeaderCoordinator *coordinator = [self headerCoordinator];
127
- coordinator.configDataProvider = self;
128
- coordinator.frameChangeDelegate = self;
129
- coordinator.eventsDelegate = self;
130
- coordinator.imageLoader = self;
131
- [coordinator rebuild];
132
- } else {
133
- RNSStackScreenHeaderCoordinator *coordinator = [self headerCoordinator];
134
- coordinator.configDataProvider = nil;
135
- coordinator.frameChangeDelegate = nil;
136
- coordinator.eventsDelegate = nil;
137
- coordinator.imageLoader = nil;
139
+ [self.headerCoordinator rebuild];
138
140
  }
139
141
  [super didMoveToWindow];
140
142
  }
@@ -155,7 +157,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
155
157
  ((RNSStackHeaderItemSpacerComponentView *)childComponentView).invalidationDelegate = self;
156
158
  }
157
159
 
158
- [[self headerCoordinator] rebuild];
160
+ [self.headerCoordinator rebuild];
159
161
  }
160
162
 
161
163
  - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
@@ -169,7 +171,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
169
171
  }
170
172
 
171
173
  [_children removeObjectAtIndex:index];
172
- [[self headerCoordinator] rebuild];
174
+ [self.headerCoordinator rebuild];
173
175
  }
174
176
 
175
177
  #pragma mark - RNSStackHeaderItemInvalidationDelegate
@@ -178,22 +180,21 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
178
180
  {
179
181
  if (itemId == nil) {
180
182
  RCTLogWarn(@"[RNScreens] headerItemDidInvalidateWithId called with nil id, will run full header rebuild");
181
- [[self headerCoordinator] rebuild];
183
+ [self.headerCoordinator rebuild];
182
184
  return;
183
185
  }
184
- [[self headerCoordinator] rebuildItemWithId:itemId];
186
+ [self.headerCoordinator rebuildItemWithId:itemId];
185
187
  }
186
188
 
187
189
  - (void)headerItemMenuDidChangeWithId:(NSString *)itemId
188
190
  {
189
191
  if (itemId == nil) {
190
192
  RCTLogWarn(@"[RNScreens] headerItemMenuDidChangeWithId called with nil id, will run full header rebuild");
191
- [[self headerCoordinator] rebuild];
193
+ [self.headerCoordinator rebuild];
192
194
  return;
193
195
  }
194
- RNSStackScreenHeaderCoordinator *coordinator = [self headerCoordinator];
195
- [coordinator resetTrackerForItemWithId:itemId];
196
- [coordinator reapplyMenuForItemWithId:itemId];
196
+ [self.headerCoordinator resetTrackerForItemWithId:itemId];
197
+ [self.headerCoordinator reapplyMenuForItemWithId:itemId];
197
198
  }
198
199
 
199
200
  /**
@@ -204,15 +205,15 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
204
205
  if (itemId == nil) {
205
206
  RCTLogWarn(
206
207
  @"[RNScreens] headerItemMenuDidUpdateFromCommandWithId called with nil id, will run full header rebuild");
207
- [[self headerCoordinator] rebuild];
208
+ [self.headerCoordinator rebuild];
208
209
  return;
209
210
  }
210
- [[self headerCoordinator] reapplyMenuForItemWithId:itemId];
211
+ [self.headerCoordinator reapplyMenuForItemWithId:itemId];
211
212
  }
212
213
 
213
214
  - (void)headerItemSpacerDidInvalidate
214
215
  {
215
- [[self headerCoordinator] rebuild];
216
+ [self.headerCoordinator rebuild];
216
217
  }
217
218
 
218
219
  #pragma mark - RNSStackHeaderEventsDelegate
@@ -295,11 +296,11 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
295
296
  (oldItemData.itemType == RNSMenuItemTypeAutomatic &&
296
297
  [RNSStackHeaderMenuFinder singleSelectionRootForElementWithId:menuItemId inMenu:locator.rootMenu] != nil);
297
298
  if (isToggle) {
298
- [[self headerCoordinator] setToggleState:updateOptions.toggleState
299
- forMenuElementId:menuItemId
300
- trackerItemId:locator.trackerItemId
301
- rootMenu:locator.rootMenu
302
- parentMenu:locator.searchResult.parentMenu];
299
+ [self.headerCoordinator setToggleState:updateOptions.toggleState
300
+ forMenuElementId:menuItemId
301
+ trackerItemId:locator.trackerItemId
302
+ rootMenu:locator.rootMenu
303
+ parentMenu:locator.searchResult.parentMenu];
303
304
  }
304
305
  }
305
306
 
@@ -310,7 +311,8 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
310
311
  [static_cast<RNSStackHeaderItemComponentView *>(locator.headerItem)
311
312
  updateMenuElementWithId:menuItemId
312
313
  withElement:newItemData
313
- parentMenu:locator.searchResult.parentMenu];
314
+ parentMenu:locator.searchResult.parentMenu
315
+ inMenuRepresentation:locator.inMenuRepresentation];
314
316
  break;
315
317
  case RNSMenuElementPositionTitle:
316
318
  if (locator.searchResult.parentMenu != nil) {
@@ -318,7 +320,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
318
320
  replacingChildWithId:menuItemId
319
321
  withElement:newItemData];
320
322
  }
321
- [[self headerCoordinator] reapplyTitleMenu];
323
+ [self.headerCoordinator reapplyTitleMenu];
322
324
  break;
323
325
  case RNSMenuElementPositionOverflow:
324
326
  // TODO: handle overflow menu
@@ -356,7 +358,8 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
356
358
  [static_cast<RNSStackHeaderItemComponentView *>(locator.headerItem)
357
359
  updateMenuElementWithId:menuElementId
358
360
  withElement:newMenuItem
359
- parentMenu:locator.searchResult.parentMenu];
361
+ parentMenu:locator.searchResult.parentMenu
362
+ inMenuRepresentation:locator.inMenuRepresentation];
360
363
  break;
361
364
  case RNSMenuElementPositionTitle:
362
365
  if (locator.searchResult.parentMenu == nil) {
@@ -366,7 +369,7 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
366
369
  replacingChildWithId:menuElementId
367
370
  withElement:newMenuItem];
368
371
  }
369
- [[self headerCoordinator] reapplyTitleMenu];
372
+ [self.headerCoordinator reapplyTitleMenu];
370
373
  break;
371
374
  case RNSMenuElementPositionOverflow:
372
375
  // TODO: handle overflow menu
@@ -444,6 +447,60 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
444
447
  _largeTitleEnabled = newHeaderProps.largeTitleEnabled;
445
448
  }
446
449
 
450
+ if (oldHeaderProps.prompt != newHeaderProps.prompt) {
451
+ _prompt = RCTNSStringFromStringNilIfEmpty(newHeaderProps.prompt);
452
+ }
453
+
454
+ if (oldHeaderProps.minimizationBehavior != newHeaderProps.minimizationBehavior) {
455
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
456
+ if (@available(iOS 27.0, *)) {
457
+ _minimizationBehavior =
458
+ rnscreens::conversion::UIBarMinimizationBehaviorFromReactRNSStackHeaderConfigIOSMinimizationBehavior(
459
+ newHeaderProps.minimizationBehavior);
460
+ } else
461
+ #endif // Check for iOS >= 27
462
+ if (newHeaderProps.minimizationBehavior != react::RNSStackHeaderConfigIOSMinimizationBehavior::Automatic) {
463
+ RCTLogWarn(@"[RNScreens] minimizationBehavior is supported for iOS >= 27");
464
+ }
465
+ }
466
+
467
+ if (oldHeaderProps.restorationBehavior != newHeaderProps.restorationBehavior) {
468
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
469
+ if (@available(iOS 27.0, *)) {
470
+ _restorationBehavior = rnscreens::conversion::
471
+ UIBarMinimizationRestorationBehaviorFromReactRNSStackHeaderConfigIOSRestorationBehavior(
472
+ newHeaderProps.restorationBehavior);
473
+ } else
474
+ #endif // Check for iOS >= 27
475
+ if (newHeaderProps.restorationBehavior != react::RNSStackHeaderConfigIOSRestorationBehavior::Automatic) {
476
+ RCTLogWarn(@"[RNScreens] restorationBehavior is supported for iOS >= 27");
477
+ }
478
+ }
479
+
480
+ if (oldHeaderProps.backButtonTitle != newHeaderProps.backButtonTitle) {
481
+ _backButtonTitle = RCTNSStringFromStringNilIfEmpty(newHeaderProps.backButtonTitle);
482
+ }
483
+
484
+ if (oldHeaderProps.backButtonDisplayMode != newHeaderProps.backButtonDisplayMode) {
485
+ _backButtonDisplayMode = rnscreens::conversion::
486
+ UINavigationItemBackButtonDisplayModeFromReactRNSStackHeaderConfigIOSBackButtonDisplayMode(
487
+ newHeaderProps.backButtonDisplayMode);
488
+ }
489
+
490
+ if (oldHeaderProps.backButtonMenuEnabled != newHeaderProps.backButtonMenuEnabled) {
491
+ _backButtonMenuEnabled = newHeaderProps.backButtonMenuEnabled;
492
+ }
493
+
494
+ if (oldHeaderProps.standardAppearance != newHeaderProps.standardAppearance) {
495
+ _standardAppearance = [RNSStackHeaderAppearanceMapper
496
+ appearanceFromDictionary:[self dictionaryFromAppearanceProp:newHeaderProps.standardAppearance]];
497
+ }
498
+
499
+ if (oldHeaderProps.scrollEdgeAppearance != newHeaderProps.scrollEdgeAppearance) {
500
+ _scrollEdgeAppearance = [RNSStackHeaderAppearanceMapper
501
+ scrollEdgeAppearanceFromDictionary:[self dictionaryFromAppearanceProp:newHeaderProps.scrollEdgeAppearance]];
502
+ }
503
+
447
504
  if (oldHeaderProps.titleMenu != newHeaderProps.titleMenu) {
448
505
  _titleMenu = [RNSStackHeaderMenuMapper
449
506
  menuFromDictionary:rnscreens::conversion::RNSConvertFollyDynamicToId(newHeaderProps.titleMenu)];
@@ -452,14 +509,14 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
452
509
 
453
510
  [super updateProps:props oldProps:oldProps];
454
511
 
455
- [[self headerCoordinator] applyConfigProperties];
512
+ [self.headerCoordinator applyConfigProperties];
456
513
 
457
514
  if (titleMenuDidChange) {
458
515
  // title menu is a prop on the navigation item, not on one of the bar button items
459
516
  // thus it is not configured with matching RNSStackHeaderItemComponentView
460
517
  // but here directly
461
- [[self headerCoordinator] resetTitleMenuTracker];
462
- [[self headerCoordinator] reapplyTitleMenu];
518
+ [self.headerCoordinator resetTitleMenuTracker];
519
+ [self.headerCoordinator reapplyTitleMenu];
463
520
  }
464
521
  }
465
522
 
@@ -482,6 +539,15 @@ static void RNSAssertIsValidHeaderChild(UIView *child)
482
539
 
483
540
  #pragma mark - Private
484
541
 
542
+ - (nullable NSDictionary *)dictionaryFromAppearanceProp:(const folly::dynamic &)appearanceProp
543
+ {
544
+ if (appearanceProp.type() != folly::dynamic::OBJECT) {
545
+ return nil;
546
+ }
547
+
548
+ return rnscreens::conversion::RNSConvertFollyDynamicToId(appearanceProp);
549
+ }
550
+
485
551
  - (nullable RNSStackScreenHeaderCoordinator *)headerCoordinator
486
552
  {
487
553
  if (self.superview == nil) {
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #import <UIKit/UIKit.h>
4
+ #import "RNSDefines.h"
4
5
 
5
6
  @class RNSStackHeaderMenuData;
6
7
 
@@ -14,7 +15,17 @@ NS_ASSUME_NONNULL_BEGIN
14
15
  @property (nonatomic, readonly, nullable) NSString *largeTitle;
15
16
  @property (nonatomic, readonly, nullable) NSString *largeSubtitle;
16
17
  @property (nonatomic, readonly) BOOL largeTitleEnabled;
18
+ @property (nonatomic, readonly, nullable) NSString *prompt;
19
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0)
20
+ @property (nonatomic, readonly) UIBarMinimizationBehavior minimizationBehavior API_AVAILABLE(ios(27.0));
21
+ @property (nonatomic, readonly) UIBarMinimizationRestorationBehavior restorationBehavior API_AVAILABLE(ios(27.0));
22
+ #endif // Check for iOS >= 27
23
+ @property (nonatomic, readonly, nullable) NSString *backButtonTitle;
24
+ @property (nonatomic, readonly) UINavigationItemBackButtonDisplayMode backButtonDisplayMode;
25
+ @property (nonatomic, readonly) BOOL backButtonMenuEnabled;
17
26
  @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *titleMenu;
27
+ @property (nonatomic, readonly, nullable) UINavigationBarAppearance *standardAppearance;
28
+ @property (nonatomic, readonly, nullable) UINavigationBarAppearance *scrollEdgeAppearance;
18
29
 
19
30
  /**
20
31
  Children are expected to conform to either RNSStackHeaderItemDataProviding
@@ -2,7 +2,7 @@
2
2
  #import "RNSStackHeaderConfigComponentView.h"
3
3
 
4
4
  #import <React/RCTConversions.h>
5
- #import <rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
5
+ #import <react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h>
6
6
 
7
7
  namespace react = facebook::react;
8
8
 
@@ -51,6 +51,9 @@
51
51
  action:nil];
52
52
  }
53
53
 
54
+ barButtonItem.style = item.style;
55
+ barButtonItem.enabled = !item.disabled;
56
+
54
57
  if (item.icon != nil) {
55
58
  __weak UIBarButtonItem *weakBarButtonItem = barButtonItem;
56
59
  UIImage *syncImage = [RNSStackHeaderIconResolver resolveIcon:item.icon
@@ -1,4 +1,5 @@
1
1
  #import "RNSStackHeaderIconResolver.h"
2
+ #import <React/RCTLog.h>
2
3
 
3
4
  @implementation RNSStackHeaderIconResolver
4
5
 
@@ -18,11 +19,17 @@
18
19
  switch (iconData.iconType) {
19
20
  case RNSStackHeaderIconTypeSfSymbol: {
20
21
  UIImage *image = [UIImage systemImageNamed:iconData.resourceName];
22
+ if (image == nil && iconData.resourceName != nil) {
23
+ RCTLogWarn(@"[RNScreens] Failed to load SF Symbol \"%@\" for header icon", iconData.resourceName);
24
+ }
21
25
  iconData.resolvedImage = image;
22
26
  return image;
23
27
  }
24
28
  case RNSStackHeaderIconTypeXcasset: {
25
29
  UIImage *image = [UIImage imageNamed:iconData.resourceName];
30
+ if (image == nil && iconData.resourceName != nil) {
31
+ RCTLogWarn(@"[RNScreens] Failed to load xcasset \"%@\" for header icon", iconData.resourceName);
32
+ }
26
33
  iconData.resolvedImage = image;
27
34
  return image;
28
35
  }
@@ -12,27 +12,36 @@ NS_ASSUME_NONNULL_BEGIN
12
12
 
13
13
  @property (nonatomic, readonly) RNSHeaderItemPlacement placement;
14
14
  @property (nonatomic, readonly, nullable) NSString *itemId;
15
+ @property (nonatomic, readonly, nullable) NSString *identifier;
15
16
  @property (nonatomic, readonly, nullable) NSString *title;
16
17
  @property (nonatomic, readonly, nullable) RNSStackHeaderIconData *icon;
17
18
  @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menu;
19
+ @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menuRepresentation;
18
20
  @property (nonatomic, readonly, nullable) UIView *customView;
21
+ @property (nonatomic, readonly) UIBarButtonItemStyle style;
22
+ @property (nonatomic, readonly) BOOL disabled;
19
23
  @property (nonatomic, readonly) BOOL respondsToOnPress;
24
+ @property (nonatomic, readonly) BOOL hidesSharedBackground;
25
+ @property (nonatomic, readonly) RNSHeaderItemVisibilityPriority visibilityPriority;
20
26
 
21
27
  @property (nonatomic, nullable) NSString *titleProp;
22
28
  @property (nonatomic, nullable) RNSStackHeaderIconData *iconProp;
23
29
  @property (nonatomic, nullable) RNSStackHeaderMenuData *menuProp;
30
+ @property (nonatomic, nullable) RNSStackHeaderMenuData *menuRepresentationProp;
24
31
 
25
32
  @property (nonatomic, weak, nullable) id<RNSStackHeaderItemInvalidationDelegate> invalidationDelegate;
26
33
 
27
34
  - (void)emitOnPress;
28
35
 
29
36
  /**
30
- * Replaces a menu element in the item's menu tree with a new element constructed from command options.
37
+ * Replaces a menu element in the item's menu or menuRepresentation tree with a new element
38
+ * constructed from command options.
31
39
  * If parentMenu is nil, the element is the root menu and is replaced directly.
32
40
  */
33
41
  - (void)updateMenuElementWithId:(NSString *)elementId
34
42
  withElement:(id<RNSStackHeaderMenuElement>)newElement
35
- parentMenu:(nullable RNSStackHeaderMenuData *)parentMenu;
43
+ parentMenu:(nullable RNSStackHeaderMenuData *)parentMenu
44
+ inMenuRepresentation:(BOOL)inMenuRepresentation;
36
45
 
37
46
  @end
38
47
 
@@ -42,7 +51,7 @@ NS_ASSUME_NONNULL_END
42
51
 
43
52
  #if defined(__cplusplus)
44
53
 
45
- #import <rnscreens/RNSStackHeaderItemComponentDescriptor.h>
54
+ #import <react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h>
46
55
 
47
56
  @interface RNSStackHeaderItemComponentView ()
48
57
 
@@ -13,7 +13,7 @@
13
13
  #import <React/RCTLog.h>
14
14
  #import <react/renderer/components/rnscreens/Props.h>
15
15
  #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
16
- #import <rnscreens/RNSStackHeaderItemComponentDescriptor.h>
16
+ #import <react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h>
17
17
 
18
18
  namespace react = facebook::react;
19
19
 
@@ -45,12 +45,18 @@ namespace react = facebook::react;
45
45
  - (void)resetProps
46
46
  {
47
47
  _itemId = nil;
48
+ _identifier = nil;
48
49
  [self setTitleProp:nil];
49
50
  [self setIconProp:nil];
50
51
  [self setMenuProp:nil];
52
+ [self setMenuRepresentationProp:nil];
51
53
  _placement = RNSHeaderItemPlacementTrailing;
52
54
  _didSetHeaderItemPlacement = NO;
55
+ _style = UIBarButtonItemStylePlain;
56
+ _disabled = NO;
53
57
  _respondsToOnPress = NO;
58
+ _hidesSharedBackground = NO;
59
+ _visibilityPriority = RNSHeaderItemVisibilityPriorityStandard;
54
60
  }
55
61
 
56
62
  - (void)setTitleProp:(NSString *)titleProp
@@ -71,6 +77,12 @@ namespace react = facebook::react;
71
77
  _menu = menuProp;
72
78
  }
73
79
 
80
+ - (void)setMenuRepresentationProp:(RNSStackHeaderMenuData *)menuRepresentationProp
81
+ {
82
+ _menuRepresentationProp = menuRepresentationProp;
83
+ _menuRepresentation = menuRepresentationProp;
84
+ }
85
+
74
86
  - (void)emitOnPress
75
87
  {
76
88
  [_headerItemEventEmitter emitOnPress];
@@ -79,11 +91,22 @@ namespace react = facebook::react;
79
91
  - (void)updateMenuElementWithId:(NSString *)elementId
80
92
  withElement:(id<RNSStackHeaderMenuElement>)newElement
81
93
  parentMenu:(nullable RNSStackHeaderMenuData *)parentMenu
94
+ inMenuRepresentation:(BOOL)inMenuRepresentation
82
95
  {
83
- if (parentMenu == nil) {
84
- _menu = (RNSStackHeaderMenuData *)newElement;
96
+ if (inMenuRepresentation) {
97
+ if (parentMenu == nil) {
98
+ _menuRepresentation = (RNSStackHeaderMenuData *)newElement;
99
+ } else {
100
+ _menuRepresentation = [RNSStackHeaderMenuCoordinator menu:_menuRepresentation
101
+ replacingChildWithId:elementId
102
+ withElement:newElement];
103
+ }
85
104
  } else {
86
- _menu = [RNSStackHeaderMenuCoordinator menu:_menu replacingChildWithId:elementId withElement:newElement];
105
+ if (parentMenu == nil) {
106
+ _menu = (RNSStackHeaderMenuData *)newElement;
107
+ } else {
108
+ _menu = [RNSStackHeaderMenuCoordinator menu:_menu replacingChildWithId:elementId withElement:newElement];
109
+ }
87
110
  }
88
111
  [_invalidationDelegate headerItemMenuDidUpdateFromCommandWithId:_itemId];
89
112
  }
@@ -183,11 +206,17 @@ RNS_IGNORE_SUPER_CALL_END
183
206
  _itemId = RCTNSStringFromStringNilIfEmpty(newItemProps.itemId);
184
207
  }
185
208
 
209
+ if (oldItemProps.identifier != newItemProps.identifier) {
210
+ _identifier = RCTNSStringFromStringNilIfEmpty(newItemProps.identifier);
211
+ needsUpdate = YES;
212
+ }
213
+
186
214
  if (oldItemProps.placement != newItemProps.placement) {
187
215
  if (_didSetHeaderItemPlacement) {
188
216
  RCTLogWarn(@"[RNScreens] Changing header item placement at runtime is not supported");
189
217
  } else {
190
- _placement = rnscreens::conversion::convert<RNSHeaderItemPlacement>(newItemProps.placement);
218
+ _placement =
219
+ rnscreens::conversion::RNSHeaderItemPlacementFromReactRNSStackHeaderItemIOSPlacement(newItemProps.placement);
191
220
  }
192
221
  }
193
222
  _didSetHeaderItemPlacement = YES;
@@ -209,11 +238,49 @@ RNS_IGNORE_SUPER_CALL_END
209
238
  menuDidChange = YES;
210
239
  }
211
240
 
241
+ if (oldItemProps.menuRepresentation != newItemProps.menuRepresentation) {
242
+ [self setMenuRepresentationProp:[RNSStackHeaderMenuMapper
243
+ menuFromDictionary:rnscreens::conversion::RNSConvertFollyDynamicToId(
244
+ newItemProps.menuRepresentation)]];
245
+ // menu representation is applied together with the menu & shares its toggle state tracker,
246
+ // so it follows the same invalidation path
247
+ menuDidChange = YES;
248
+ }
249
+
250
+ if (oldItemProps.variant != newItemProps.variant) {
251
+ _style = rnscreens::conversion::UIBarButtonItemStyleFromReactRNSStackHeaderItemIOSVariant(newItemProps.variant);
252
+ needsUpdate = YES;
253
+ }
254
+
255
+ if (oldItemProps.disabled != newItemProps.disabled) {
256
+ _disabled = newItemProps.disabled;
257
+ needsUpdate = YES;
258
+ }
259
+
212
260
  if (oldItemProps.respondsToOnPress != newItemProps.respondsToOnPress) {
213
261
  _respondsToOnPress = newItemProps.respondsToOnPress;
214
262
  needsUpdate = YES;
215
263
  }
216
264
 
265
+ if (oldItemProps.hidesSharedBackground != newItemProps.hidesSharedBackground) {
266
+ _hidesSharedBackground = newItemProps.hidesSharedBackground;
267
+ needsUpdate = YES;
268
+ }
269
+
270
+ if (oldItemProps.visibilityPriority != newItemProps.visibilityPriority) {
271
+ _visibilityPriority =
272
+ rnscreens::conversion::RNSHeaderItemVisibilityPriorityFromReactRNSStackHeaderItemIOSVisibilityPriority(
273
+ newItemProps.visibilityPriority);
274
+ // tvOS and visionOS are excluded on purpose: `visibilityPriority` exists there, but the only
275
+ // supported value is `standard`, which is already the default.
276
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(27_0) && !TARGET_OS_TV && !TARGET_OS_VISION
277
+ // The item is rebuilt only on iOS 27+, where the priority is actually applied.
278
+ if (@available(iOS 27.0, *)) {
279
+ needsUpdate = YES;
280
+ }
281
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(27_0) && !TARGET_OS_TV && !TARGET_OS_VISION
282
+ }
283
+
217
284
  [super updateProps:props oldProps:oldProps];
218
285
 
219
286
  if (needsUpdate) {
@@ -3,6 +3,7 @@
3
3
  #import <UIKit/UIKit.h>
4
4
 
5
5
  #import "RNSHeaderItemPlacement.h"
6
+ #import "RNSHeaderItemVisibilityPriority.h"
6
7
  #import "RNSStackHeaderIconData.h"
7
8
  #import "RNSStackHeaderMenuData.h"
8
9
 
@@ -12,11 +13,17 @@ NS_ASSUME_NONNULL_BEGIN
12
13
 
13
14
  @property (nonatomic, readonly) RNSHeaderItemPlacement placement;
14
15
  @property (nonatomic, readonly, nullable) NSString *itemId;
16
+ @property (nonatomic, readonly, nullable) NSString *identifier;
15
17
  @property (nonatomic, readonly, nullable) NSString *title;
16
18
  @property (nonatomic, readonly, nullable) RNSStackHeaderIconData *icon;
17
19
  @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menu;
20
+ @property (nonatomic, readonly, nullable) RNSStackHeaderMenuData *menuRepresentation;
18
21
  @property (nonatomic, readonly, nullable) UIView *customView;
22
+ @property (nonatomic, readonly) UIBarButtonItemStyle style;
23
+ @property (nonatomic, readonly) BOOL disabled;
19
24
  @property (nonatomic, readonly) BOOL respondsToOnPress;
25
+ @property (nonatomic, readonly) BOOL hidesSharedBackground;
26
+ @property (nonatomic, readonly) RNSHeaderItemVisibilityPriority visibilityPriority;
20
27
 
21
28
  @end
22
29
 
@@ -2,7 +2,7 @@
2
2
  #import "RNSStackHeaderItemComponentView.h"
3
3
 
4
4
  #import <React/RCTConversions.h>
5
- #import <rnscreens/RNSStackHeaderItemComponentDescriptor.h>
5
+ #import <react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h>
6
6
 
7
7
  namespace react = facebook::react;
8
8
 
@@ -43,7 +43,8 @@ namespace react = facebook::react;
43
43
  if (_didSetHeaderItemSpacerPlacement) {
44
44
  RCTLogWarn(@"[RNScreens] Changing header item spacer placement at runtime is not supported");
45
45
  } else {
46
- _placement = rnscreens::conversion::convert<RNSHeaderItemSpacerPlacement>(newSpacerProps.placement);
46
+ _placement = rnscreens::conversion::RNSHeaderItemSpacerPlacementFromReactRNSStackHeaderItemSpacerIOSPlacement(
47
+ newSpacerProps.placement);
47
48
  }
48
49
  }
49
50
  _didSetHeaderItemSpacerPlacement = YES;
@@ -25,6 +25,19 @@ NS_ASSUME_NONNULL_BEGIN
25
25
  withImageLoader:(id<RNSImageLoading>)imageLoader
26
26
  menuInvalidatedCallback:(nullable void (^)(void))onMenuInvalidated;
27
27
 
28
+ /**
29
+ * Applies menu representation to the item - a menu element substituting the item
30
+ * when it is displayed in a menu (e.g. the navigation bar overflow menu).
31
+ * Passing nil `data` clears the representation. Works like regular `applyMenu`.
32
+ * No-op below iOS 16 and on tvOS, where `UIBarButtonItem.menuRepresentation` is unavailable.
33
+ */
34
+ + (void)applyMenuRepresentation:(nullable RNSStackHeaderMenuData *)data
35
+ toBarButtonItem:(UIBarButtonItem *)item
36
+ withHeaderEventsDelegate:(id<RNSStackHeaderEventsDelegate>)delegate
37
+ stateTracker:(RNSStackHeaderMenuToggleStateTracker *)tracker
38
+ withImageLoader:(id<RNSImageLoading>)imageLoader
39
+ menuInvalidatedCallback:(nullable void (^)(void))onMenuInvalidated;
40
+
28
41
  /**
29
42
  * Collects IDs of all toggle items in a single selection hierarchy rooted at the given menu.
30
43
  */
@@ -26,6 +26,30 @@
26
26
  #endif // !TARGET_OS_TV || __TV_OS_VERSION_MAX_ALLOWED >= 170000
27
27
  }
28
28
 
29
+ + (void)applyMenuRepresentation:(nullable RNSStackHeaderMenuData *)data
30
+ toBarButtonItem:(UIBarButtonItem *)item
31
+ withHeaderEventsDelegate:(id<RNSStackHeaderEventsDelegate>)delegate
32
+ stateTracker:(RNSStackHeaderMenuToggleStateTracker *)tracker
33
+ withImageLoader:(id<RNSImageLoading>)imageLoader
34
+ menuInvalidatedCallback:(nullable void (^)(void))onMenuInvalidated
35
+ {
36
+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0) && !TARGET_OS_TV
37
+ if (@available(iOS 16.0, *)) {
38
+ if (data == nil) {
39
+ item.menuRepresentation = nil;
40
+ return;
41
+ }
42
+ item.menuRepresentation = [self buildMenuFromData:data
43
+ withHeaderEventsDelegate:delegate
44
+ stateTracker:tracker
45
+ singleSelectionRoot:nil
46
+ initialSingleSelectionStateClaimed:NULL
47
+ withImageLoader:imageLoader
48
+ menuInvalidatedCallback:onMenuInvalidated];
49
+ }
50
+ #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(16_0) && !TARGET_OS_TV
51
+ }
52
+
29
53
  + (UIMenu *)buildMenuFromData:(RNSStackHeaderMenuData *)data
30
54
  withHeaderEventsDelegate:(id<RNSStackHeaderEventsDelegate>)delegate
31
55
  stateTracker:(RNSStackHeaderMenuToggleStateTracker *)tracker
@@ -41,11 +41,18 @@ typedef NS_ENUM(NSInteger, RNSMenuElementPosition) {
41
41
  */
42
42
  @property (nonatomic, copy, readonly, nullable) NSString *trackerItemId;
43
43
 
44
+ /**
45
+ * Whether the element was found in the header item's menuRepresentation tree
46
+ * rather than its menu tree.
47
+ */
48
+ @property (nonatomic, readonly) BOOL inMenuRepresentation;
49
+
44
50
  - (instancetype)initWithSearchResult:(RNSStackHeaderMenuElementSearchResult *)searchResult
45
51
  position:(RNSMenuElementPosition)position
46
52
  headerItem:(nullable id<RNSStackHeaderItemDataProviding>)headerItem
47
53
  rootMenu:(nullable RNSStackHeaderMenuData *)rootMenu
48
- trackerItemId:(nullable NSString *)trackerItemId;
54
+ trackerItemId:(nullable NSString *)trackerItemId
55
+ inMenuRepresentation:(BOOL)inMenuRepresentation;
49
56
 
50
57
  @end
51
58