react-native-navigation 7.23.1 → 7.24.0-snapshot.465

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 (266) hide show
  1. package/.buildkite/pipeline.yml +51 -11
  2. package/.nvmrc +1 -0
  3. package/Mock.d.ts +1 -0
  4. package/Mock.js +4 -0
  5. package/Mock.ts +1 -1
  6. package/README.md +0 -1
  7. package/jest.config.js +40 -0
  8. package/lib/{src/Mock → Mock}/Application.tsx +0 -0
  9. package/lib/{src/Mock → Mock}/ComponentProps.tsx +0 -0
  10. package/lib/{src/Mock → Mock}/Components/BottomTabs.tsx +0 -0
  11. package/lib/{src/Mock → Mock}/Components/ComponentScreen.tsx +13 -2
  12. package/lib/{src/Mock → Mock}/Components/LayoutComponent.tsx +0 -0
  13. package/lib/{src/Mock → Mock}/Components/Modals.tsx +0 -0
  14. package/lib/{src/Mock → Mock}/Components/NavigationButton.tsx +1 -1
  15. package/lib/{src/Mock → Mock}/Components/Overlays.tsx +0 -0
  16. package/lib/{src/Mock → Mock}/Components/Stack.tsx +0 -0
  17. package/lib/{src/Mock → Mock}/Components/TopBar.tsx +2 -2
  18. package/lib/{src/Mock → Mock}/Layouts/BottomTabsNode.ts +1 -1
  19. package/lib/{src/Mock → Mock}/Layouts/ComponentNode.ts +1 -1
  20. package/lib/{src/Mock → Mock}/Layouts/LayoutNodeFactory.ts +0 -0
  21. package/lib/{src/Mock → Mock}/Layouts/Node.ts +1 -1
  22. package/lib/{src/Mock → Mock}/Layouts/ParentNode.ts +2 -2
  23. package/lib/{src/Mock → Mock}/Layouts/StackNode.ts +0 -0
  24. package/lib/{src/Mock → Mock}/Stores/EventsStore.ts +10 -2
  25. package/lib/{src/Mock → Mock}/Stores/LayoutStore.ts +3 -2
  26. package/lib/{src/Mock → Mock}/connect.ts +0 -0
  27. package/lib/Mock/constants.d.ts +2 -0
  28. package/lib/Mock/constants.js +5 -0
  29. package/lib/{src/Mock → Mock}/constants.ts +0 -0
  30. package/lib/Mock/index.d.ts +3 -0
  31. package/lib/Mock/index.js +14 -0
  32. package/lib/{src/Mock → Mock}/index.ts +0 -0
  33. package/lib/{src/Mock → Mock}/mocks/AppRegistryService.ts +0 -0
  34. package/lib/{src/Mock → Mock}/mocks/NativeCommandsSender.tsx +1 -1
  35. package/lib/{src/Mock → Mock}/mocks/NativeEventsReceiver.ts +7 -4
  36. package/lib/android/app/build.gradle +23 -21
  37. package/lib/android/app/src/main/java/com/reactnativenavigation/options/FontOptions.kt +2 -2
  38. package/lib/android/app/src/main/java/com/reactnativenavigation/options/HardwareBackButtonOptions.kt +35 -2
  39. package/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutFactory.java +32 -17
  40. package/lib/android/app/src/main/java/com/reactnativenavigation/options/Options.java +1 -1
  41. package/lib/android/app/src/main/java/com/reactnativenavigation/options/parsers/TypefaceLoader.kt +16 -10
  42. package/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java +5 -2
  43. package/lib/android/app/src/main/java/com/reactnativenavigation/react/ReactView.java +13 -9
  44. package/lib/android/app/src/main/java/com/reactnativenavigation/react/modal/ModalFrameLayout.kt +3 -3
  45. package/lib/android/app/src/main/java/com/reactnativenavigation/react/modal/ModalViewManager.kt +11 -8
  46. package/lib/android/app/src/main/java/com/reactnativenavigation/utils/SystemUiUtils.kt +169 -0
  47. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabPresenter.java +5 -2
  48. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java +43 -2
  49. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/child/ChildController.java +12 -16
  50. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java +20 -11
  51. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/externalcomponent/ExternalComponentViewController.java +2 -2
  52. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/overlay/OverlayManager.kt +8 -3
  53. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackController.java +11 -5
  54. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenter.java +127 -138
  55. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/TopBarController.kt +183 -22
  56. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonController.kt +25 -4
  57. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonPresenter.kt +9 -1
  58. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/stack/topbar/button/ButtonSpan.kt +1 -1
  59. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/Presenter.java +52 -71
  60. package/lib/android/app/src/main/java/com/reactnativenavigation/views/bottomtabs/BottomTabs.java +6 -0
  61. package/lib/android/app/src/main/java/com/reactnativenavigation/views/component/ComponentLayout.java +2 -0
  62. package/lib/android/app/src/main/java/com/reactnativenavigation/views/element/animators/ReactImageMatrixAnimator.kt +2 -3
  63. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/TopBar.java +1 -2
  64. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/ButtonBar.kt +7 -12
  65. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/TitleAndButtonsContainer.kt +0 -2
  66. package/lib/android/app/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/TitleSubTitleLayout.kt +0 -7
  67. package/lib/android/app/src/reactNative51/java/com/reactnativenavigation/react/NavigationReactNativeHost.java +2 -1
  68. package/lib/android/app/src/test/java/com/reactnativenavigation/BaseTest.java +7 -6
  69. package/lib/android/app/src/test/java/com/reactnativenavigation/TestActivity.java +5 -0
  70. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/ImageLoaderMock.kt +5 -4
  71. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/Mocks.kt +3 -2
  72. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TypefaceLoaderMock.kt +5 -1
  73. package/lib/android/app/src/test/java/com/reactnativenavigation/options/TransitionAnimationOptionsTest.kt +2 -3
  74. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/PresenterTest.java +25 -10
  75. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/LayoutFactoryTest.java +25 -2
  76. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/MotionEventTest.kt +1 -1
  77. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/SystemUiUtilsTest.kt +27 -0
  78. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/{TitleAndButtonsMeasurer.kt → TitleAndButtonsMeasurerTest.kt} +2 -2
  79. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiThreadTest.java +2 -2
  80. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiUtilsTest.java +1 -1
  81. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.kt +589 -0
  82. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsPresenterTest.kt +1 -1
  83. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/child/ChildControllerTest.java +2 -1
  84. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewControllerTest.java +23 -5
  85. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/fakes/FakeParentController.kt +1 -1
  86. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalAnimatorTest.kt +1 -1
  87. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalPresenterTest.java +7 -3
  88. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java +16 -4
  89. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/NavigatorTest.java +2 -2
  90. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/RootPresenterTest.kt +5 -5
  91. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/overlay/OverlayManagerTest.java +1 -0
  92. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/parent/ParentControllerTest.java +4 -0
  93. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java +6 -2
  94. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackAnimatorTest.kt +1 -1
  95. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt +13 -8
  96. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt +58 -51
  97. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TopBarControllerTest.kt +219 -41
  98. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabsViewControllerTest.java +2 -0
  99. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/viewcontroller/ViewControllerTest.java +4 -1
  100. package/lib/android/app/src/test/java/com/reactnativenavigation/views/TitleAndButtonsContainerTest.kt +2 -2
  101. package/lib/android/app/src/test/java/com/reactnativenavigation/views/animations/BaseViewAnimatorTest.kt +4 -4
  102. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsContainerTest.kt +1 -1
  103. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsTest.kt +4 -4
  104. package/lib/dist/Mock/Application.js +2 -2
  105. package/lib/dist/Mock/Components/BottomTabs.js +2 -2
  106. package/lib/dist/Mock/Components/ComponentScreen.js +15 -5
  107. package/lib/dist/Mock/Components/LayoutComponent.js +3 -2
  108. package/lib/dist/Mock/Components/Modals.js +2 -2
  109. package/lib/dist/Mock/Components/NavigationButton.d.ts +1 -1
  110. package/lib/dist/Mock/Components/NavigationButton.js +8 -10
  111. package/lib/dist/Mock/Components/Overlays.js +2 -2
  112. package/lib/dist/Mock/Components/Stack.js +2 -2
  113. package/lib/dist/Mock/Components/TopBar.d.ts +2 -2
  114. package/lib/dist/Mock/Components/TopBar.js +7 -6
  115. package/lib/dist/Mock/Layouts/BottomTabsNode.d.ts +1 -1
  116. package/lib/dist/Mock/Layouts/BottomTabsNode.js +3 -3
  117. package/lib/dist/Mock/Layouts/ComponentNode.d.ts +1 -1
  118. package/lib/dist/Mock/Layouts/ComponentNode.js +4 -4
  119. package/lib/dist/Mock/Layouts/LayoutNodeFactory.js +3 -3
  120. package/lib/dist/Mock/Layouts/Node.d.ts +1 -1
  121. package/lib/dist/Mock/Layouts/Node.js +5 -0
  122. package/lib/dist/Mock/Layouts/ParentNode.d.ts +2 -2
  123. package/lib/dist/Mock/Layouts/ParentNode.js +4 -3
  124. package/lib/dist/Mock/Layouts/StackNode.js +1 -1
  125. package/lib/dist/Mock/Stores/EventsStore.d.ts +5 -2
  126. package/lib/dist/Mock/Stores/EventsStore.js +7 -0
  127. package/lib/dist/Mock/Stores/LayoutStore.js +6 -3
  128. package/lib/dist/Mock/connect.js +1 -1
  129. package/lib/dist/Mock/index.js +1 -1
  130. package/lib/dist/Mock/mocks/NativeCommandsSender.d.ts +1 -1
  131. package/lib/dist/Mock/mocks/NativeCommandsSender.js +2 -2
  132. package/lib/dist/Mock/mocks/NativeEventsReceiver.d.ts +3 -3
  133. package/lib/dist/Mock/mocks/NativeEventsReceiver.js +6 -3
  134. package/lib/dist/{Navigation.d.ts → src/Navigation.d.ts} +0 -0
  135. package/lib/dist/{Navigation.js → src/Navigation.js} +19 -3
  136. package/lib/dist/{NavigationDelegate.d.ts → src/NavigationDelegate.d.ts} +0 -0
  137. package/lib/dist/{NavigationDelegate.js → src/NavigationDelegate.js} +1 -0
  138. package/lib/dist/{adapters → src/adapters}/AppRegistryService.d.ts +0 -0
  139. package/lib/dist/{adapters → src/adapters}/AppRegistryService.js +0 -0
  140. package/lib/dist/{adapters → src/adapters}/AssetResolver.d.ts +0 -0
  141. package/lib/dist/{adapters → src/adapters}/AssetResolver.js +0 -0
  142. package/lib/dist/src/adapters/ColorService.d.ts +3 -0
  143. package/lib/dist/{adapters → src/adapters}/ColorService.js +1 -1
  144. package/lib/dist/{adapters → src/adapters}/Constants.d.ts +0 -0
  145. package/lib/dist/{adapters → src/adapters}/Constants.js +10 -6
  146. package/lib/dist/{adapters → src/adapters}/NativeCommandsSender.d.ts +0 -0
  147. package/lib/dist/{adapters → src/adapters}/NativeCommandsSender.js +1 -0
  148. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.d.ts +0 -0
  149. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.js +1 -0
  150. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.mock.d.ts +0 -0
  151. package/lib/dist/{adapters → src/adapters}/NativeEventsReceiver.mock.js +0 -0
  152. package/lib/dist/{adapters → src/adapters}/TouchablePreview.d.ts +0 -0
  153. package/lib/dist/src/adapters/TouchablePreview.js +89 -0
  154. package/lib/dist/{adapters → src/adapters}/UniqueIdProvider.d.ts +0 -0
  155. package/lib/dist/{adapters → src/adapters}/UniqueIdProvider.js +2 -2
  156. package/lib/dist/{commands → src/commands}/Commands.d.ts +0 -0
  157. package/lib/dist/{commands → src/commands}/Commands.js +24 -10
  158. package/lib/dist/{commands → src/commands}/Deprecations.d.ts +0 -0
  159. package/lib/dist/src/commands/Deprecations.js +80 -0
  160. package/lib/dist/{commands → src/commands}/LayoutTreeCrawler.d.ts +0 -0
  161. package/lib/dist/{commands → src/commands}/LayoutTreeCrawler.js +4 -2
  162. package/lib/dist/{commands → src/commands}/LayoutTreeParser.d.ts +0 -0
  163. package/lib/dist/{commands → src/commands}/LayoutTreeParser.js +1 -0
  164. package/lib/dist/{commands → src/commands}/LayoutType.d.ts +0 -0
  165. package/lib/dist/{commands → src/commands}/LayoutType.js +0 -0
  166. package/lib/dist/{commands → src/commands}/OptionsCrawler.d.ts +0 -0
  167. package/lib/dist/{commands → src/commands}/OptionsCrawler.js +6 -4
  168. package/lib/dist/{commands → src/commands}/OptionsProcessor.d.ts +1 -1
  169. package/lib/dist/{commands → src/commands}/OptionsProcessor.js +50 -42
  170. package/lib/dist/{components → src/components}/ComponentRegistry.d.ts +0 -0
  171. package/lib/dist/{components → src/components}/ComponentRegistry.js +4 -0
  172. package/lib/dist/{components → src/components}/ComponentWrapper.d.ts +0 -0
  173. package/lib/dist/{components → src/components}/ComponentWrapper.js +17 -17
  174. package/lib/dist/{components → src/components}/Modal.d.ts +0 -0
  175. package/lib/dist/{components → src/components}/Modal.js +8 -8
  176. package/lib/dist/{components → src/components}/Store.d.ts +2 -0
  177. package/lib/dist/{components → src/components}/Store.js +13 -6
  178. package/lib/dist/{events → src/events}/CommandsObserver.d.ts +0 -0
  179. package/lib/dist/{events → src/events}/CommandsObserver.js +2 -1
  180. package/lib/dist/{events → src/events}/ComponentEventsObserver.d.ts +4 -2
  181. package/lib/dist/{events → src/events}/ComponentEventsObserver.js +16 -14
  182. package/lib/dist/{events → src/events}/EventsRegistry.d.ts +2 -2
  183. package/lib/dist/{events → src/events}/EventsRegistry.js +3 -0
  184. package/lib/dist/{index.d.ts → src/index.d.ts} +0 -0
  185. package/lib/dist/src/index.js +22 -0
  186. package/lib/dist/{interfaces → src/interfaces}/CommandName.d.ts +0 -0
  187. package/lib/dist/{interfaces → src/interfaces}/CommandName.js +0 -0
  188. package/lib/dist/{interfaces → src/interfaces}/ComponentEvents.d.ts +0 -0
  189. package/lib/dist/{interfaces → src/interfaces}/ComponentEvents.js +0 -0
  190. package/lib/dist/{interfaces → src/interfaces}/EventSubscription.d.ts +0 -0
  191. package/lib/dist/{interfaces → src/interfaces}/EventSubscription.js +0 -0
  192. package/lib/dist/{interfaces → src/interfaces}/Events.d.ts +0 -0
  193. package/lib/dist/{interfaces → src/interfaces}/Events.js +0 -0
  194. package/lib/dist/{interfaces → src/interfaces}/Layout.d.ts +0 -0
  195. package/lib/dist/{interfaces → src/interfaces}/Layout.js +0 -0
  196. package/lib/dist/{interfaces → src/interfaces}/NavigationComponent.d.ts +0 -0
  197. package/lib/dist/{interfaces → src/interfaces}/NavigationComponent.js +8 -1
  198. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentListener.d.ts +0 -0
  199. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentListener.js +0 -0
  200. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentProps.d.ts +0 -0
  201. package/lib/dist/{interfaces → src/interfaces}/NavigationComponentProps.js +0 -0
  202. package/lib/dist/{interfaces → src/interfaces}/NavigationFunctionComponent.d.ts +0 -0
  203. package/lib/dist/{interfaces → src/interfaces}/NavigationFunctionComponent.js +0 -0
  204. package/lib/dist/{interfaces → src/interfaces}/Options.d.ts +9 -0
  205. package/lib/dist/{interfaces → src/interfaces}/Options.js +0 -0
  206. package/lib/dist/{interfaces → src/interfaces}/ProcessorSubscription.d.ts +0 -0
  207. package/lib/dist/{interfaces → src/interfaces}/ProcessorSubscription.js +0 -0
  208. package/lib/dist/{interfaces → src/interfaces}/Processors.d.ts +0 -0
  209. package/lib/dist/{interfaces → src/interfaces}/Processors.js +0 -0
  210. package/lib/dist/{processors → src/processors}/LayoutProcessor.d.ts +0 -0
  211. package/lib/dist/{processors → src/processors}/LayoutProcessor.js +1 -0
  212. package/lib/dist/{processors → src/processors}/LayoutProcessorsStore.d.ts +0 -0
  213. package/lib/dist/{processors → src/processors}/LayoutProcessorsStore.js +1 -3
  214. package/lib/dist/{processors → src/processors}/OptionProcessorsStore.d.ts +0 -0
  215. package/lib/dist/{processors → src/processors}/OptionProcessorsStore.js +1 -3
  216. package/lib/dist/{types.d.ts → src/types.d.ts} +0 -0
  217. package/lib/dist/{types.js → src/types.js} +0 -0
  218. package/lib/ios/AnimationObserver.h +17 -0
  219. package/lib/ios/AnimationObserver.m +41 -0
  220. package/lib/ios/BottomTabPresenter.h +0 -3
  221. package/lib/ios/BottomTabPresenter.m +0 -8
  222. package/lib/ios/RNNAssert.h +2 -2
  223. package/lib/ios/RNNBasePresenter.h +0 -4
  224. package/lib/ios/RNNBasePresenter.m +0 -12
  225. package/lib/ios/RNNBottomTabOptions.m +2 -1
  226. package/lib/ios/RNNBottomTabsController.m +8 -8
  227. package/lib/ios/RNNBridgeManager.mm +0 -1
  228. package/lib/ios/RNNButtonBuilder.m +2 -0
  229. package/lib/ios/RNNButtonOptions.h +1 -0
  230. package/lib/ios/RNNButtonOptions.m +4 -0
  231. package/lib/ios/RNNCommandsHandler.m +15 -8
  232. package/lib/ios/RNNComponentPresenter.m +0 -4
  233. package/lib/ios/RNNComponentViewController.m +2 -4
  234. package/lib/ios/RNNDotIndicatorPresenter.m +2 -1
  235. package/lib/ios/RNNExternalViewController.m +2 -4
  236. package/lib/ios/RNNModalManager.h +2 -1
  237. package/lib/ios/RNNModalManager.m +12 -21
  238. package/lib/ios/RNNSegmentedControl.h +1 -1
  239. package/lib/ios/RNNSideMenuChildVC.m +0 -4
  240. package/lib/ios/RNNSideMenuController.m +0 -4
  241. package/lib/ios/RNNSplitViewController.m +0 -4
  242. package/lib/ios/RNNStackController.m +0 -4
  243. package/lib/ios/RNNStackPresenter.m +3 -0
  244. package/lib/ios/RNNSwizzles.m +20 -0
  245. package/lib/ios/RNNTabBarItemCreator.m +3 -2
  246. package/lib/ios/RNNUIBarButtonItem.h +2 -0
  247. package/lib/ios/RNNUIBarButtonItem.m +17 -0
  248. package/lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj +8 -0
  249. package/lib/ios/TopBarPresenter.m +8 -4
  250. package/lib/ios/UIViewController+RNNOptions.m +1 -1
  251. package/lib/src/commands/Commands.ts +6 -1
  252. package/lib/src/commands/LayoutTreeCrawler.ts +2 -2
  253. package/lib/src/commands/OptionsCrawler.ts +2 -1
  254. package/lib/src/commands/OptionsProcessor.ts +15 -13
  255. package/lib/src/components/Store.ts +9 -0
  256. package/lib/src/events/ComponentEventsObserver.ts +5 -1
  257. package/lib/src/events/EventsRegistry.ts +2 -1
  258. package/lib/src/interfaces/Options.ts +10 -0
  259. package/package.json +19 -60
  260. package/tsconfig.mocks.json +7 -0
  261. package/lib/android/app/src/main/java/com/reactnativenavigation/utils/StatusBarUtils.java +0 -41
  262. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java +0 -511
  263. package/lib/dist/adapters/ColorService.d.ts +0 -3
  264. package/lib/dist/adapters/TouchablePreview.js +0 -91
  265. package/lib/dist/commands/Deprecations.js +0 -82
  266. package/lib/dist/index.js +0 -22
