@apexnative/navigation 1.0.0-alpha.3 → 1.0.0-alpha.5

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 (239) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/android/CLAUDE.md +26 -9
  3. package/android/CORE.md +32 -17
  4. package/android/RECIPES.md +9 -3
  5. package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +25 -9
  6. package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
  7. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
  8. package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
  9. package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
  10. package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
  11. package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
  12. package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +2 -2
  13. package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
  14. package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
  15. package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
  16. package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
  17. package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +6 -6
  18. package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
  19. package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
  20. package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +33 -22
  21. package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +5 -4
  22. package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
  23. package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +39 -20
  24. package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -4
  25. package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +6 -6
  26. package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +10 -5
  27. package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +47 -46
  28. package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +34 -7
  29. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
  30. package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +6 -4
  31. package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
  32. package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +12 -12
  33. package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +4 -3
  34. package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
  35. package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
  36. package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
  37. package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
  38. package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
  39. package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
  40. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +3 -2
  41. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
  42. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +25 -17
  43. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
  44. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +6 -2
  45. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
  46. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
  47. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
  48. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +5 -5
  49. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
  50. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +45 -14
  51. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +25 -8
  52. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +8 -5
  53. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +8 -8
  54. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
  55. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +1 -1
  56. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
  57. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +61 -15
  58. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +28 -18
  59. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +25 -12
  60. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +2 -1
  61. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +85 -29
  62. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +2 -2
  63. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +7 -5
  64. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
  65. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +5 -8
  66. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
  67. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
  68. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +14 -11
  69. package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +56 -21
  70. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +4 -2
  71. package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
  72. package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
  73. package/cli/doctor/checks/app.js +61 -13
  74. package/cli/doctor/checks/splash.js +4 -22
  75. package/cli/migrate/native.js +18 -0
  76. package/cli/setup/source.js +2 -1
  77. package/cli/setup/steps/mainApplication.js +134 -19
  78. package/cli/splash/index.js +3 -1
  79. package/docs-md/architecture/transitions.md +6 -7
  80. package/docs-md/containers/modals.md +2 -2
  81. package/docs-md/guides/cli.md +1 -2
  82. package/docs-md/help/glossary.md +1 -1
  83. package/docs-md/help/troubleshooting.md +22 -5
  84. package/docs-md/index.json +4 -0
  85. package/docs-md/migration/from-react-native-navigation.md +8 -2
  86. package/docs-md/screen-ui/back-and-gestures.md +24 -2
  87. package/docs-md/start/installation.md +4 -2
  88. package/ios/CLAUDE.md +17 -5
  89. package/ios/CORE.md +18 -13
  90. package/ios/Contract/ANNCommandAnswer.h +9 -2
  91. package/ios/Contract/ANNCommandAnswer.mm +28 -30
  92. package/ios/Contract/ANNCommandContract.h +15 -0
  93. package/ios/Contract/ANNCommandContract.mm +78 -0
  94. package/ios/Core/ANNAppearanceDispatcher.h +5 -4
  95. package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
  96. package/ios/Core/ANNErrorHandler.h +1 -1
  97. package/ios/Core/ANNErrorHandler.mm +3 -1
  98. package/ios/Core/ANNEventEmitter.h +1 -1
  99. package/ios/Core/ANNEventEmitter.mm +2 -2
  100. package/ios/Core/ANNJavaScriptCalls.h +34 -0
  101. package/ios/Core/ANNJavaScriptCalls.mm +61 -0
  102. package/ios/Core/ANNNavigationState.h +7 -5
  103. package/ios/Core/ANNNavigationState.mm +8 -7
  104. package/ios/Core/ANNNodeHelper.h +32 -12
  105. package/ios/Core/ANNNodeHelper.mm +100 -3
  106. package/ios/Core/ANNRenderWait.h +15 -1
  107. package/ios/Core/ANNRenderWait.mm +119 -17
  108. package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
  109. package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
  110. package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
  111. package/ios/Layouts/Modal/ANNModalCoordinator.mm +55 -14
  112. package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
  113. package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
  114. package/ios/Layouts/Screen/ANNComponentViewController.h +8 -0
  115. package/ios/Layouts/Screen/ANNComponentViewController.mm +32 -5
  116. package/ios/Layouts/Screen/ANNScreenPlace.h +41 -0
  117. package/ios/Layouts/Screen/ANNScreenPlace.mm +175 -0
  118. package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
  119. package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
  120. package/ios/Layouts/SplitView/ANNSplitViewController.mm +4 -2
  121. package/ios/Layouts/Stack/ANNPreviewPush.h +5 -5
  122. package/ios/Layouts/Stack/ANNPreviewPush.mm +85 -22
  123. package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
  124. package/ios/Layouts/Stack/ANNStackController.mm +26 -3
  125. package/ios/Layouts/Stack/ANNStackQueue.h +3 -1
  126. package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
  127. package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
  128. package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
  129. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
  130. package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
  131. package/ios/Layouts/Tabs/ANNBottomTabsController.mm +13 -5
  132. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +2 -2
  133. package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +109 -7
  134. package/ios/Options/ANNOptionsCache.h +7 -6
  135. package/ios/Options/ANNSearchBarOptions.h +4 -3
  136. package/ios/Options/ANNUserChoice.h +57 -0
  137. package/ios/Options/ANNUserChoice.mm +44 -0
  138. package/ios/Options/Params/ANNImageSource.h +61 -0
  139. package/ios/Options/Params/ANNImageSource.mm +101 -0
  140. package/ios/Options/Params/ANNOptionImages.h +37 -0
  141. package/ios/Options/Params/ANNOptionImages.mm +284 -0
  142. package/ios/Options/Params/Image.h +11 -2
  143. package/ios/Options/Params/Image.mm +15 -2
  144. package/ios/Options/Params/ImageParser.h +5 -5
  145. package/ios/Options/Params/ImageParser.mm +28 -46
  146. package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
  147. package/ios/RECIPES.md +11 -5
  148. package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
  149. package/ios/React/Slots/ANNSlotContainers.h +14 -6
  150. package/ios/React/Slots/ANNSlotContainers.mm +75 -2
  151. package/ios/TopBar/ANNBarButtons.h +9 -5
  152. package/ios/TopBar/ANNBarButtons.mm +211 -63
  153. package/ios/TopBar/ANNIconButtonImage.h +1 -0
  154. package/ios/TopBar/ANNIconButtonImage.mm +34 -1
  155. package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
  156. package/ios/TopBar/ANNLargeTitlePresenter.mm +26 -3
  157. package/ios/TopBar/ANNSearchPresenter.mm +170 -19
  158. package/ios/TopBar/ANNTopBarPresenter.h +5 -0
  159. package/ios/TopBar/ANNTopBarPresenter.mm +60 -11
  160. package/ios/TurboModules/ANNTurboModule.mm +39 -21
  161. package/lib/module/ARCHITECTURE.md +18 -18
  162. package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
  163. package/lib/module/api/commands/commands.js +54 -6
  164. package/lib/module/api/commands/commands.js.map +1 -1
  165. package/lib/module/api/navigation.js.map +1 -1
  166. package/lib/module/engine/commands.js +9 -7
  167. package/lib/module/engine/commands.js.map +1 -1
  168. package/lib/module/engine/layout.js +13 -9
  169. package/lib/module/engine/layout.js.map +1 -1
  170. package/lib/module/engine/options.js +44 -11
  171. package/lib/module/engine/options.js.map +1 -1
  172. package/lib/module/engine/places.js +52 -7
  173. package/lib/module/engine/places.js.map +1 -1
  174. package/lib/module/engine/props.js +30 -1
  175. package/lib/module/engine/props.js.map +1 -1
  176. package/lib/module/engine/rememberedOptions.js +1 -1
  177. package/lib/module/engine/rememberedOptions.js.map +1 -1
  178. package/lib/module/engine/screens.js +22 -12
  179. package/lib/module/engine/screens.js.map +1 -1
  180. package/lib/module/interfaces/contract/commands.json +101 -0
  181. package/lib/typescript/adapters/NativeANNTurboModule.d.ts +5 -2
  182. package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
  183. package/lib/typescript/api/commands/commands.d.ts.map +1 -1
  184. package/lib/typescript/api/commands/presentation.d.ts +4 -3
  185. package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
  186. package/lib/typescript/api/events/navigationEvents.d.ts +1 -1
  187. package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
  188. package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
  189. package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
  190. package/lib/typescript/api/navigation.d.ts +4 -1
  191. package/lib/typescript/api/navigation.d.ts.map +1 -1
  192. package/lib/typescript/engine/commands.d.ts.map +1 -1
  193. package/lib/typescript/engine/options.d.ts +5 -2
  194. package/lib/typescript/engine/options.d.ts.map +1 -1
  195. package/lib/typescript/engine/places.d.ts +7 -2
  196. package/lib/typescript/engine/places.d.ts.map +1 -1
  197. package/lib/typescript/engine/props.d.ts +8 -1
  198. package/lib/typescript/engine/props.d.ts.map +1 -1
  199. package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
  200. package/lib/typescript/engine/screens.d.ts.map +1 -1
  201. package/lib/typescript/interfaces/ComponentEvents.d.ts +2 -2
  202. package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
  203. package/lib/typescript/interfaces/Events.d.ts +19 -10
  204. package/lib/typescript/interfaces/Events.d.ts.map +1 -1
  205. package/lib/typescript/interfaces/Options.d.ts +1 -1
  206. package/lib/typescript/interfaces/Options.d.ts.map +1 -1
  207. package/lib/typescript/interfaces/options/animations.d.ts +23 -4
  208. package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
  209. package/lib/typescript/interfaces/options/buttons.d.ts +13 -5
  210. package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
  211. package/lib/typescript/interfaces/options/stack.d.ts +9 -0
  212. package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
  213. package/lib/typescript/interfaces/options/topBar.d.ts +22 -9
  214. package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
  215. package/package.json +1 -1
  216. package/src/ARCHITECTURE.md +18 -18
  217. package/src/adapters/NativeANNTurboModule.ts +5 -2
  218. package/src/api/commands/commands.ts +48 -7
  219. package/src/api/commands/presentation.ts +4 -3
  220. package/src/api/events/navigationEvents.ts +1 -1
  221. package/src/api/hooks/useNavigation.ts +1 -1
  222. package/src/api/navigation.ts +4 -1
  223. package/src/engine/commands.ts +19 -7
  224. package/src/engine/layout.ts +16 -9
  225. package/src/engine/options.ts +39 -11
  226. package/src/engine/places.ts +65 -7
  227. package/src/engine/props.ts +30 -1
  228. package/src/engine/rememberedOptions.ts +4 -1
  229. package/src/engine/screens.tsx +23 -13
  230. package/src/interfaces/ComponentEvents.ts +2 -2
  231. package/src/interfaces/Events.ts +19 -10
  232. package/src/interfaces/Options.ts +1 -0
  233. package/src/interfaces/contract/commands.json +101 -0
  234. package/src/interfaces/options/animations.ts +24 -4
  235. package/src/interfaces/options/buttons.ts +13 -5
  236. package/src/interfaces/options/stack.ts +9 -0
  237. package/src/interfaces/options/topBar.ts +22 -9
  238. package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
  239. package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
