@apexnative/navigation 1.0.0-alpha.0 → 1.0.0-alpha.10
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/ApexNavigation.podspec +2 -1
- package/CHANGELOG.md +128 -0
- package/README.md +147 -51
- package/android/CLAUDE.md +78 -25
- package/android/CORE.md +49 -25
- package/android/RECIPES.md +13 -6
- package/android/consumer-rules.pro +6 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +85 -10
- 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/BottomTabOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +13 -8
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/OptionKey.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionPaths.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +7 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +6 -1
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
- package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
- 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/ContentHeights.kt +95 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentMounts.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +35 -23
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +12 -7
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +42 -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 +54 -20
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -6
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +19 -50
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +50 -81
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventContract.kt +226 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +135 -94
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +12 -10
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +39 -19
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +16 -4
- 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/MaterialTheme.kt +5 -6
- package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +0 -13
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
- 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/ScreenFrame.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
- 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 +49 -14
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
- 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 +77 -17
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
- 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 +30 -34
- 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/BarRowTransition.kt +3 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
- 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 +219 -54
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
- package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
- package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
- package/android/src/main/jni/ANNContentHeights.cpp +82 -0
- package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
- package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
- package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
- package/android/src/main/res/values/styles.xml +1 -1
- package/android/src/main/res/values-night/styles.xml +1 -1
- package/cli/app.js +1 -1
- package/cli/doctor/checks/app.js +77 -14
- package/cli/doctor/checks/splash.js +4 -22
- package/cli/migrate/native.js +18 -0
- package/cli/project.js +10 -2
- package/cli/setup/index.js +18 -0
- package/cli/setup/source.js +2 -1
- package/cli/setup/steps/appDelegate.js +66 -11
- package/cli/setup/steps/mainApplication.js +134 -19
- package/cli/setup/steps/metro.js +46 -0
- package/cli/setup/steps/sceneDelegate.js +108 -0
- package/cli/splash/index.js +3 -1
- package/cli/upgrade/changelog.js +2 -2
- package/docs-md/architecture/native-screens.md +4 -0
- package/docs-md/architecture/theme-and-context.md +131 -12
- package/docs-md/architecture/transitions.md +58 -12
- package/docs-md/containers/modals.md +8 -4
- package/docs-md/containers/overlays.md +3 -1
- package/docs-md/containers/side-menu.md +19 -2
- package/docs-md/containers/tabs.md +5 -1
- package/docs-md/flows/bottom-sheets.md +4 -2
- package/docs-md/flows/forms-in-a-modal.md +1 -1
- package/docs-md/fundamentals/screens-and-props.md +9 -1
- package/docs-md/fundamentals/starting-the-app.md +1 -1
- package/docs-md/guides/cli.md +4 -3
- package/docs-md/guides/deep-links.md +15 -33
- package/docs-md/help/glossary.md +4 -4
- package/docs-md/help/troubleshooting.md +44 -6
- package/docs-md/index.json +57 -1
- package/docs-md/migration/from-expo-router.md +1 -1
- package/docs-md/migration/from-react-native-navigation.md +9 -3
- package/docs-md/migration/from-react-navigation.md +2 -2
- package/docs-md/screen-ui/back-and-gestures.md +46 -2
- package/docs-md/screen-ui/bar-buttons.md +5 -5
- package/docs-md/screen-ui/search.md +1 -1
- package/docs-md/screen-ui/system-ui.md +17 -12
- package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
- package/docs-md/screen-ui/top-bar.md +8 -4
- package/docs-md/start/installation.md +21 -3
- package/ios/Animations/ANNFrameDriver.h +55 -15
- package/ios/Animations/ANNFrameDriver.mm +216 -60
- package/ios/Animations/ANNTransitionAnimator.h +26 -5
- package/ios/Animations/ANNTransitionAnimator.mm +61 -13
- package/ios/Animations/ANNTransitionPlan.h +2 -2
- package/ios/Animations/ANNTransitionPlan.mm +10 -0
- package/ios/Animations/ANNTransitionWait.mm +6 -7
- package/ios/Animations/Elements/ANNElementFinder.h +57 -0
- package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
- package/ios/Animations/Elements/ANNElementTransition.h +10 -8
- package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
- package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
- package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
- package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
- package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
- package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
- package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
- package/ios/CLAUDE.md +60 -24
- package/ios/CORE.md +44 -34
- package/ios/Contract/ANNCommandAnswer.h +13 -5
- package/ios/Contract/ANNCommandAnswer.mm +40 -32
- package/ios/Contract/ANNCommandContract.h +15 -0
- package/ios/Contract/ANNCommandContract.mm +78 -0
- package/ios/Contract/ANNCommandRunner.h +10 -9
- package/ios/Contract/ANNCommandRunner.mm +22 -28
- package/ios/Contract/ANNErrorTexts.h +6 -2
- package/ios/Contract/ANNErrorTexts.mm +18 -10
- package/ios/Contract/ANNLayoutNode.h +3 -3
- package/ios/Contract/ANNLayoutReader.h +3 -3
- package/ios/Core/ANNAppDelegate.mm +0 -2
- package/ios/Core/ANNAppearanceDispatcher.h +5 -4
- package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
- package/ios/Core/ANNDeepLinkQueue.h +22 -2
- package/ios/Core/ANNDeepLinkQueue.mm +121 -14
- package/ios/Core/ANNErrorHandler.h +9 -4
- package/ios/Core/ANNErrorHandler.mm +20 -2
- package/ios/Core/ANNEventContract.h +246 -0
- package/ios/Core/ANNEventContract.mm +225 -0
- package/ios/Core/ANNEventEmitter.h +6 -2
- package/ios/Core/ANNEventEmitter.mm +117 -80
- package/ios/Core/ANNHinge.h +6 -0
- package/ios/Core/ANNHinge.mm +15 -4
- package/ios/Core/ANNJavaScriptCalls.h +33 -0
- package/ios/Core/ANNJavaScriptCalls.mm +52 -0
- package/ios/Core/ANNLayoutProtocol.h +5 -5
- 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/ANNParking.h +5 -4
- package/ios/Core/ANNReloadCoordinator.mm +5 -12
- package/ios/Core/ANNRenderWait.h +20 -6
- package/ios/Core/ANNRenderWait.mm +143 -56
- package/ios/Core/ANNSceneDelegate.mm +25 -15
- package/ios/Core/ANNSystemUI.h +3 -2
- package/ios/Core/ANNSystemUI.mm +7 -0
- package/ios/Core/ANNUtils.h +7 -0
- package/ios/Core/ANNUtils.mm +10 -0
- package/ios/Core/ApexNavigation+Internal.h +1 -1
- package/ios/Core/ApexNavigation.mm +7 -6
- package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
- package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +10 -8
- package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
- package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
- package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
- package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
- package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
- package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
- package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
- package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
- package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
- package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
- package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
- package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
- package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
- package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
- package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
- package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
- package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
- package/ios/Layouts/Screen/ANNScreenSettling.h +32 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +137 -0
- package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
- package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
- package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
- package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
- package/ios/Layouts/Stack/ANNStackController.h +8 -0
- package/ios/Layouts/Stack/ANNStackController.mm +184 -16
- package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
- package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
- package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
- package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
- 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/ANNBottomTabsAccessoryView.h +12 -1
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
- package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
- package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
- package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
- package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
- package/ios/Options/ANNAnimationOptions.h +2 -1
- package/ios/Options/ANNAnimationOptions.mm +1 -1
- package/ios/Options/ANNBottomTabsOptions.h +2 -0
- package/ios/Options/ANNBottomTabsOptions.mm +1 -0
- package/ios/Options/ANNOptions.h +25 -0
- package/ios/Options/ANNOptions.mm +157 -1
- package/ios/Options/ANNOptionsCache.h +7 -6
- package/ios/Options/ANNOptionsReader.mm +108 -0
- package/ios/Options/ANNSearchBarOptions.h +4 -3
- package/ios/Options/ANNSheetOptions.h +4 -1
- package/ios/Options/ANNSideMenuOptions.h +2 -0
- package/ios/Options/ANNSideMenuOptions.mm +2 -0
- package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
- 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/ANNParam.h +15 -0
- package/ios/Options/Params/ANNParam.mm +61 -0
- package/ios/Options/Params/Color.h +3 -0
- package/ios/Options/Params/Color.mm +21 -0
- package/ios/Options/Params/ColorParser.h +4 -3
- package/ios/Options/Params/ColorParser.mm +22 -4
- package/ios/Options/Params/Image.h +15 -2
- package/ios/Options/Params/Image.mm +35 -2
- package/ios/Options/Params/ImageParser.h +5 -5
- package/ios/Options/Params/ImageParser.mm +28 -46
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
- package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
- package/ios/RECIPES.md +13 -6
- package/ios/React/ANNReactView.mm +6 -25
- package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
- package/ios/React/ANNSurfaceHostingView.h +14 -0
- package/ios/React/ANNSurfaceHostingView.mm +144 -1
- 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/React/Slots/ANNSlotHost.mm +1 -3
- package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
- package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
- package/ios/TopBar/ANNBarAppearance.h +2 -1
- package/ios/TopBar/ANNBarAppearance.mm +111 -30
- package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
- package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
- package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
- package/ios/TopBar/ANNBarButtons.h +14 -8
- package/ios/TopBar/ANNBarButtons.mm +397 -80
- 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 +50 -7
- package/ios/TopBar/ANNMainList.h +3 -0
- package/ios/TopBar/ANNMainList.mm +4 -0
- package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
- package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
- package/ios/TopBar/ANNSearchPresenter.mm +172 -21
- package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
- package/ios/TopBar/ANNTopBarPresenter.h +8 -2
- package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
- package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
- package/ios/TurboModules/ANNTurboModule.mm +104 -33
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
- package/lib/module/ARCHITECTURE.md +40 -27
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
- package/lib/module/api/app/AppRegistry.js +14 -2
- package/lib/module/api/app/AppRegistry.js.map +1 -1
- package/lib/module/api/app/createNavigation.js +190 -66
- package/lib/module/api/app/createNavigation.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/events/navigationEvents.js +6 -2
- package/lib/module/api/events/navigationEvents.js.map +1 -1
- package/lib/module/api/hooks/useNavigation.js +8 -3
- package/lib/module/api/hooks/useNavigation.js.map +1 -1
- package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
- package/lib/module/api/linking/dispatchedLinks.js +23 -0
- package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
- package/lib/module/api/linking/linking.js +11 -0
- package/lib/module/api/linking/linking.js.map +1 -1
- package/lib/module/api/navigation.js.map +1 -1
- package/lib/module/api/options/OptionsChain.js +2 -2
- package/lib/module/api/screens/defineScreen.js +45 -3
- package/lib/module/api/screens/defineScreen.js.map +1 -1
- package/lib/module/api/screens/nativeScreens.js +31 -6
- package/lib/module/api/screens/nativeScreens.js.map +1 -1
- package/lib/module/api/screens/registerScreens.js +193 -35
- package/lib/module/api/screens/registerScreens.js.map +1 -1
- package/lib/module/api/theme/theme.js +5 -0
- package/lib/module/api/theme/theme.js.map +1 -1
- package/lib/module/engine/commands.js +51 -9
- package/lib/module/engine/commands.js.map +1 -1
- package/lib/module/engine/layout.js +20 -11
- package/lib/module/engine/layout.js.map +1 -1
- package/lib/module/engine/nativeScreens.js +9 -0
- package/lib/module/engine/nativeScreens.js.map +1 -1
- package/lib/module/engine/options.js +49 -15
- package/lib/module/engine/options.js.map +1 -1
- package/lib/module/engine/optionsChange.js +102 -0
- package/lib/module/engine/optionsChange.js.map +1 -0
- 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/refresh.js +85 -0
- package/lib/module/engine/refresh.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +61 -1
- package/lib/module/engine/rememberedOptions.js.map +1 -1
- package/lib/module/engine/screens.js +77 -16
- package/lib/module/engine/screens.js.map +1 -1
- package/lib/module/interfaces/contract/commands.json +101 -0
- package/lib/module/interfaces/contract/errors.json +275 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
- package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
- package/lib/typescript/api/app/createNavigation.d.ts +8 -3
- package/lib/typescript/api/app/createNavigation.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 +3 -3
- 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/hooks/useSafeAreaInsets.d.ts +4 -3
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
- package/lib/typescript/api/index.d.ts +1 -1
- package/lib/typescript/api/index.d.ts.map +1 -1
- package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
- package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
- package/lib/typescript/api/linking/linking.d.ts +8 -0
- package/lib/typescript/api/linking/linking.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/api/options/OptionsChain.d.ts +2 -2
- package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
- package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
- package/lib/typescript/api/theme/theme.d.ts +2 -0
- package/lib/typescript/api/theme/theme.d.ts.map +1 -1
- package/lib/typescript/engine/commands.d.ts +5 -0
- package/lib/typescript/engine/commands.d.ts.map +1 -1
- package/lib/typescript/engine/layout.d.ts.map +1 -1
- package/lib/typescript/engine/nativeScreens.d.ts +5 -0
- package/lib/typescript/engine/nativeScreens.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/optionsChange.d.ts +28 -0
- package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
- 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/refresh.d.ts +35 -0
- package/lib/typescript/engine/refresh.d.ts.map +1 -0
- package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
- package/lib/typescript/engine/screens.d.ts +27 -6
- package/lib/typescript/engine/screens.d.ts.map +1 -1
- package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
- package/lib/typescript/interfaces/Events.d.ts +28 -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 +80 -22
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/modals.d.ts +34 -26
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/stack.d.ts +17 -3
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/system.d.ts +18 -11
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
- package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
- package/metro/acceptPlugin.js +57 -0
- package/metro/babelTransformer.js +45 -0
- package/metro/index.js +36 -0
- package/package.json +4 -25
- package/src/ARCHITECTURE.md +40 -27
- package/src/adapters/NativeANNTurboModule.ts +12 -2
- package/src/api/app/AppRegistry.ts +16 -2
- package/src/api/app/createNavigation.ts +203 -69
- package/src/api/commands/commands.ts +48 -7
- package/src/api/commands/presentation.ts +4 -3
- package/src/api/events/navigationEvents.ts +10 -4
- package/src/api/hooks/useNavigation.ts +9 -4
- package/src/api/hooks/useSafeAreaInsets.ts +4 -3
- package/src/api/index.ts +1 -0
- package/src/api/linking/dispatchedLinks.ts +18 -0
- package/src/api/linking/linking.ts +22 -1
- package/src/api/navigation.ts +4 -1
- package/src/api/options/OptionsChain.ts +2 -2
- package/src/api/screens/defineScreen.ts +49 -5
- package/src/api/screens/nativeScreens.ts +40 -4
- package/src/api/screens/registerScreens.tsx +185 -42
- package/src/api/theme/theme.ts +5 -0
- package/src/engine/commands.ts +70 -13
- package/src/engine/layout.ts +27 -11
- package/src/engine/nativeScreens.ts +10 -1
- package/src/engine/options.ts +45 -19
- package/src/engine/optionsChange.ts +107 -0
- package/src/engine/places.ts +65 -7
- package/src/engine/props.ts +30 -1
- package/src/engine/refresh.ts +97 -0
- package/src/engine/rememberedOptions.ts +74 -1
- package/src/engine/screens.tsx +76 -21
- package/src/interfaces/ComponentEvents.ts +4 -4
- package/src/interfaces/Events.ts +29 -10
- package/src/interfaces/Options.ts +1 -0
- package/src/interfaces/contract/commands.json +101 -0
- package/src/interfaces/contract/errors.json +275 -0
- package/src/interfaces/options/animations.ts +81 -22
- package/src/interfaces/options/bottomTabs.ts +21 -7
- package/src/interfaces/options/buttons.ts +23 -15
- package/src/interfaces/options/modals.ts +34 -26
- package/src/interfaces/options/sideMenu.ts +24 -6
- package/src/interfaces/options/stack.ts +17 -3
- package/src/interfaces/options/system.ts +18 -11
- package/src/interfaces/options/toolbar.ts +2 -2
- package/src/interfaces/options/topBar.ts +68 -38
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
- 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
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
- package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
- package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
|
@@ -1,29 +1,16 @@
|
|
|
1
1
|
#import "ANNCommandAnswer.h"
|
|
2
2
|
#import "ANNAssert.h"
|
|
3
|
+
#import "ANNCommandContract.h"
|
|
3
4
|
#import "ANNErrorHandler.h"
|
|
4
5
|
#import "ANNErrorTexts.h"
|
|
5
6
|
#import "ANNNavigationState.h"
|
|
6
7
|
#import "ANNReloadCoordinator.h"
|
|
7
8
|
#import "ApexNavigation+Internal.h"
|
|
8
9
|
|
|
9
|
-
// The commands that send `ANN.CommandCompleted` once they resolved: every one that shows or dismisses, not
|
|
10
|
-
// `setColumnShown`, `preparePush` or `getLaunchLink`.
|
|
11
|
-
static NSSet<NSString *> *ANNCompletedCommandNames(void) {
|
|
12
|
-
static NSSet<NSString *> *names;
|
|
13
|
-
static dispatch_once_t once;
|
|
14
|
-
dispatch_once(&once, ^{
|
|
15
|
-
names = [NSSet setWithArray:@[
|
|
16
|
-
@"setRoot", @"push", @"pop", @"popTo", @"popToRoot", @"setStackRoot", @"showInColumn",
|
|
17
|
-
@"showModal", @"dismissModal", @"dismissAllModals", @"showOverlay", @"dismissOverlay",
|
|
18
|
-
@"dismissAllOverlays"
|
|
19
|
-
]];
|
|
20
|
-
});
|
|
21
|
-
return names;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
10
|
@implementation ANNCommandAnswer {
|
|
25
11
|
RCTPromiseResolveBlock _resolve;
|
|
26
12
|
RCTPromiseRejectBlock _reject;
|
|
13
|
+
BOOL _stateReported;
|
|
27
14
|
}
|
|
28
15
|
|
|
29
16
|
- (instancetype)initWithCommandName:(NSString *)commandName
|
|
@@ -41,6 +28,16 @@ static NSSet<NSString *> *ANNCompletedCommandNames(void) {
|
|
|
41
28
|
return self;
|
|
42
29
|
}
|
|
43
30
|
|
|
31
|
+
// The last reference went without an answer: nothing took the command, or what took it let it go. The promise of a
|
|
32
|
+
// JavaScript that still runs rejects, so it never waits forever. Any thread: the promise blocks are React Native's,
|
|
33
|
+
// safe from any thread, and the generation is readable from any thread.
|
|
34
|
+
- (void)dealloc {
|
|
35
|
+
if (_answered || !self.isCurrent) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
[ANNErrorHandler reject:_reject of:_commandName text:[ANNErrorTexts notAnswered:_commandName]];
|
|
39
|
+
}
|
|
40
|
+
|
|
44
41
|
- (BOOL)isCurrent {
|
|
45
42
|
return _generation == ANNReloadCoordinator.generation;
|
|
46
43
|
}
|
|
@@ -55,6 +52,27 @@ static NSSet<NSString *> *ANNCompletedCommandNames(void) {
|
|
|
55
52
|
return YES;
|
|
56
53
|
}
|
|
57
54
|
|
|
55
|
+
- (void)reportStateNow {
|
|
56
|
+
ANNAssertMainQueue();
|
|
57
|
+
if (_stateReported) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
_stateReported = YES;
|
|
61
|
+
// A step made for the JavaScript that went sends nothing, as its answer does.
|
|
62
|
+
if (!self.isCurrent) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// The command did its work: a failure of the state step costs only the state, never the events and the answer.
|
|
66
|
+
@try {
|
|
67
|
+
[ANNNavigationState updateNowFor:_commandName];
|
|
68
|
+
} @catch (NSException *exception) {
|
|
69
|
+
NSString *reason = exception.reason.length > 0 ? exception.reason : exception.name;
|
|
70
|
+
[ANNErrorHandler logFailureOf:_commandName
|
|
71
|
+
text:[ANNErrorTexts couldNot:@"report the navigation state"
|
|
72
|
+
reason:reason]];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
58
76
|
- (void)resolve:(id)value {
|
|
59
77
|
if (![self takeAnswer]) {
|
|
60
78
|
return;
|
|
@@ -62,23 +80,13 @@ static NSSet<NSString *> *ANNCompletedCommandNames(void) {
|
|
|
62
80
|
RCTPromiseResolveBlock resolve = _resolve;
|
|
63
81
|
_resolve = nil;
|
|
64
82
|
_reject = nil;
|
|
65
|
-
// A command that may change what shows (
|
|
66
|
-
// `getState()` after `await` has the result.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (changesWhatShows) {
|
|
70
|
-
// The command did its work: a failure of the state step costs only the state, never the answer.
|
|
71
|
-
@try {
|
|
72
|
-
[ANNNavigationState reportBeforeAnswer];
|
|
73
|
-
} @catch (NSException *exception) {
|
|
74
|
-
NSString *reason = exception.reason.length > 0 ? exception.reason : exception.name;
|
|
75
|
-
[ANNErrorHandler logFailureOf:_commandName
|
|
76
|
-
text:[ANNErrorTexts couldNot:@"report the navigation state"
|
|
77
|
-
reason:reason]];
|
|
78
|
-
}
|
|
83
|
+
// A command that may change what shows (`ANNCommandContract`): the state goes before the promise, so that
|
|
84
|
+
// `getState()` after `await` has the result. Sent at the end of its transition already, it goes no more.
|
|
85
|
+
if (ANNCommandReportsState(_commandName)) {
|
|
86
|
+
[self reportStateNow];
|
|
79
87
|
}
|
|
80
|
-
resolve
|
|
81
|
-
if (_commandId &&
|
|
88
|
+
[ANNErrorHandler resolve:resolve of:_commandName value:value];
|
|
89
|
+
if (_commandId && ANNCommandSendsCompleted(_commandName)) {
|
|
82
90
|
double completionTime = floor(NSDate.date.timeIntervalSince1970 * 1000);
|
|
83
91
|
[ApexNavigation.eventEmitter sendCommandCompleted:_commandName
|
|
84
92
|
commandId:_commandId
|
|
@@ -93,7 +101,7 @@ static NSSet<NSString *> *ANNCompletedCommandNames(void) {
|
|
|
93
101
|
RCTPromiseRejectBlock reject = _reject;
|
|
94
102
|
_resolve = nil;
|
|
95
103
|
_reject = nil;
|
|
96
|
-
[ANNErrorHandler reject:reject text:text];
|
|
104
|
+
[ANNErrorHandler reject:reject of:_commandName text:text];
|
|
97
105
|
}
|
|
98
106
|
|
|
99
107
|
@end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Made by scripts/contract.mjs from src/interfaces/contract/commands.json: change that file and run the script again.
|
|
2
|
+
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
/// Whether the navigation state goes before the answer of the command `name`: every command that may change what
|
|
8
|
+
/// shows. Any thread.
|
|
9
|
+
FOUNDATION_EXPORT BOOL ANNCommandReportsState(NSString *name);
|
|
10
|
+
|
|
11
|
+
/// Whether `ANN.CommandCompleted` follows the answer of the command `name`: every command that shows or dismisses.
|
|
12
|
+
/// Any thread.
|
|
13
|
+
FOUNDATION_EXPORT BOOL ANNCommandSendsCompleted(NSString *name);
|
|
14
|
+
|
|
15
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Made by scripts/contract.mjs from src/interfaces/contract/commands.json: change that file and run the script again.
|
|
2
|
+
|
|
3
|
+
#import "ANNCommandContract.h"
|
|
4
|
+
|
|
5
|
+
// What each command resolves with:
|
|
6
|
+
// - `setRoot`: the id of the root, once the root and the layout's modals and overlays show.
|
|
7
|
+
// - `push`: the id of the screen that shows; of a pair, the pair's id.
|
|
8
|
+
// - `preparePush`: the frame `{ width, height, padding }` of the prepared screen, or null; always
|
|
9
|
+
// null on iOS.
|
|
10
|
+
// - `pop`: the id of the screen that went.
|
|
11
|
+
// - `popTo`: the id of the screen it went back to.
|
|
12
|
+
// - `popToRoot`: the id of the first screen of the stack.
|
|
13
|
+
// - `setStackRoot`: the id of the new top screen.
|
|
14
|
+
// - `showModal`: the id of the modal's root.
|
|
15
|
+
// - `dismissModal`: the id of the modal's root.
|
|
16
|
+
// - `dismissAllModals`: an empty string.
|
|
17
|
+
// - `showOverlay`: the id of the overlay's root.
|
|
18
|
+
// - `dismissOverlay`: the id of the overlay's root.
|
|
19
|
+
// - `dismissAllOverlays`: an empty string.
|
|
20
|
+
// - `showInColumn`: the id of the screen that shows.
|
|
21
|
+
// - `setColumnShown`: nothing once the columns stopped moving (`undefined` on iOS, `null` on
|
|
22
|
+
// Android).
|
|
23
|
+
// - `getLaunchLink`: the link that launched the app, or null.
|
|
24
|
+
|
|
25
|
+
static NSSet<NSString *> *ANNStateCommandNames(void) {
|
|
26
|
+
static NSSet<NSString *> *names;
|
|
27
|
+
static dispatch_once_t once;
|
|
28
|
+
dispatch_once(&once, ^{
|
|
29
|
+
names = [NSSet setWithArray:@[
|
|
30
|
+
@"setRoot",
|
|
31
|
+
@"push",
|
|
32
|
+
@"pop",
|
|
33
|
+
@"popTo",
|
|
34
|
+
@"popToRoot",
|
|
35
|
+
@"setStackRoot",
|
|
36
|
+
@"showModal",
|
|
37
|
+
@"dismissModal",
|
|
38
|
+
@"dismissAllModals",
|
|
39
|
+
@"showOverlay",
|
|
40
|
+
@"dismissOverlay",
|
|
41
|
+
@"dismissAllOverlays",
|
|
42
|
+
@"showInColumn",
|
|
43
|
+
@"setColumnShown",
|
|
44
|
+
]];
|
|
45
|
+
});
|
|
46
|
+
return names;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static NSSet<NSString *> *ANNCompletedCommandNames(void) {
|
|
50
|
+
static NSSet<NSString *> *names;
|
|
51
|
+
static dispatch_once_t once;
|
|
52
|
+
dispatch_once(&once, ^{
|
|
53
|
+
names = [NSSet setWithArray:@[
|
|
54
|
+
@"setRoot",
|
|
55
|
+
@"push",
|
|
56
|
+
@"pop",
|
|
57
|
+
@"popTo",
|
|
58
|
+
@"popToRoot",
|
|
59
|
+
@"setStackRoot",
|
|
60
|
+
@"showModal",
|
|
61
|
+
@"dismissModal",
|
|
62
|
+
@"dismissAllModals",
|
|
63
|
+
@"showOverlay",
|
|
64
|
+
@"dismissOverlay",
|
|
65
|
+
@"dismissAllOverlays",
|
|
66
|
+
@"showInColumn",
|
|
67
|
+
]];
|
|
68
|
+
});
|
|
69
|
+
return names;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
BOOL ANNCommandReportsState(NSString *name) {
|
|
73
|
+
return [ANNStateCommandNames() containsObject:name];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
BOOL ANNCommandSendsCompleted(NSString *name) {
|
|
77
|
+
return [ANNCompletedCommandNames() containsObject:name];
|
|
78
|
+
}
|
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
|
|
4
4
|
NS_ASSUME_NONNULL_BEGIN
|
|
5
5
|
|
|
6
|
-
/// Reads and checks a command's layout
|
|
6
|
+
/// Reads and checks a command's layout before its body, in the same task: the layout read, or nil with the text of the
|
|
7
|
+
/// rejection.
|
|
7
8
|
typedef id _Nullable (^ANNCommandCheck)(NSString *_Nullable *_Nonnull error);
|
|
8
9
|
|
|
9
|
-
/// The command's own work
|
|
10
|
-
///
|
|
10
|
+
/// The command's own work, with the layout its check read (nil without a check). It answers once, now or later; an
|
|
11
|
+
/// exception it throws rejects the command, and undoing what it made by then is the body's.
|
|
11
12
|
typedef void (^ANNCommandBody)(id _Nullable layout, ANNCommandAnswer *answer);
|
|
12
13
|
|
|
13
|
-
/// The one path of every asynchronous method of `ANNTurboModule
|
|
14
|
-
///
|
|
15
|
-
///
|
|
14
|
+
/// The one path of every asynchronous method of `ANNTurboModule`, on the main queue (the module's queue), in one task
|
|
15
|
+
/// per command in the order JavaScript made them: the command takes the generation of its JavaScript and its layout is
|
|
16
|
+
/// read and checked whole, a failure rejecting it before anything is made; then the command does nothing when its
|
|
16
17
|
/// JavaScript went, rejects when the navigation has nowhere to show screens, and runs its body inside the protection.
|
|
17
18
|
@interface ANNCommandRunner : NSObject
|
|
18
19
|
|
|
@@ -22,12 +23,12 @@ typedef void (^ANNCommandBody)(id _Nullable layout, ANNCommandAnswer *answer);
|
|
|
22
23
|
+ (void)run:(NSString *)name
|
|
23
24
|
commandId:(nullable NSString *)commandId
|
|
24
25
|
what:(NSString *)what
|
|
25
|
-
resolve:(RCTPromiseResolveBlock)resolve
|
|
26
|
-
reject:(RCTPromiseRejectBlock)reject
|
|
26
|
+
resolve:(nullable RCTPromiseResolveBlock)resolve
|
|
27
|
+
reject:(nullable RCTPromiseRejectBlock)reject
|
|
27
28
|
check:(nullable ANNCommandCheck)check
|
|
28
29
|
body:(ANNCommandBody)body;
|
|
29
30
|
|
|
30
|
-
/// A command without a promise: its body
|
|
31
|
+
/// A command without a promise: its body at once, inside the protection; a failure is one log line. Main queue.
|
|
31
32
|
+ (void)runVoid:(NSString *)name what:(NSString *)what body:(dispatch_block_t)body;
|
|
32
33
|
|
|
33
34
|
/// The log line of a command without a promise that failed: `[ApexNavigation] <name>: <text>`.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#import "ANNCommandRunner.h"
|
|
2
|
+
#import "ANNAssert.h"
|
|
2
3
|
#import "ANNErrorHandler.h"
|
|
3
4
|
#import "ANNErrorTexts.h"
|
|
4
5
|
#import "ANNReloadCoordinator.h"
|
|
5
6
|
#import "ApexNavigation+Internal.h"
|
|
6
|
-
#import <React/RCTUtils.h>
|
|
7
7
|
|
|
8
8
|
// Why an exception happened: its message, else its name.
|
|
9
9
|
static NSString *ANNReasonOf(NSException *exception) {
|
|
@@ -27,6 +27,8 @@ static NSString *ANNRejectionOf(NSException *exception, NSString *what) {
|
|
|
27
27
|
reject:(RCTPromiseRejectBlock)reject
|
|
28
28
|
check:(ANNCommandCheck)check
|
|
29
29
|
body:(ANNCommandBody)body {
|
|
30
|
+
// The module's methods come on the main queue: the check and the body run in this one task.
|
|
31
|
+
ANNAssertMainQueue();
|
|
30
32
|
NSUInteger generation = ANNReloadCoordinator.generation;
|
|
31
33
|
id layout = nil;
|
|
32
34
|
if (check) {
|
|
@@ -37,7 +39,7 @@ static NSString *ANNRejectionOf(NSException *exception, NSString *what) {
|
|
|
37
39
|
error = ANNRejectionOf(exception, what);
|
|
38
40
|
}
|
|
39
41
|
if (error) {
|
|
40
|
-
[ANNErrorHandler reject:reject text:error];
|
|
42
|
+
[ANNErrorHandler reject:reject of:name text:error];
|
|
41
43
|
return;
|
|
42
44
|
}
|
|
43
45
|
}
|
|
@@ -46,36 +48,28 @@ static NSString *ANNRejectionOf(NSException *exception, NSString *what) {
|
|
|
46
48
|
generation:generation
|
|
47
49
|
resolve:resolve
|
|
48
50
|
reject:reject];
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
[answer reject:ANNRejectionOf(exception, what)];
|
|
62
|
-
}
|
|
63
|
-
});
|
|
51
|
+
if (!answer.isCurrent) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (commandId && !ApexNavigation.mainWindow) {
|
|
55
|
+
[answer reject:ANNErrorTexts.nowhereToShow];
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
@try {
|
|
59
|
+
body(layout, answer);
|
|
60
|
+
} @catch (NSException *exception) {
|
|
61
|
+
[answer reject:ANNRejectionOf(exception, what)];
|
|
62
|
+
}
|
|
64
63
|
}
|
|
65
64
|
|
|
66
65
|
// Before the navigation started a command without a promise has nothing to act on: its body finds nothing.
|
|
67
66
|
+ (void)runVoid:(NSString *)name what:(NSString *)what body:(dispatch_block_t)body {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
body();
|
|
75
|
-
} @catch (NSException *exception) {
|
|
76
|
-
[self logFailure:name text:[ANNErrorTexts couldNot:what reason:ANNReasonOf(exception)]];
|
|
77
|
-
}
|
|
78
|
-
});
|
|
67
|
+
ANNAssertMainQueue();
|
|
68
|
+
@try {
|
|
69
|
+
body();
|
|
70
|
+
} @catch (NSException *exception) {
|
|
71
|
+
[self logFailure:name text:[ANNErrorTexts couldNot:what reason:ANNReasonOf(exception)]];
|
|
72
|
+
}
|
|
79
73
|
}
|
|
80
74
|
|
|
81
75
|
+ (void)logFailure:(NSString *)name text:(NSString *)text {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Made by scripts/contract.mjs from src/interfaces/contract/errors.json: change that file and run the script again.
|
|
2
|
+
|
|
1
3
|
#import <Foundation/Foundation.h>
|
|
2
4
|
|
|
3
5
|
NS_ASSUME_NONNULL_BEGIN
|
|
@@ -51,12 +53,12 @@ FOUNDATION_EXPORT NSExceptionName const ANNCommandRejectionException;
|
|
|
51
53
|
+ (NSString *)stackTakesScreens:(NSString *)stackId type:(NSString *)type;
|
|
52
54
|
+ (NSString *)emptyStack:(NSString *)stackId;
|
|
53
55
|
+ (NSString *)emptyTabs:(NSString *)tabsId;
|
|
56
|
+
/// Only Android checks it: its tab bar shows at most 5 tabs.
|
|
54
57
|
+ (NSString *)tooManyTabs:(NSString *)tabsId count:(NSUInteger)count;
|
|
55
58
|
+ (NSString *)splitViewColumns:(NSString *)splitViewId;
|
|
59
|
+
/// Only iOS checks it: Android has pairs on every version.
|
|
56
60
|
+ (NSString *)pairUnsupported:(NSString *)pairId;
|
|
57
61
|
+ (NSString *)pairNeedsTwoScreens:(NSString *)pairId;
|
|
58
|
-
|
|
59
|
-
/// The other cases of the layout check: the texts both platforms use meanwhile.
|
|
60
62
|
+ (NSString *)nodeWithoutName:(NSString *)type nodeId:(NSString *)nodeId;
|
|
61
63
|
+ (NSString *)rootMissing;
|
|
62
64
|
+ (NSString *)tabsInTabs:(NSString *)tabsId;
|
|
@@ -77,6 +79,8 @@ FOUNDATION_EXPORT NSExceptionName const ANNCommandRejectionException;
|
|
|
77
79
|
+ (NSString *)couldNot:(NSString *)what reason:(NSString *)reason;
|
|
78
80
|
/// A command whose part of the native core is not written yet.
|
|
79
81
|
+ (NSString *)notDoneYet:(NSString *)method;
|
|
82
|
+
/// A command that nothing in the native core answered: what took it let it go, or nothing took it.
|
|
83
|
+
+ (NSString *)notAnswered:(NSString *)method;
|
|
80
84
|
|
|
81
85
|
/// An `ANNCommandRejectionException` with `text` as its reason: the command that runs rejects with `text` as it is.
|
|
82
86
|
+ (NSException *)rejection:(NSString *)text;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Made by scripts/contract.mjs from src/interfaces/contract/errors.json: change that file and run the script again.
|
|
2
|
+
|
|
1
3
|
#import "ANNErrorTexts.h"
|
|
2
4
|
|
|
3
5
|
NSExceptionName const ANNCommandRejectionException = @"ANNCommandRejectionException";
|
|
@@ -59,8 +61,8 @@ static NSString *ANNText(NSString *format, ...) {
|
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
+ (NSString *)columnNotStack:(NSString *)componentId column:(NSString *)column {
|
|
62
|
-
return ANNText(@"the '%@' column of the split view of the screen '%@' is not a stack",
|
|
63
|
-
componentId);
|
|
64
|
+
return ANNText(@"the '%@' column of the split view of the screen '%@' is not a stack",
|
|
65
|
+
column, componentId);
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
+ (NSString *)noScreensForStack:(NSString *)componentId {
|
|
@@ -74,7 +76,8 @@ static NSString *ANNText(NSString *format, ...) {
|
|
|
74
76
|
#pragma mark - Root, modals, the app
|
|
75
77
|
|
|
76
78
|
+ (NSString *)setRootReplaced:(NSString *)rootId {
|
|
77
|
-
return ANNText(@"setRoot was replaced by a newer setRoot before the root '%@' finished
|
|
79
|
+
return ANNText(@"setRoot was replaced by a newer setRoot before the root '%@' finished "
|
|
80
|
+
@"showing",
|
|
78
81
|
rootId);
|
|
79
82
|
}
|
|
80
83
|
|
|
@@ -141,8 +144,8 @@ static NSString *ANNText(NSString *format, ...) {
|
|
|
141
144
|
}
|
|
142
145
|
|
|
143
146
|
+ (NSString *)tooManyTabs:(NSString *)tabsId count:(NSUInteger)count {
|
|
144
|
-
return ANNText(@"the tabs '%@' have %lu tabs: Android shows at most 5",
|
|
145
|
-
(unsigned long)count);
|
|
147
|
+
return ANNText(@"the tabs '%@' have %lu tabs: Android shows at most 5",
|
|
148
|
+
tabsId, (unsigned long)count);
|
|
146
149
|
}
|
|
147
150
|
|
|
148
151
|
+ (NSString *)splitViewColumns:(NSString *)splitViewId {
|
|
@@ -181,8 +184,8 @@ static NSString *ANNText(NSString *format, ...) {
|
|
|
181
184
|
}
|
|
182
185
|
|
|
183
186
|
+ (NSString *)sideMenuInSide:(NSString *)menuId {
|
|
184
|
-
return ANNText(@"the side menu '%@' has a side menu in a side: a side menu doesn't go inside
|
|
185
|
-
@"side menu",
|
|
187
|
+
return ANNText(@"the side menu '%@' has a side menu in a side: a side menu doesn't go inside "
|
|
188
|
+
@"a side menu",
|
|
186
189
|
menuId);
|
|
187
190
|
}
|
|
188
191
|
|
|
@@ -191,8 +194,8 @@ static NSString *ANNText(NSString *format, ...) {
|
|
|
191
194
|
}
|
|
192
195
|
|
|
193
196
|
+ (NSString *)splitViewInColumn:(NSString *)splitViewId {
|
|
194
|
-
return ANNText(@"the split view '%@' has a column of type 'SplitView': a split view doesn't
|
|
195
|
-
@"inside a split view",
|
|
197
|
+
return ANNText(@"the split view '%@' has a column of type 'SplitView': a split view doesn't "
|
|
198
|
+
@"go inside a split view",
|
|
196
199
|
splitViewId);
|
|
197
200
|
}
|
|
198
201
|
|
|
@@ -208,7 +211,8 @@ static NSString *ANNText(NSString *format, ...) {
|
|
|
208
211
|
}
|
|
209
212
|
|
|
210
213
|
+ (NSString *)unreadableDefaultOption:(NSString *)path {
|
|
211
|
-
return ANNText(@"the option '%@' of the default options has a value the navigation can't read",
|
|
214
|
+
return ANNText(@"the option '%@' of the default options has a value the navigation can't read",
|
|
215
|
+
path);
|
|
212
216
|
}
|
|
213
217
|
|
|
214
218
|
+ (NSString *)previewGone:(NSString *)previewId {
|
|
@@ -223,6 +227,10 @@ static NSString *ANNText(NSString *format, ...) {
|
|
|
223
227
|
return ANNText(@"could not run '%@': the native core doesn't do it yet", method);
|
|
224
228
|
}
|
|
225
229
|
|
|
230
|
+
+ (NSString *)notAnswered:(NSString *)method {
|
|
231
|
+
return ANNText(@"could not run '%@': the native core let it go without an answer", method);
|
|
232
|
+
}
|
|
233
|
+
|
|
226
234
|
+ (NSException *)rejection:(NSString *)text {
|
|
227
235
|
return [NSException exceptionWithName:ANNCommandRejectionException reason:text userInfo:nil];
|
|
228
236
|
}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
NS_ASSUME_NONNULL_BEGIN
|
|
5
5
|
|
|
6
|
-
/// One node of a command's layout, as `ANNLayoutReader` read and checked it
|
|
7
|
-
/// the
|
|
8
|
-
/// kind the contract has, or nothing.
|
|
6
|
+
/// One node of a command's layout, as `ANNLayoutReader` read and checked it before the command's body. Immutable: made
|
|
7
|
+
/// once, read by the command and the steps it runs later. The data stays the JSON JS sent; the accessors give its
|
|
8
|
+
/// fields with the kind the contract has, or nothing.
|
|
9
9
|
@interface ANNLayoutNode : NSObject
|
|
10
10
|
|
|
11
11
|
/// Made by `ANNLayoutReader` only: the id as JS gave it, the type, the node's `data` (empty when missing) and its
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
NS_ASSUME_NONNULL_BEGIN
|
|
6
6
|
|
|
7
7
|
/// Reads the layout JSON of a command into `ANNLayoutNode`s and checks it whole, before any view is made. It runs on
|
|
8
|
-
/// the
|
|
9
|
-
/// found, and nothing
|
|
10
|
-
///
|
|
8
|
+
/// the main queue, in the command's task before its body: a failure rejects the command with the text of the first
|
|
9
|
+
/// error found, and nothing is made. The stores it reads are safe from any thread (the registered native screens,
|
|
10
|
+
/// whether the app shows pairs).
|
|
11
11
|
///
|
|
12
12
|
/// One pass over the tree, depth first, children in order, the same order on both platforms so that the first error
|
|
13
13
|
/// is the same text. At each node: a known `type` (`''` for a node that is no object or has no string type), an `id`
|
|
@@ -71,8 +71,6 @@ static BOOL ANNAppUsesScenes(void) {
|
|
|
71
71
|
rootViewFactory.reactHost = host;
|
|
72
72
|
[ApexNavigation bootstrapWithHost:host];
|
|
73
73
|
self.window = ApexNavigation.mainWindow;
|
|
74
|
-
// The links that come before React content wait for it; the launch link waits for the scene.
|
|
75
|
-
[ANNDeepLinkQueue start];
|
|
76
74
|
if (!ANNAppUsesScenes()) {
|
|
77
75
|
[self.window makeKeyAndVisible];
|
|
78
76
|
}
|
|
@@ -58,11 +58,12 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
58
58
|
|
|
59
59
|
/// A transition ended, in this order: first a screen a transition began inside a node of `shown` that left the window
|
|
60
60
|
/// and isn't one of that node's shown screens gets its `DidDisappear`; then `DidDisappear` of every screen of `hidden`,
|
|
61
|
-
/// `DidAppear` of what `shown` shows, the navigation state now when it changed
|
|
61
|
+
/// `DidAppear` of what `shown` shows, the navigation state now when it changed (the answer's one state step,
|
|
62
|
+
/// `-[ANNCommandAnswer reportStateNow]`; nothing for a JavaScript that went), `events` (the transition's own events,
|
|
62
63
|
/// `ANN.ScreenPopped` and `ANN.ModalDismissed`, and what must follow them, like stopping the content that went), then
|
|
63
|
-
/// `answer` resolves with `value` (
|
|
64
|
-
///
|
|
65
|
-
///
|
|
64
|
+
/// `answer` resolves with `value` (the promise, then `ANN.CommandCompleted`; no second state). A user's action passes
|
|
65
|
+
/// no answer, and its state goes all the same. The callbacks of UIKit that come later find the phases set and send
|
|
66
|
+
/// nothing.
|
|
66
67
|
+ (void)endTransitionHiding:(NSArray<UIViewController *> *)hidden
|
|
67
68
|
showing:(NSArray<UIViewController *> *)shown
|
|
68
69
|
events:(nullable dispatch_block_t)events
|
|
@@ -305,7 +305,18 @@ static BOOL ANNIsInsideNode(UIViewController *screen, UIViewController *node) {
|
|
|
305
305
|
for (UIViewController *node in shown) {
|
|
306
306
|
[self nodeDidAppear:node];
|
|
307
307
|
}
|
|
308
|
-
|
|
308
|
+
// The state before the transition's events, once per answer: the answer's own step before its promise finds it
|
|
309
|
+
// sent. A user's transition has no answer; one whose answer went before its end (an interrupt) sends the state of
|
|
310
|
+
// its end itself, as Android does.
|
|
311
|
+
if (!answer) {
|
|
312
|
+
[ANNNavigationState updateNow];
|
|
313
|
+
} else if (answer.answered) {
|
|
314
|
+
if (answer.isCurrent) {
|
|
315
|
+
[ANNNavigationState updateNowFor:answer.commandName];
|
|
316
|
+
}
|
|
317
|
+
} else {
|
|
318
|
+
[answer reportStateNow];
|
|
319
|
+
}
|
|
309
320
|
if (events) {
|
|
310
321
|
events();
|
|
311
322
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#import <
|
|
1
|
+
#import <UIKit/UIKit.h>
|
|
2
2
|
|
|
3
3
|
NS_ASSUME_NONNULL_BEGIN
|
|
4
4
|
|
|
@@ -14,12 +14,32 @@ typedef void (^ANNLaunchLinkCompletion)(NSURL *_Nullable url);
|
|
|
14
14
|
*/
|
|
15
15
|
@interface ANNDeepLinkQueue : NSObject
|
|
16
16
|
|
|
17
|
-
/// Starts the queue as the app launches (
|
|
17
|
+
/// Starts the queue as the app launches (`+[ApexNavigation bootstrapWithHost:]`, so also under an app delegate of the
|
|
18
|
+
/// app's own). Once: a second call does nothing.
|
|
18
19
|
+ (void)start;
|
|
19
20
|
|
|
20
21
|
/// Hands `url` to `Linking`, or keeps it until React content first appears and no `takeLaunchLink:` waits.
|
|
21
22
|
+ (void)dispatchURL:(NSURL *)url;
|
|
22
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Runs `forward`, which hands the scene's link to the app delegate (`ANNSceneDelegate`). The URL the app delegate
|
|
26
|
+
* dispatches in it keeps the scene and its context, which React Native 0.88 and newer need to take a scene's link.
|
|
27
|
+
*/
|
|
28
|
+
+ (void)forwardURLContext:(UIOpenURLContext *)context
|
|
29
|
+
ofScene:(UIScene *)scene
|
|
30
|
+
through:(NS_NOESCAPE dispatch_block_t)forward;
|
|
31
|
+
|
|
32
|
+
/// `forwardURLContext:ofScene:through:` for a web link (`webpageURL`) of the scene.
|
|
33
|
+
+ (void)forwardUserActivity:(NSUserActivity *)activity
|
|
34
|
+
ofScene:(UIScene *)scene
|
|
35
|
+
through:(NS_NOESCAPE dispatch_block_t)forward;
|
|
36
|
+
|
|
37
|
+
/// `dispatchURL:` for the scene's link, with its scene and context: for an app delegate that doesn't take links.
|
|
38
|
+
+ (void)dispatchURLContext:(UIOpenURLContext *)context ofScene:(UIScene *)scene;
|
|
39
|
+
|
|
40
|
+
/// `dispatchURLContext:ofScene:` for a web link (`webpageURL`) of the scene; an activity without one does nothing.
|
|
41
|
+
+ (void)dispatchUserActivity:(NSUserActivity *)activity ofScene:(UIScene *)scene;
|
|
42
|
+
|
|
23
43
|
/// The app's window scene connected (`+[ApexNavigation attachToWindowScene:]`).
|
|
24
44
|
+ (void)windowSceneDidConnect;
|
|
25
45
|
|