@@ -1,19 +1,59 @@
1
- env:
2
- CI: true
3
- ANDROID_HOME: /usr/local/share/android-sdk/
4
- PATH: "$PATH:/usr/local/share/android-sdk/platform-tools/"
5
1
  steps:
6
- - label: "Android :android:"
2
+ - block: ":rocket: Release!"
3
+ prompt: "Fill out the details for release"
4
+ if: 'build.message =~ /^release\$/i'
5
+ fields:
6
+ - text: "VERSION"
7
+ key: "version"
8
+ - text: "NPM_TAG"
9
+ key: "npm-tag"
10
+ default: 'null'
11
+ required: false
12
+ - text: "BUILD_DOCUMENTATION_VERSION"
13
+ key: "build-documentation-version"
14
+ default: 'null'
15
+ hint: 'Leave NULL if no version is specified'
16
+ - text: "REMOVE_DOCUMENTATION_VERSION"
17
+ key: "remove-documentation-version"
18
+ default: 'null'
19
+ hint: 'Leave NULL if no version is specified'
20
+
21
+ - label: ":android: Android"
7
22
  command:
8
- - "env"
23
+ - "nvm install"
9
24
  - "npm install"
10
- - "npm run clean"
25
+ - "npm run test-js"
11
26
  - "npm run test-unit-android -- --release"