@@ -26,6 +26,15 @@ export interface HardwareBackButtonOptions {
26
26
  * @internal
27
27
  */
28
28
  dismissModalOnPress?: boolean;
29
+ /**
30
+ * (Android) Whether back on the first screen of the app, with nothing left to go back to, plays the system's
31
+ * animation of going home. The system decides it as the gesture starts, so with `false` the navigation keeps the
32
+ * back on that screen too: the gesture shows no animation, and on release the press goes to `BackHandler` listeners,
33
+ * then to the activity's own back (`invokeDefaultOnBackPressed` of the app's activity, such as `moveTaskToBack`).
34
+ * Read from the screen back acts on; set it in the default options for the whole app. iOS ignores it.
35
+ * @default true
36
+ */
37
+ systemAnimation?: boolean;
29
38
  }
30
39
 
31
40
  /**
@@ -11,7 +11,11 @@ import type { Color, FontFamily, FontStyle, FontWeight, ImageResource } from './
11
11
  * `name` replaces it.
12
12
  */
13
13
  export interface OptionsTopBarTitleComponent {
14
- /** The id of the component. Without it, the library gives one. The same `name` and `id` mean the same component. */
14
+ /**
15
+ * The id of the component. Without it, the library gives one made of the screen, the component's place in the
16
+ * options and its `name`: it stays the same for every `mergeOptions` of the screen, so the mounted component stays
17
+ * and only its props change. The same `name` and `id` mean the same component.
18
+ */
15
19
  id?: string;
16
20
  /** The name of the registered component. */
17
21
  name: string;
@@ -276,7 +280,11 @@ export interface OptionsTopBarBackground {
276
280
 
277
281
  /** The React component that is the background of the bar. */
278
282
  export interface OptionsTopBarBackgroundComponent {
279
- /** The id of the component. Without it, the library gives one. The same `name` and `id` mean the same component. */
283
+ /**
284
+ * The id of the component. Without it, the library gives one made of the screen, the component's place in the
285
+ * options and its `name`: it stays the same for every `mergeOptions` of the screen, so the mounted component stays
286
+ * and only its props change. The same `name` and `id` mean the same component.
287
+ */
280
288
  id?: string;
281
289
  /** The name of the registered component. */
282
290
  name: string;
@@ -432,7 +440,11 @@ export interface OptionsSearchBarSuggestion {
432
440
  * component; a different `id` or `name` replaces the component, and so the search.
433
441
  */
434
442
  export interface OptionsSearchBarResultsComponent {
435
- /** The id of the component. Without it, the library gives one. The same `name` and `id` mean the same component. */
443
+ /**
444
+ * The id of the component. Without it, the library gives one made of the screen, the component's place in the
445
+ * options and its `name`: it stays the same for every `mergeOptions` of the screen, so the mounted component stays
446
+ * and only its props change. The same `name` and `id` mean the same component.
447
+ */
436
448
  id?: string;
437
449
  /** The name of the registered component. */
438
450
  name: string;
@@ -518,8 +530,9 @@ export interface OptionsSearchBar {
518
530
  */
519
531
  scopes?: OptionsSearchBarScope[];
520
532
  /**
521
- * The id of the selected scope; without it, or with an unknown id, the first. The user's pick is written into the
522
- * options of the screen and stays after coming back. `mergeOptions` switches the scope without an event.
533
+ * The id of the selected scope; without it, or with an unknown id, the first. The user's pick stays with the screen,
534
+ * after coming back, through a `mergeOptions` that sends the same value again and `setDefaultOptions`. A
535
+ * `mergeOptions` into the screen with another value switches the scope without an event.
523
536
  */
524
537
  selectedScope?: string;
525
538
  /**
@@ -531,15 +544,15 @@ export interface OptionsSearchBar {
531
544
  scopeBarActivation?: 'automatic' | 'onTextEntry' | 'onSearchActivation';
532
545
  /**
533
546
  * (iOS) Tokens in front of the text of the field. The search events carry the ids of the tokens in the field as
534
- * `tokens`; deleting a token sends a search-updated event, and the deleted tokens (and ones brought back with Undo)
535
- * are written to the options of the screen. Closing the search clears the field and its tokens. An empty list removes
547
+ * `tokens`; deleting a token sends a search-updated event, and what the user deleted (or brought back with Undo)
548
+ * stays with the screen until a `mergeOptions` gives other tokens. Closing the search clears the field and its tokens. An empty list removes
536
549
  * them all.
537
550
  */
538
551
  tokens?: OptionsSearchBarToken[];
539
552
  /**
540
553
  * (iOS 16+, Android) The suggestions shown while searching. Picking one sends a suggestion-picked event with its id
541
- * to the screen; the text stays and the list goes. They also go when the user types on, and new ones come with
542
- * `mergeOptions`, usually on a search-updated event. An empty list removes them.
554
+ * to the screen; the text stays and the list goes. They also go when the user types on; the list a `mergeOptions`
555
+ * gives shows again, the same one too, usually on a search-updated event. An empty list removes them.
543
556
  */
544
557
  suggestions?: OptionsSearchBarSuggestion[];
545
558
  /**
@@ -1,62 +0,0 @@
1
- package dev.apexnative.navigation.react.events
2
-
3
- import android.os.Handler
4
- import android.os.Looper
5
- import dev.apexnative.navigation.viewcontrollers.bottomtabs.BottomTabsController
6
- import dev.apexnative.navigation.viewcontrollers.navigator.Navigators
7
- import dev.apexnative.navigation.viewcontrollers.parent.ParentController
8
- import dev.apexnative.navigation.viewcontrollers.viewcontroller.ViewController
9
-
10
- /**
11
- * Tells JavaScript the screen the user sees and the selected tab when they change. Every change of the screen the
12
- * user sees comes with a screen appearing: a push, a pop, a modal, a tab, a menu. One update after the events of a
13
- * pass of the main loop, and one at once before a command resolves its promise; each sent only when the state changed.
14
- */
15
- object NavigationStateReporter {
16
- internal data class State(val screenId: String?, val screenName: String?, val tab: Int?)
17
-
18
- private val handler = Handler(Looper.getMainLooper())
19
- private var state: State? = null
20
- private var scheduled = false
21
-
22
- /** The new JavaScript has no state yet: the next one goes to it whatever it is. */
23
- fun reset() {
24
- state = null
25
- }
26
-
27
- fun setNeedsUpdate(emitter: EventEmitter) {
28
- if (scheduled) return
29
- scheduled = true
30
- handler.post {
31
- scheduled = false
32
- updateNow(emitter)
33
- }
34
- }
35
-
36
- /**
37
- * Sends the state at once when it differs from the last one sent. A command calls it right before it resolves its
38
- * promise: the event and the resolution reach JavaScript in that order, so the state is new when the `await` of
39
- * the command goes on. The update already scheduled then finds nothing new. Main thread only.
40
- */
41
- fun updateNow(emitter: EventEmitter) {
42
- // The navigation of the activity the commands run in (`Navigators.current`).
43
- val navigator = Navigators.current()?.navigator ?: return
44
- val next = stateOf(navigator.visibleLayout)
45
- if (next == state) return
46
- state = next
47
- emitter.emitNavigationStateChanged(next.screenId, next.screenName, next.tab)
48
- }
49
-
50
- // The top modal, or the root ([layout]), down to the screen the user sees; overlays don't count. The tab is the
51
- // selected one of the nearest tabs the screen is in, the last met on the way down, in a modal too: the tabs
52
- // `selectTab` acts on from it. None for a screen out of tabs.
53
- internal fun stateOf(layout: ViewController<*>?): State {
54
- var tab: Int? = null
55
- var current = layout ?: return State(null, null, null)
56
- while (current is ParentController<*>) {
57
- if (current is BottomTabsController) tab = current.selectedIndex
58
- current = current.currentChild ?: return State(null, null, null)
59
- }
60
- return State(current.id, current.currentComponentName, tab)
61
- }
62
- }
@@ -1,62 +0,0 @@
1
- package dev.apexnative.navigation.react.events
2
-
3
- /**
4
- * The navigation state's posted update and its hold. [setNeedsUpdate] posts one update ([post]), coalesced: the asks of
5
- * one pass of the main loop make one, which runs [update] in a later pass. While a `setRoot` shows the modals and the
6
- * overlays of its layout the updates are held: an ask, or a posted update that runs while held (asked before the hold
7
- * was taken), only marks one as wanted, and the last release posts it. Released right before the answer, that update
8
- * finds nothing new: the state before the answer is sent at once, never held, and an identical state is never sent
9
- * twice. Every [hold] has one [release]; a release without a hold does nothing, so the count never goes below zero. An
10
- * update keeps the JavaScript it was asked for ([generation]): one asked by a JavaScript that went before it runs is
11
- * dropped; a newer ask of the new JavaScript still goes. Main thread only.
12
- */
13
- internal class StateHold(
14
- private val post: (() -> Unit) -> Unit,
15
- private val generation: () -> Int = { 0 },
16
- private val update: () -> Unit,
17
- ) {
18
- /** The holds not released yet. */
19
- var count = 0
20
- private set
21
-
22
- // An update was asked while held.
23
- private var wanted = false
24
- // An update is posted and hasn't run yet.
25
- private var scheduled = false
26
- // The JavaScript the last ask was for.
27
- private var askedIn = 0
28
-
29
- /** Asks for one update in a later pass of the main loop; while held, once the last hold is released. */
30
- fun setNeedsUpdate() {
31
- askedIn = generation()
32
- if (count > 0) wanted = true else schedule()
33
- }
34
-
35
- /** The updates asked from now on, and those posted that run from now on, wait for as many [release]s. */
36
- fun hold() {
37
- count++
38
- }
39
-
40
- /** One hold ends; with the last, the update asked while held is posted now. */
41
- fun release() {
42
- if (count == 0) return
43
- count--
44
- if (count > 0 || !wanted) return
45
- wanted = false
46
- schedule()
47
- }
48
-
49
- private fun schedule() {
50
- if (scheduled) return
51
- scheduled = true
52
- post {
53
- scheduled = false
54
- // A hold taken since it was posted: the update waits for the release. The JavaScript it was asked for
55
- // went: nothing goes to the new one, which hears its first state after its own changes.
56
- when {
57
- count > 0 -> wanted = true
58
- askedIn == generation() -> update()
59
- }
60
- }
61
- }
62
- }