@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.
- package/CHANGELOG.md +22 -0
- package/android/CLAUDE.md +26 -9
- package/android/CORE.md +32 -17
- package/android/RECIPES.md +9 -3
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +25 -9
- package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
- package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
- package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +33 -22
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +5 -4
- package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +39 -20
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -4
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +10 -5
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +47 -46
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +34 -7
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +6 -4
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +12 -12
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +4 -3
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +3 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +25 -17
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +6 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +5 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +45 -14
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +25 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +8 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +8 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +61 -15
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +28 -18
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +25 -12
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +2 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +85 -29
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +7 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +5 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +14 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +56 -21
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +4 -2
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
- package/cli/doctor/checks/app.js +61 -13
- package/cli/doctor/checks/splash.js +4 -22
- package/cli/migrate/native.js +18 -0
- package/cli/setup/source.js +2 -1
- package/cli/setup/steps/mainApplication.js +134 -19
- package/cli/splash/index.js +3 -1
- package/docs-md/architecture/transitions.md +6 -7
- package/docs-md/containers/modals.md +2 -2
- package/docs-md/guides/cli.md +1 -2
- package/docs-md/help/glossary.md +1 -1
- package/docs-md/help/troubleshooting.md +22 -5
- package/docs-md/index.json +4 -0
- package/docs-md/migration/from-react-native-navigation.md +8 -2
- package/docs-md/screen-ui/back-and-gestures.md +24 -2
- package/docs-md/start/installation.md +4 -2
- package/ios/CLAUDE.md +17 -5
- package/ios/CORE.md +18 -13
- package/ios/Contract/ANNCommandAnswer.h +9 -2
- package/ios/Contract/ANNCommandAnswer.mm +28 -30
- package/ios/Contract/ANNCommandContract.h +15 -0
- package/ios/Contract/ANNCommandContract.mm +78 -0
- package/ios/Core/ANNAppearanceDispatcher.h +5 -4
- package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
- package/ios/Core/ANNErrorHandler.h +1 -1
- package/ios/Core/ANNErrorHandler.mm +3 -1
- package/ios/Core/ANNEventEmitter.h +1 -1
- package/ios/Core/ANNEventEmitter.mm +2 -2
- package/ios/Core/ANNJavaScriptCalls.h +34 -0
- package/ios/Core/ANNJavaScriptCalls.mm +61 -0
- package/ios/Core/ANNNavigationState.h +7 -5
- package/ios/Core/ANNNavigationState.mm +8 -7
- package/ios/Core/ANNNodeHelper.h +32 -12
- package/ios/Core/ANNNodeHelper.mm +100 -3
- package/ios/Core/ANNRenderWait.h +15 -1
- package/ios/Core/ANNRenderWait.mm +119 -17
- package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
- package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
- package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +55 -14
- package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
- package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
- package/ios/Layouts/Screen/ANNComponentViewController.h +8 -0
- package/ios/Layouts/Screen/ANNComponentViewController.mm +32 -5
- package/ios/Layouts/Screen/ANNScreenPlace.h +41 -0
- package/ios/Layouts/Screen/ANNScreenPlace.mm +175 -0
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +4 -2
- package/ios/Layouts/Stack/ANNPreviewPush.h +5 -5
- package/ios/Layouts/Stack/ANNPreviewPush.mm +85 -22
- package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
- package/ios/Layouts/Stack/ANNStackController.mm +26 -3
- package/ios/Layouts/Stack/ANNStackQueue.h +3 -1
- package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +13 -5
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +2 -2
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +109 -7
- package/ios/Options/ANNOptionsCache.h +7 -6
- package/ios/Options/ANNSearchBarOptions.h +4 -3
- package/ios/Options/ANNUserChoice.h +57 -0
- package/ios/Options/ANNUserChoice.mm +44 -0
- package/ios/Options/Params/ANNImageSource.h +61 -0
- package/ios/Options/Params/ANNImageSource.mm +101 -0
- package/ios/Options/Params/ANNOptionImages.h +37 -0
- package/ios/Options/Params/ANNOptionImages.mm +284 -0
- package/ios/Options/Params/Image.h +11 -2
- package/ios/Options/Params/Image.mm +15 -2
- package/ios/Options/Params/ImageParser.h +5 -5
- package/ios/Options/Params/ImageParser.mm +28 -46
- package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
- package/ios/RECIPES.md +11 -5
- package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
- package/ios/React/Slots/ANNSlotContainers.h +14 -6
- package/ios/React/Slots/ANNSlotContainers.mm +75 -2
- package/ios/TopBar/ANNBarButtons.h +9 -5
- package/ios/TopBar/ANNBarButtons.mm +211 -63
- package/ios/TopBar/ANNIconButtonImage.h +1 -0
- package/ios/TopBar/ANNIconButtonImage.mm +34 -1
- package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
- package/ios/TopBar/ANNLargeTitlePresenter.mm +26 -3
- package/ios/TopBar/ANNSearchPresenter.mm +170 -19
- package/ios/TopBar/ANNTopBarPresenter.h +5 -0
- package/ios/TopBar/ANNTopBarPresenter.mm +60 -11
- package/ios/TurboModules/ANNTurboModule.mm +39 -21
- package/lib/module/ARCHITECTURE.md +18 -18
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
- package/lib/module/api/commands/commands.js +54 -6
- package/lib/module/api/commands/commands.js.map +1 -1
- package/lib/module/api/navigation.js.map +1 -1
- package/lib/module/engine/commands.js +9 -7
- package/lib/module/engine/commands.js.map +1 -1
- package/lib/module/engine/layout.js +13 -9
- package/lib/module/engine/layout.js.map +1 -1
- package/lib/module/engine/options.js +44 -11
- package/lib/module/engine/options.js.map +1 -1
- package/lib/module/engine/places.js +52 -7
- package/lib/module/engine/places.js.map +1 -1
- package/lib/module/engine/props.js +30 -1
- package/lib/module/engine/props.js.map +1 -1
- package/lib/module/engine/rememberedOptions.js +1 -1
- package/lib/module/engine/rememberedOptions.js.map +1 -1
- package/lib/module/engine/screens.js +22 -12
- package/lib/module/engine/screens.js.map +1 -1
- package/lib/module/interfaces/contract/commands.json +101 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +5 -2
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
- package/lib/typescript/api/commands/commands.d.ts.map +1 -1
- package/lib/typescript/api/commands/presentation.d.ts +4 -3
- package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
- package/lib/typescript/api/events/navigationEvents.d.ts +1 -1
- package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
- package/lib/typescript/api/navigation.d.ts +4 -1
- package/lib/typescript/api/navigation.d.ts.map +1 -1
- package/lib/typescript/engine/commands.d.ts.map +1 -1
- package/lib/typescript/engine/options.d.ts +5 -2
- package/lib/typescript/engine/options.d.ts.map +1 -1
- package/lib/typescript/engine/places.d.ts +7 -2
- package/lib/typescript/engine/places.d.ts.map +1 -1
- package/lib/typescript/engine/props.d.ts +8 -1
- package/lib/typescript/engine/props.d.ts.map +1 -1
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
- package/lib/typescript/engine/screens.d.ts.map +1 -1
- package/lib/typescript/interfaces/ComponentEvents.d.ts +2 -2
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
- package/lib/typescript/interfaces/Events.d.ts +19 -10
- package/lib/typescript/interfaces/Events.d.ts.map +1 -1
- package/lib/typescript/interfaces/Options.d.ts +1 -1
- package/lib/typescript/interfaces/Options.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/animations.d.ts +23 -4
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/buttons.d.ts +13 -5
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/stack.d.ts +9 -0
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/topBar.d.ts +22 -9
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ARCHITECTURE.md +18 -18
- package/src/adapters/NativeANNTurboModule.ts +5 -2
- package/src/api/commands/commands.ts +48 -7
- package/src/api/commands/presentation.ts +4 -3
- package/src/api/events/navigationEvents.ts +1 -1
- package/src/api/hooks/useNavigation.ts +1 -1
- package/src/api/navigation.ts +4 -1
- package/src/engine/commands.ts +19 -7
- package/src/engine/layout.ts +16 -9
- package/src/engine/options.ts +39 -11
- package/src/engine/places.ts +65 -7
- package/src/engine/props.ts +30 -1
- package/src/engine/rememberedOptions.ts +4 -1
- package/src/engine/screens.tsx +23 -13
- package/src/interfaces/ComponentEvents.ts +2 -2
- package/src/interfaces/Events.ts +19 -10
- package/src/interfaces/Options.ts +1 -0
- package/src/interfaces/contract/commands.json +101 -0
- package/src/interfaces/options/animations.ts +24 -4
- package/src/interfaces/options/buttons.ts +13 -5
- package/src/interfaces/options/stack.ts +9 -0
- package/src/interfaces/options/topBar.ts +22 -9
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
- 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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
522
|
-
*
|
|
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
|
|
535
|
-
*
|
|
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
|
|
542
|
-
*
|
|
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
|
/**
|
package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt
DELETED
|
@@ -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
|
-
}
|