12
27
  - "npm run test-e2e-android-multi -- --release --headless --verbose --ci"
13
-
14
- - label: "IOS :ios:"
28
+ key: "android_build"
29
+ timeout_in_minutes: 90
30
+
31
+ - label: ":ios: iOS - Unit"
15
32
  command:
16
- - "env"
33
+ - "nvm install"
17
34
  - "npm install"
18
- - "npm run clean"
35
+ - "npm run test-unit-ios -- --release"
36
+ key: "ios_unit"
37
+ timeout_in_minutes: 90
38
+
39
+ - label: ":ios: iOS - E2E"
40
+ command:
41
+ - "nvm install"
42
+ - "npm install"
43
+ - "npm run test-snapshot-ios -- --release"
19
44
  - "npm run test-e2e-ios -- --release --multi --ci"
45
+ key: "ios_e2e"
46
+ timeout_in_minutes: 90
47
+
48
+ - label: ":package: Publish"
49
+ env:
50
+ if: "build.pull_request.id == null"
51
+ command:
52
+ - "nvm install"
53
+ - "npm install"
54
+ - "npm run release"
55
+ depends_on:
56
+ - "android_build"
57
+ - "ios_unit"
58
+ - "ios_e2e"
59
+ timeout_in_minutes: 90
package/.nvmrc ADDED
@@ -0,0 +1 @@
1
+ 14
package/Mock.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib/Mock';
package/Mock.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ (0, tslib_1.__exportStar)(require("./lib/Mock"), exports);
package/Mock.ts CHANGED
@@ -1 +1 @@
1
- export * from './lib/dist/Mock';
1
+ export * from './lib/Mock';
package/README.md CHANGED
@@ -8,7 +8,6 @@
8
8
  <a href="https://www.npmjs.com/package/react-native-navigation"><img src="https://img.shields.io/npm/v/react-native-navigation/latest.svg?style=flat-square" alt="NPM latest version"></a>
9
9
  <a href="https://www.npmjs.com/package/react-native-navigation"><img src="https://img.shields.io/npm/v/react-native-navigation/snapshot.svg?style=flat-square" alt="NPM snapshot version"></a>
10
10
  <a href="https://jenkins-oss.wixpress.com/job/multi-react-native-navigation-master/"><img src="https://img.shields.io/jenkins/s/http/jenkins-oss.wixpress.com:8080/job/multi-react-native-navigation-master.svg?style=flat-square" alt="NPM snapshot version"></a>
11
- <a href="https://github.com/wix/react-native-navigation/pulls"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fmerge-chance.info%2Fbadge%3Frepo%3Dwix/react-native-navigation"></a>
12
11
 
13
12
  </p>
14
13
  <p align="center">
package/jest.config.js ADDED
@@ -0,0 +1,40 @@
1
+ module.exports = {
2
+ preset: 'react-native',
3
+ transformIgnorePatterns: [
4
+ 'node_modules/(?!(@react-native|react-native|react-native-ui-lib|react-native-animatable)/)',
5
+ ],
6
+ transform: {
7
+ '\\.[jt]sx?$': 'babel-jest',
8
+ },
9
+ roots: [
10
+ '<rootDir>/lib/src/',
11
+ '<rootDir>/playground/src/',
12
+ '<rootDir>/integration/',
13
+ '<rootDir>/scripts/',
14
+ '<rootDir>/e2e/',
15
+ ],
16
+ setupFilesAfterEnv: ['./jest-setup.js'],
17
+ testPathIgnorePatterns: ['/node_modules/'],
18
+ moduleNameMapper: {
19
+ 'react-native-navigation/Mock': '<rootDir>/lib/Mock',
20
+ 'react-native-navigation': '<rootDir>/lib/src',
21
+ '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
22
+ '<rootDir>/playground/img/layouts@2x.png',
23
+ },
24
+ collectCoverageFrom: [
25
+ 'lib/src/**/*.ts',
26
+ 'lib/src/**/*.tsx',
27
+ 'integration/**/*.js',
28
+ '!lib/dist/index.js',
29
+ '!lib/dist/Navigation.js',
30
+ '!lib/dist/adapters/**/*',
31
+ '!lib/dist/interfaces/**/*',
32
+ '!lib/dist/**/*.test.*',
33
+ '!integration/**/*.test.*',
34
+ '!integration/*.test.*',
35
+ '!e2e/**/*test.js',
36
+ ],
37
+ resetMocks: true,
38
+ resetModules: true,
39
+ coverageReporters: ['json', 'lcov', 'text', 'html'],
40
+ };
File without changes
File without changes
File without changes
@@ -1,11 +1,13 @@
1
1
  import React, { Component } from 'react';
2
2
  import { Button, View, Text } from 'react-native';
3
- import { Navigation } from '../..';
3
+ import { Navigation } from '../../src';
4
4
  import { ComponentProps } from '../ComponentProps';
5
5
  import { VISIBLE_SCREEN_TEST_ID } from '../constants';
6
6
  import { LayoutStore } from '../Stores/LayoutStore';
7
7
  import { connect } from '../connect';
8
8
  import { TopBar } from './TopBar';
9
+ import { events } from '../Stores/EventsStore';
10
+ import _ from 'lodash';
9
11
 
10
12
  export const ComponentScreen = connect(
11
13
  class extends Component<ComponentProps> {
@@ -34,7 +36,13 @@ export const ComponentScreen = connect(
34
36
  <Button
35
37
  testID={bottomTabOptions?.testID}
36
38
  title={bottomTabOptions?.text || ''}
37
- onPress={() => LayoutStore.selectTabIndex(this.props.layoutNode.getBottomTabs(), i)}
39
+ onPress={() => {
40
+ events.invokeBottomTabPressed({
41
+ tabIndex: i,
42
+ });
43
+ if (_.defaultTo(bottomTabOptions?.selectTabOnPress, true))
44
+ LayoutStore.selectTabIndex(this.props.layoutNode.getBottomTabs(), i);
45
+ }}
38
46
  />
39
47
  <Text>{bottomTabOptions?.badge}</Text>
40
48
  </View>
@@ -46,6 +54,9 @@ export const ComponentScreen = connect(
46
54
 
47
55
  render() {
48
56
  const Component = Navigation.mock.store.getWrappedComponent(this.props.layoutNode.data.name);
57
+ if (!Component)
58
+ throw new Error(`${this.props.layoutNode.data.name} has not been registered.`);
59
+
49
60
  return (
50
61
  <View testID={this.isVisible() ? VISIBLE_SCREEN_TEST_ID : undefined}>
51
62
  {this.props.layoutNode.getStack() && (
File without changes
@@ -1,6 +1,6 @@
1
1
  import React, { Component } from 'react';
2
2
  import { Button, TouchableOpacity } from 'react-native';
3
- import { Navigation, OptionsTopBarButton } from '../../';
3
+ import { Navigation, OptionsTopBarButton } from '../../src';
4
4
  import { events } from '../Stores/EventsStore';
5
5
 
6
6
  interface ButtonProps {
File without changes
File without changes
@@ -1,7 +1,7 @@
1
1
  import React, { Component } from 'react';
2
2
  import { Button, View, Text } from 'react-native';
3
- import { Navigation, OptionsTopBarButton } from '../..';
4
- import { OptionsTopBar, OptionsTopBarBackButton } from '../../interfaces/Options';
3
+ import { Navigation, OptionsTopBarButton } from '../../src';
4
+ import { OptionsTopBar, OptionsTopBarBackButton } from '../../src/interfaces/Options';
5
5
  import ParentNode from '../Layouts/ParentNode';
6
6
  import { LayoutStore } from '../Stores/LayoutStore';
7
7
  import { NavigationButton } from './NavigationButton';
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { Options } from '../../index';
2
+ import { Options } from '../../src/index';
3
3
  import { LayoutStore } from '../Stores/LayoutStore';
4
4
  import ParentNode from './ParentNode';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { OptionsTopBarButton } from 'react-native-navigation/interfaces/Options';
2
+ import { OptionsTopBarButton } from '../../src';
3
3
  import { events } from '../Stores/EventsStore';
4
4
  import ParentNode from './ParentNode';
5
5
 
@@ -1,4 +1,4 @@
1
- import { Options } from '../../index';
1
+ import { Options } from '../../src/index';
2
2
  import ParentNode from './ParentNode';
3
3
 
4
4
  interface Data {
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash';
2
- import { OptionsTopBarButton } from '../../interfaces/Options';
3
- import { Options } from '../../index';
2
+ import { OptionsTopBarButton } from '../../src/interfaces/Options';
3
+ import { Options } from '../../src/index';
4
4
  import { LayoutStore } from '../Stores/LayoutStore';
5
5
  import ComponentNode from './ComponentNode';
6
6
  import LayoutNodeFactory from './LayoutNodeFactory';
File without changes
@@ -2,8 +2,9 @@ import {
2
2
  ComponentDidDisappearEvent,
3
3
  ComponentWillAppearEvent,
4
4
  ModalDismissedEvent,
5
- } from '../../interfaces/ComponentEvents';
6
- import { ComponentDidAppearEvent, NavigationButtonPressedEvent } from '../../index';
5
+ } from '../../src/interfaces/ComponentEvents';
6
+ import { ComponentDidAppearEvent, NavigationButtonPressedEvent } from '../../src/index';
7
+ import { BottomTabPressedEvent } from '../../src/interfaces/Events';
7
8
 
8
9
  export const events = {
9
10
  navigationButtonPressed: [(_event: NavigationButtonPressedEvent) => {}],
@@ -11,6 +12,7 @@ export const events = {
11
12
  componentDidAppear: [(_event: ComponentDidAppearEvent) => {}],
12
13
  componentDidDisappear: [(_event: ComponentDidDisappearEvent) => {}],
13
14
  modalDismissed: [(_event: ModalDismissedEvent) => {}],
15
+ bottomTabPressed: [(_event: BottomTabPressedEvent) => {}],
14
16
  invokeComponentWillAppear: (event: ComponentWillAppearEvent) => {
15
17
  events.componentWillAppear &&
16
18
  events.componentWillAppear.forEach((listener) => {
@@ -41,4 +43,10 @@ export const events = {
41
43
  listener(event);
42
44
  });
43
45
  },
46
+ invokeBottomTabPressed: (event: BottomTabPressedEvent) => {
47
+ events.bottomTabPressed &&
48
+ events.bottomTabPressed?.forEach((listener) => {
49
+ listener(event);
50
+ });
51
+ },
44
52
  };
@@ -2,7 +2,7 @@ import _ from 'lodash';
2
2
  import BottomTabsNode from '../Layouts/BottomTabsNode';
3
3
  import ParentNode from '../Layouts/ParentNode';
4
4
  import LayoutNodeFactory from '../Layouts/LayoutNodeFactory';
5
- import { Options } from '../../interfaces/Options';
5
+ import { Options } from '../../src/interfaces/Options';
6
6
  import StackNode from '../Layouts/StackNode';
7
7
 
8
8
  const remx = require('remx');
@@ -77,7 +77,8 @@ const setters = remx.setters({
77
77
  },
78
78
  mergeOptions(componentId: string, options: Options) {
79
79
  const layout = getters.getLayoutById(componentId);
80
- layout.mergeOptions(options);
80
+ if (layout) layout.mergeOptions(options);
81
+ else console.warn(`[RNN error] Merge options failure: cannot find layout for: ${componentId}`);
81
82
  },
82
83
  });
83
84
 
File without changes
@@ -0,0 +1,2 @@
1
+ export declare const VISIBLE_SCREEN_TEST_ID = "VISIBLE_SCREEN_TEST_ID";
2
+ export declare const VISIBLE_OVERLAY_TEST_ID = "VISIBLE_OVERLAY_TEST_ID";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VISIBLE_OVERLAY_TEST_ID = exports.VISIBLE_SCREEN_TEST_ID = void 0;
4
+ exports.VISIBLE_SCREEN_TEST_ID = 'VISIBLE_SCREEN_TEST_ID';
5
+ exports.VISIBLE_OVERLAY_TEST_ID = 'VISIBLE_OVERLAY_TEST_ID';
File without changes
@@ -0,0 +1,3 @@
1
+ export declare const ApplicationMock: any;
2
+ export * from './constants';
3
+ export declare function mockNativeComponents(): void;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mockNativeComponents = exports.ApplicationMock = void 0;
4
+ const tslib_1 = require("tslib");
5
+ exports.ApplicationMock = require('./Application').Application;
6
+ (0, tslib_1.__exportStar)(require("./constants"), exports);
7
+ function mockNativeComponents() {
8
+ const { NativeCommandsSender } = require('./mocks/NativeCommandsSender');
9
+ const { NativeEventsReceiver } = require('./mocks/NativeEventsReceiver');
10
+ const { AppRegistryService } = require('./mocks/AppRegistryService');
11
+ const { Navigation } = require('react-native-navigation');
12
+ Navigation.mockNativeComponents(new NativeCommandsSender(), new NativeEventsReceiver(), new AppRegistryService());
13
+ }
14
+ exports.mockNativeComponents = mockNativeComponents;
File without changes
@@ -1,6 +1,6 @@
1
1
  import { LayoutStore } from '../Stores/LayoutStore';
2
2
  import LayoutNodeFactory from '../Layouts/LayoutNodeFactory';
3
- import { LayoutNode } from 'react-native-navigation/commands/LayoutTreeCrawler';
3
+ import { LayoutNode } from '../../src/commands/LayoutTreeCrawler';
4
4
  import { events } from '../Stores/EventsStore';
5
5
  import _ from 'lodash';
6
6
  import ComponentNode from '../Layouts/ComponentNode';
@@ -11,13 +11,13 @@ import {
11
11
  ModalDismissedEvent,
12
12
  ScreenPoppedEvent,
13
13
  ModalAttemptedToDismissEvent,
14
- } from '../../interfaces/ComponentEvents';
14
+ } from '../../src/interfaces/ComponentEvents';
15
15
  import {
16
16
  CommandCompletedEvent,
17
17
  BottomTabSelectedEvent,
18
18
  BottomTabLongPressedEvent,
19
19
  BottomTabPressedEvent,
20
- } from '../../interfaces/Events';
20
+ } from '../../src/interfaces/Events';
21
21
  import { events } from './../Stores/EventsStore';
22
22
 
23
23
  export class NativeEventsReceiver {
@@ -73,10 +73,13 @@ export class NativeEventsReceiver {
73
73
  }
74
74
 
75
75
  public registerBottomTabPressedListener(
76
- _callback: (data: BottomTabPressedEvent) => void
76
+ callback: (data: BottomTabPressedEvent) => void
77
77
  ): EmitterSubscription {
78
+ events.bottomTabPressed.push(callback);
78
79
  return {
79
- remove: () => {},
80
+ remove: () => {
81
+ _.remove(events.bottomTabPressed, (value) => value === callback);
82
+ },
80
83
  } as EmitterSubscription;
81
84
  }
82
85
 
@@ -3,27 +3,29 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat
3
3
 
4
4
  apply plugin: 'com.android.library'
5
5
  apply plugin: 'kotlin-android'
6
- apply plugin: 'kotlin-android-extensions'
7
6
 
8
7
  def safeExtGet(prop, fallback) {
9
8
  rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
10
9
  }
11
10
 
12
- def DEFAULT_COMPILE_SDK_VERSION = 29
13
- def DEFAULT_MIN_SDK_VERSION = 19
14
- def DEFAULT_TARGET_SDK_VERSION = 29
15
- def kotlinVersion = rootProject.ext.get("RNNKotlinVersion")
16
- def kotlinStdlib = safeExtGet('RNNKotlinStdlib', 'kotlin-stdlib-jdk8')
17
- def kotlinCoroutinesCore = safeExtGet('RNNKotlinCoroutinesCore', '1.4.3')
11
+ def safeExtGetFallbackLowerBound(prop, fallback) {
12
+ Math.max(safeExtGet(prop,fallback),fallback)
13
+ }
18
14
 
15
+ def DEFAULT_COMPILE_SDK_VERSION = 30
16
+ def DEFAULT_MIN_SDK_VERSION = 21
17
+ def DEFAULT_TARGET_SDK_VERSION = 30
18
+ def DEFAULT_KOTLIN_VERSION = "1.5.31"
19
+ def DEFAULT_KOTLIN_STDLIB = 'kotlin-stdlib-jdk8'
20
+ def kotlinVersion = safeExtGet("RNNKotlinVersion", DEFAULT_KOTLIN_VERSION)
21
+ def kotlinStdlib = safeExtGet('RNNKotlinStdlib',DEFAULT_KOTLIN_STDLIB )
22
+ def kotlinCoroutinesCore = safeExtGet('RNNKotlinCoroutinesCore', '1.5.2')
19
23
  android {
20
- compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION)
24
+ compileSdkVersion safeExtGetFallbackLowerBound('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION)
21
25
 
22
26
  defaultConfig {
23
- minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION)
24
- targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
25
- versionCode 1
26
- versionName "1.0"
27
+ minSdkVersion safeExtGetFallbackLowerBound('minSdkVersion', DEFAULT_MIN_SDK_VERSION)
28
+ targetSdkVersion safeExtGetFallbackLowerBound('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
27
29
  }
28
30
  buildTypes {
29
31
  release {
@@ -170,13 +172,13 @@ allprojects { p ->
170
172
  }
171
173
 
172
174
  dependencies {
173
- implementation "androidx.core:core-ktx:1.3.2"
175
+ implementation "androidx.core:core-ktx:1.6.0"
174
176
  implementation "org.jetbrains.kotlin:$kotlinStdlib:$kotlinVersion"
175
177
  implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinCoroutinesCore"
176
178
  implementation "androidx.constraintlayout:constraintlayout:2.0.4"
177
179
 
178
- implementation 'androidx.appcompat:appcompat:1.1.0'
179
- implementation 'androidx.annotation:annotation:1.1.0'
180
+ implementation 'androidx.appcompat:appcompat:1.3.1'
181
+ implementation 'androidx.annotation:annotation:1.2.0'
180
182
  implementation 'com.google.android.material:material:1.2.0-alpha03'
181
183
 
182
184
  implementation 'com.github.wix-playground:ahbottomnavigation:3.3.0'
@@ -188,12 +190,12 @@ dependencies {
188
190
  implementation 'com.facebook.react:react-native:+'
189
191
 
190
192
  // tests
191
- testImplementation 'junit:junit:4.12'
192
- testImplementation "org.robolectric:robolectric:4.4"
193
- testImplementation 'org.assertj:assertj-core:3.8.0'
194
- testImplementation 'com.squareup.assertj:assertj-android:1.1.1'
195
- testImplementation 'org.mockito:mockito-core:3.4.0'
193
+ testImplementation 'junit:junit:4.13.2'
194
+ testImplementation "org.robolectric:robolectric:4.7.2"
195
+ testImplementation 'org.assertj:assertj-core:3.11.1'
196
+ testImplementation 'org.mockito:mockito-core:4.0.0'
197
+ testImplementation 'com.squareup.assertj:assertj-android:1.2.0'
196
198
  testImplementation 'org.mockito:mockito-inline:3.4.0'
197
- testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
199
+ testImplementation "org.mockito.kotlin:mockito-kotlin:4.0.0"
198
200
  testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlinVersion"
199
201
  }
@@ -26,11 +26,11 @@ class FontOptions {
26
26
 
27
27
  @JvmOverloads fun getTypeface(typefaceLoader: TypefaceLoader, defaultTypeface: Typeface? = null): Typeface? {
28
28
  if (isDirty) {
29
- _typeface = typefaceLoader.getTypeFace(fontFamily.get(""), fontStyle.get(""), fontWeight.get(""))
29
+ _typeface = typefaceLoader.getTypeFace(fontFamily.get(null), fontStyle.get(""), fontWeight.get(""), defaultTypeface)
30
30
  isDirty = false
31
31
  }
32
32
  return _typeface
33
- ?: defaultTypeface?.let { typefaceLoader.getTypeFace(fontFamily.get(""), fontStyle.get(""), fontWeight.get(""), it) }
33
+ ?: defaultTypeface?.let { typefaceLoader.getTypeFace(fontFamily.get(null), fontStyle.get(""), fontWeight.get(""), it) }
34
34
  }
35
35
 
36
36
  fun mergeWith(other: FontOptions) {
@@ -6,10 +6,40 @@ import com.reactnativenavigation.options.parsers.BoolParser
6
6
  import org.json.JSONObject
7
7
 
8
8
 
9
+ sealed class HwBackBottomTabsBehaviour {
10
+ object Undefined : HwBackBottomTabsBehaviour() {
11
+ override fun hasValue(): Boolean = false
12
+ }
13
+
14
+ object Exit : HwBackBottomTabsBehaviour()
15
+ object PrevSelection : HwBackBottomTabsBehaviour()
16
+ object JumpToFirst : HwBackBottomTabsBehaviour()
17
+
18
+ open fun hasValue(): Boolean = true
19
+
20
+ companion object {
21
+ private const val BEHAVIOUR_EXIT = "exit"
22
+ private const val BEHAVIOUR_PREV = "previous"
23
+ private const val BEHAVIOUR_FIRST = "first"
24
+ fun fromString(behaviour: String?): HwBackBottomTabsBehaviour {
25
+ return when (behaviour) {
26
+ BEHAVIOUR_PREV -> PrevSelection
27
+ BEHAVIOUR_FIRST -> JumpToFirst
28
+ BEHAVIOUR_EXIT -> Exit
29
+ else -> Undefined
30
+ }
31
+ }
32
+ }
33
+ }
34
+
9
35
  open class HardwareBackButtonOptions(json: JSONObject? = null) {
10
36
 
11
- @JvmField var dismissModalOnPress: Bool = NullBool()
12
- @JvmField var popStackOnPress: Bool = NullBool()
37
+ @JvmField
38
+ var dismissModalOnPress: Bool = NullBool()
39
+
40
+ @JvmField
41
+ var popStackOnPress: Bool = NullBool()
42
+ var bottomTabOnPress: HwBackBottomTabsBehaviour = HwBackBottomTabsBehaviour.Undefined
13
43
 
14
44
  init {
15
45
  parse(json)
@@ -18,16 +48,19 @@ open class HardwareBackButtonOptions(json: JSONObject? = null) {
18
48
  fun mergeWith(other: HardwareBackButtonOptions) {
19
49
  if (other.dismissModalOnPress.hasValue()) dismissModalOnPress = other.dismissModalOnPress
20
50
  if (other.popStackOnPress.hasValue()) popStackOnPress = other.popStackOnPress
51
+ if (other.bottomTabOnPress.hasValue()) bottomTabOnPress = other.bottomTabOnPress
21
52
  }
22
53
 
23
54
  fun mergeWithDefault(defaultOptions: HardwareBackButtonOptions) {
24
55
  if (!dismissModalOnPress.hasValue()) dismissModalOnPress = defaultOptions.dismissModalOnPress
25
56
  if (!popStackOnPress.hasValue()) popStackOnPress = defaultOptions.popStackOnPress
57
+ if (!bottomTabOnPress.hasValue()) bottomTabOnPress = defaultOptions.bottomTabOnPress
26
58
  }
27
59
 
28
60
  private fun parse(json: JSONObject?) {
29
61
  json ?: return
30
62
  dismissModalOnPress = BoolParser.parse(json, "dismissModalOnPress")
31
63
  popStackOnPress = BoolParser.parse(json, "popStackOnPress")
64
+ bottomTabOnPress = HwBackBottomTabsBehaviour.fromString(json.optString("bottomTabsOnPress"))
32
65
  }
33
66
  }