@apexnative/navigation 1.0.0-alpha.1 → 1.0.0-alpha.11
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 +132 -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/ArrangementDefinition.kt +9 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +20 -15
- 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/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/arrangement.md +17 -1
- 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 +61 -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 +195 -21
- 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 +34 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +171 -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/arrangement.js +5 -2
- package/lib/module/api/screens/arrangement.js.map +1 -1
- 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/arrangement.d.ts +12 -2
- package/lib/typescript/api/screens/arrangement.d.ts.map +1 -1
- 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 +3 -1
- 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/arrangement.ts +17 -4
- 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
package/ios/Core/ANNHinge.h
CHANGED
|
@@ -5,6 +5,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
5
5
|
|
|
6
6
|
/// Posted on the main queue when the state of the hinge changes (closed, partly open, open), once a screen showed.
|
|
7
7
|
extern NSNotificationName const ANNHingeDidChangeNotification;
|
|
8
|
+
/// Posted on the main queue for each new value of the hinge (the first one, a move, a new state, the hinge's coming or
|
|
9
|
+
/// going), once a screen showed.
|
|
10
|
+
extern NSNotificationName const ANNHingeDidMoveNotification;
|
|
8
11
|
|
|
9
12
|
/// The device's hinge (`useHinge`), iOS 27.1: one UIHingeInteraction on the app's window, which runs once a screen
|
|
10
13
|
/// showed (the regions of the screens follow the hinge's state) and while JavaScript asks for updates (it counts its
|
|
@@ -21,6 +24,9 @@ extern NSNotificationName const ANNHingeDidChangeNotification;
|
|
|
21
24
|
/// The last value, `{}` before the first update and without a hinge. Any thread.
|
|
22
25
|
+ (NSDictionary<NSString *, id> *)lastValue;
|
|
23
26
|
|
|
27
|
+
/// Whether the device has a hinge, as the last update tells: NO before the first one. Any thread.
|
|
28
|
+
+ (BOOL)isPresent;
|
|
29
|
+
|
|
24
30
|
@end
|
|
25
31
|
|
|
26
32
|
NS_ASSUME_NONNULL_END
|
package/ios/Core/ANNHinge.mm
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
#import "ANNHinge.h"
|
|
2
2
|
#import "ANNAssert.h"
|
|
3
|
+
#import "ANNEventContract.h"
|
|
3
4
|
#import "ANNUtils.h"
|
|
4
5
|
|
|
5
6
|
NSNotificationName const ANNHingeDidChangeNotification = @"ANNHingeDidChange";
|
|
7
|
+
NSNotificationName const ANNHingeDidMoveNotification = @"ANNHingeDidMove";
|
|
6
8
|
|
|
7
9
|
// Main queue.
|
|
8
10
|
static ANNEventEmitter *ANNHingeEventEmitter;
|
|
@@ -34,11 +36,12 @@ static NSDictionary<NSString *, id> *ANNHingeValue(UIHinge *hinge) API_AVAILABLE
|
|
|
34
36
|
if (!hinge) {
|
|
35
37
|
return @{};
|
|
36
38
|
}
|
|
39
|
+
const auto &keys = ANNEventContract.HingeChanged;
|
|
37
40
|
NSString *state = ANNHingeStateName(hinge.status);
|
|
38
41
|
if (hinge.status == UIHingeStatusUnknown) {
|
|
39
|
-
return @{
|
|
42
|
+
return @{keys.state : state};
|
|
40
43
|
}
|
|
41
|
-
return @{
|
|
44
|
+
return @{keys.state : state, keys.angle : @(round(hinge.angle * 1800 / M_PI) / 10)};
|
|
42
45
|
}
|
|
43
46
|
#endif
|
|
44
47
|
|
|
@@ -94,13 +97,15 @@ static NSDictionary<NSString *, id> *ANNHingeValue(UIHinge *hinge) API_AVAILABLE
|
|
|
94
97
|
if ([ANNLastHinge isEqualToDictionary:value]) {
|
|
95
98
|
return;
|
|
96
99
|
}
|
|
97
|
-
previousState = ANNLastHinge[
|
|
100
|
+
previousState = ANNLastHinge[ANNEventContract.HingeChanged.state];
|
|
98
101
|
ANNLastHinge = value;
|
|
99
102
|
}
|
|
100
103
|
if (ANNHingeUpdatesEnabled) {
|
|
101
104
|
[ANNHingeEventEmitter sendHingeChanged:value];
|
|
102
105
|
}
|
|
103
|
-
|
|
106
|
+
NSNotificationCenter *center = NSNotificationCenter.defaultCenter;
|
|
107
|
+
[center postNotificationName:ANNHingeDidMoveNotification object:nil];
|
|
108
|
+
id state = value[ANNEventContract.HingeChanged.state];
|
|
104
109
|
if (previousState != state && ![previousState isEqual:state]) {
|
|
105
110
|
[NSNotificationCenter.defaultCenter postNotificationName:ANNHingeDidChangeNotification
|
|
106
111
|
object:nil];
|
|
@@ -113,4 +118,10 @@ static NSDictionary<NSString *, id> *ANNHingeValue(UIHinge *hinge) API_AVAILABLE
|
|
|
113
118
|
}
|
|
114
119
|
}
|
|
115
120
|
|
|
121
|
+
+ (BOOL)isPresent {
|
|
122
|
+
@synchronized(ANNHinge.class) {
|
|
123
|
+
return ANNLastHinge[ANNEventContract.HingeChanged.state] != nil;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
116
127
|
@end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
|
|
3
|
+
@class RCTCallInvoker;
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
/// The way of the calls JavaScript makes to `ANNTurboModule`, for a step that must come after them. A call without an
|
|
8
|
+
/// answer (`mergeOptions`) leaves the JavaScript thread as it is made, as a task on the main queue, the module's queue
|
|
9
|
+
/// (React Native's `ModuleNativeMethodCallInvoker`, a `dispatch_async` to it), and runs whole in that task
|
|
10
|
+
/// (`ANNCommandRunner`). A step sent from the JavaScript thread to the main queue after them comes after them: the
|
|
11
|
+
/// JavaScript thread runs its tasks in order, and the main queue runs what it is given in the order it was given. The
|
|
12
|
+
/// module tells its call invoker when React Native made it, and that it went when React Native invalidates it (a
|
|
13
|
+
/// reload). Any thread, except `afterCallsMadeSoFar:`.
|
|
14
|
+
@interface ANNJavaScriptCalls : NSObject
|
|
15
|
+
|
|
16
|
+
- (instancetype)init NS_UNAVAILABLE;
|
|
17
|
+
+ (instancetype)new NS_UNAVAILABLE;
|
|
18
|
+
|
|
19
|
+
/// The module of the JavaScript that runs now and its call invoker (the JavaScript thread).
|
|
20
|
+
+ (void)setCallInvoker:(nullable RCTCallInvoker *)callInvoker ofModule:(id)module;
|
|
21
|
+
|
|
22
|
+
/// The module went: with no newer module told since, no JavaScript runs to wait for.
|
|
23
|
+
+ (void)moduleWent:(id)module;
|
|
24
|
+
|
|
25
|
+
/// `block` runs on the main queue once every call JavaScript made to the module before the next task of its thread is
|
|
26
|
+
/// applied: a task on the JavaScript thread, from there one on the main queue. With no JavaScript to ask (none yet, a
|
|
27
|
+
/// reload), at once. Main queue. A JavaScript thread that never runs the task again (its runtime went) never runs
|
|
28
|
+
/// `block`: a caller that can't wait for long has a limit of its own.
|
|
29
|
+
+ (void)afterCallsMadeSoFar:(dispatch_block_t)block;
|
|
30
|
+
|
|
31
|
+
@end
|
|
32
|
+
|
|
33
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#import "ANNJavaScriptCalls.h"
|
|
2
|
+
#import "ANNAssert.h"
|
|
3
|
+
#import <React/RCTCallInvoker.h>
|
|
4
|
+
#import <ReactCommon/CallInvoker.h>
|
|
5
|
+
|
|
6
|
+
// The module told last, weakly: a module that went takes its invoker with it.
|
|
7
|
+
static __weak id ANNCallsModule;
|
|
8
|
+
static RCTCallInvoker *ANNCallsInvoker;
|
|
9
|
+
|
|
10
|
+
@implementation ANNJavaScriptCalls
|
|
11
|
+
|
|
12
|
+
+ (void)setCallInvoker:(RCTCallInvoker *)callInvoker ofModule:(id)module {
|
|
13
|
+
@synchronized(self) {
|
|
14
|
+
ANNCallsModule = module;
|
|
15
|
+
ANNCallsInvoker = callInvoker;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
+ (void)moduleWent:(id)module {
|
|
20
|
+
@synchronized(self) {
|
|
21
|
+
if (ANNCallsModule != module) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
ANNCallsModule = nil;
|
|
25
|
+
ANNCallsInvoker = nil;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
+ (void)afterCallsMadeSoFar:(dispatch_block_t)block {
|
|
30
|
+
ANNAssertMainQueue();
|
|
31
|
+
RCTCallInvoker *callInvoker = nil;
|
|
32
|
+
@synchronized(self) {
|
|
33
|
+
if (ANNCallsModule) {
|
|
34
|
+
callInvoker = ANNCallsInvoker;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
std::shared_ptr<facebook::react::CallInvoker> invoker =
|
|
38
|
+
callInvoker ? callInvoker.callInvoker : nullptr;
|
|
39
|
+
if (!invoker) {
|
|
40
|
+
block();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
dispatch_block_t done = [block copy];
|
|
44
|
+
// The JavaScript thread runs the task after the one it runs now, which made the calls of this moment (a commit of
|
|
45
|
+
// React and its layout effects). Each of those calls went to the main queue as it was made, so this hop, sent from
|
|
46
|
+
// the same thread later, reaches the main queue behind them (a serial queue, in the order it was given).
|
|
47
|
+
invoker->invokeAsync([done](facebook::jsi::Runtime &) {
|
|
48
|
+
dispatch_async(dispatch_get_main_queue(), done);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@end
|
|
@@ -11,10 +11,10 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
11
11
|
typedef NS_ENUM(NSInteger, ANNWaitedReadiness) {
|
|
12
12
|
/// The screen's content rendered: what the user sees.
|
|
13
13
|
ANNWaitedReadinessContent,
|
|
14
|
-
/// The screen's
|
|
15
|
-
/// renders
|
|
16
|
-
///
|
|
17
|
-
|
|
14
|
+
/// The screen's content rendered, on a screen the user doesn't see yet (an unselected tab of `together`, which
|
|
15
|
+
/// renders unseen in the tabs' view). Its part of a wait ends at the command's 0.5 s at the latest, and its bar
|
|
16
|
+
/// components are not waited for.
|
|
17
|
+
ANNWaitedReadinessUnseen,
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
/// A transition of the navigation is done: what it moved is in place.
|
|
@@ -97,7 +97,7 @@ typedef void (^ANNTransitionRejectionBlock)(NSString *message, NSError *_Nullabl
|
|
|
97
97
|
- (NSArray<UIViewController *> *)waitedComponentViewControllers;
|
|
98
98
|
|
|
99
99
|
/// The readiness a wait needs of `screen`, a waited screen inside this node; a node without an answer leaves it to its
|
|
100
|
-
/// parents (`ANNWaitedReadinessOf`). The tabs answer "
|
|
100
|
+
/// parents (`ANNWaitedReadinessOf`). The tabs answer "unseen" for the screens of their unselected tabs.
|
|
101
101
|
- (ANNWaitedReadiness)waitedReadinessOfScreen:(UIViewController *)screen;
|
|
102
102
|
|
|
103
103
|
#pragma mark - The children
|
|
@@ -23,12 +23,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
23
23
|
+ (void)holdUpdates;
|
|
24
24
|
+ (void)releaseUpdates;
|
|
25
25
|
|
|
26
|
-
/// The state now, sent when it changed
|
|
27
|
-
///
|
|
28
|
-
|
|
26
|
+
/// The state now, sent when it changed. A command's answer asks for it once (`-[ANNCommandAnswer reportStateNow]`, at
|
|
27
|
+
/// the end of its transition or before its promise); the end of a user's transition and a tab chosen from code ask
|
|
28
|
+
/// `updateNow`. A walk that throws logs one line, `[ApexNavigation] <commandName>: could not report the navigation
|
|
29
|
+
/// state: <reason>` (as on Android; `transition` without a command), and sends nothing, so its caller always goes on.
|
|
30
|
+
+ (void)updateNowFor:(nullable NSString *)commandName;
|
|
29
31
|
|
|
30
|
-
///
|
|
31
|
-
+ (void)
|
|
32
|
+
/// `updateNowFor:` without a command.
|
|
33
|
+
+ (void)updateNow;
|
|
32
34
|
|
|
33
35
|
/// Forgets the last state sent: the next one goes even if it is the same (a new bundle, `AppLaunched`).
|
|
34
36
|
+ (void)reset;
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
#import "ANNAssert.h"
|
|
3
3
|
#import "ANNBottomTabsController.h"
|
|
4
4
|
#import "ANNComponentViewController.h"
|
|
5
|
+
#import "ANNErrorHandler.h"
|
|
5
6
|
#import "ANNErrorTexts.h"
|
|
6
7
|
#import "ANNModalCoordinator.h"
|
|
7
8
|
#import "ANNSlotContainers.h"
|
|
8
9
|
#import "ApexNavigation+Internal.h"
|
|
9
10
|
#import "UIViewController+LayoutProtocol.h"
|
|
10
|
-
#import <React/RCTLog.h>
|
|
11
11
|
|
|
12
12
|
// Main queue.
|
|
13
13
|
static BOOL ANNUpdateScheduled;
|
|
@@ -58,6 +58,10 @@ static BOOL ANNSameValue(id a, id b) {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
+ (void)updateNow {
|
|
61
|
+
[self updateNowFor:nil];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
+ (void)updateNowFor:(NSString *)commandName {
|
|
61
65
|
ANNAssertMainQueue();
|
|
62
66
|
NSString *screenId = nil;
|
|
63
67
|
NSString *name = nil;
|
|
@@ -74,8 +78,9 @@ static BOOL ANNSameValue(id a, id b) {
|
|
|
74
78
|
}
|
|
75
79
|
} @catch (NSException *exception) {
|
|
76
80
|
NSString *reason = exception.reason.length > 0 ? exception.reason : exception.name;
|
|
77
|
-
|
|
78
|
-
|
|
81
|
+
[ANNErrorHandler logFailureOf:commandName ?: @"transition"
|
|
82
|
+
text:[ANNErrorTexts couldNot:@"report the navigation state"
|
|
83
|
+
reason:reason]];
|
|
79
84
|
return;
|
|
80
85
|
}
|
|
81
86
|
if (ANNHasLastState && ANNSameValue(screenId, ANNLastScreenId) &&
|
|
@@ -89,10 +94,6 @@ static BOOL ANNSameValue(id a, id b) {
|
|
|
89
94
|
[ApexNavigation.eventEmitter sendNavigationStateChanged:screenId name:name tab:tab];
|
|
90
95
|
}
|
|
91
96
|
|
|
92
|
-
+ (void)reportBeforeAnswer {
|
|
93
|
-
[self updateNow];
|
|
94
|
-
}
|
|
95
|
-
|
|
96
97
|
+ (void)reset {
|
|
97
98
|
ANNAssertMainQueue();
|
|
98
99
|
ANNHasLastState = NO;
|
package/ios/Core/ANNNodeHelper.h
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
#import "ANNLayoutInfo.h"
|
|
4
4
|
#import "ANNNavigationOptions.h"
|
|
5
5
|
#import "ANNNodePresenter.h"
|
|
6
|
+
#import "ANNUserChoice.h"
|
|
6
7
|
#import <UIKit/UIKit.h>
|
|
7
8
|
|
|
8
9
|
NS_ASSUME_NONNULL_BEGIN
|
|
@@ -24,9 +25,11 @@ FOUNDATION_EXPORT NSString *const ANNContainerReadyHandlerKey;
|
|
|
24
25
|
@property(nonatomic, weak, readonly, nullable) UIViewController *node;
|
|
25
26
|
|
|
26
27
|
@property(nonatomic, strong, nullable) ANNLayoutInfo *layoutInfo;
|
|
27
|
-
/// The node's own options: its layout options with every `mergeOptions` into it and the
|
|
28
|
-
///
|
|
29
|
-
///
|
|
28
|
+
/// The node's own options: its layout options with every `mergeOptions` into it and what the core keeps of a merge (the
|
|
29
|
+
/// title component a merged text drops, side colors). The user's choices are not here but in the user layer
|
|
30
|
+
/// (`setUserChoice:forKey:`). The setter stores them without the one-shot options and makes every resolved options miss
|
|
31
|
+
/// its cache; it is the only way to change them. Never change them in place: `mergeOwnOptions:` or
|
|
32
|
+
/// `changeOwnOptions:`.
|
|
30
33
|
@property(nonatomic, strong, nullable) ANNNavigationOptions *options;
|
|
31
34
|
/// The default options of the app (`ANNDefaultOptions.current`); setting it does nothing, the defaults are the app's.
|
|
32
35
|
@property(nonatomic, strong, nullable) ANNNavigationOptions *defaultOptions;
|
|
@@ -57,21 +60,38 @@ FOUNDATION_EXPORT NSString *const ANNContainerReadyHandlerKey;
|
|
|
57
60
|
/// the layout, else the fallback (when there is none, the parent view controller).
|
|
58
61
|
- (nullable UIViewController *)layoutParent;
|
|
59
62
|
|
|
60
|
-
/// `options` merged with `options` given and stored through the setter.
|
|
63
|
+
/// The app's `mergeOptions` into the node: `options` merged with `options` given and stored through the setter. A
|
|
64
|
+
/// choice of the user layer that the merge changes leaves the layer, by Android's rules
|
|
65
|
+
/// (`ANNUserChoice choiceAfterMerge:own:before:after:`): a field given a value other than the app had there (the own
|
|
66
|
+
/// options', else the node's resolution before the merge), or the button, item or scope of the choice gone from the
|
|
67
|
+
/// node's resolution after it; the same value sent again keeps it.
|
|
61
68
|
- (void)mergeOwnOptions:(ANNNavigationOptions *)options;
|
|
62
69
|
|
|
63
|
-
/// A change of the own options by the core
|
|
64
|
-
///
|
|
65
|
-
///
|
|
70
|
+
/// A change of the own options by the core: `change` gets a copy of them, and the copy is stored through the setter.
|
|
71
|
+
/// For what the core keeps of the app's merges (the title component a merged text drops, side colors), never for a
|
|
72
|
+
/// choice of the user, which goes into the user layer.
|
|
66
73
|
- (void)changeOwnOptions:(void (^)(ANNNavigationOptions *options))change;
|
|
67
74
|
|
|
68
|
-
/// The
|
|
69
|
-
///
|
|
75
|
+
/// The user layer: the choices the user made in native UI (a toggled button, the check of a single-selection menu, the
|
|
76
|
+
/// search scope, the tokens and suggestions UIKit removed, a renamed title), one per key, apart from the own options.
|
|
77
|
+
/// The resolution writes them over the own options, by identity (`ANNUserChoice applyTo:`): defaults < parents < own <
|
|
78
|
+
/// user. Setting one (nil removes it) makes every resolved options miss its cache, as a change of own options does.
|
|
79
|
+
/// `setDefaultOptions` never touches the layer; it goes with the node.
|
|
80
|
+
- (void)setUserChoice:(nullable ANNUserChoice *)choice forKey:(NSString *)key;
|
|
81
|
+
|
|
82
|
+
/// The choice under `key`, or nil.
|
|
83
|
+
- (nullable ANNUserChoice *)userChoiceForKey:(NSString *)key;
|
|
84
|
+
|
|
85
|
+
/// The common resolve: a copy of the node's own options with its user layer written over them, then the resolved
|
|
86
|
+
/// options of its current child over that, down the visible chain. A new object each call: a container's override may
|
|
87
|
+
/// change it in place.
|
|
70
88
|
- (ANNNavigationOptions *)resolveOptions;
|
|
71
89
|
|
|
72
|
-
/// What the node shows with: the default options, then the own options of its parents
|
|
73
|
-
/// then the node's `resolveOptions
|
|
74
|
-
///
|
|
90
|
+
/// What the node shows with: the default options, then the own options of its parents (each with its user layer) from
|
|
91
|
+
/// the farthest to the nearest, then the node's `resolveOptions`; a node without a current child (a screen) writes its
|
|
92
|
+
/// user layer once more at the end, so a choice also reaches a list the screen takes from its stack or the defaults.
|
|
93
|
+
/// Cached until any options or user layer change (`ANNOptionsCache`), the node has another parent, or a node of its
|
|
94
|
+
/// visible chain has another current child. Read-only: copy it before changing anything.
|
|
75
95
|
- (ANNNavigationOptions *)resolveOptionsWithDefault;
|
|
76
96
|
|
|
77
97
|
/// `resolveOptionsWithDefault` built now, without the cache: for a reader whose node resolves through more than its
|
|
@@ -29,8 +29,14 @@ static NSPointerArray *ANNWeakNodes(NSArray<UIViewController *> *nodes) {
|
|
|
29
29
|
|
|
30
30
|
NSString *const ANNContainerReadyHandlerKey = @"ApexNavigation.container";
|
|
31
31
|
|
|
32
|
+
// Set while a node works out the app's resolution (`appResolution`): no user layer is written. Main queue.
|
|
33
|
+
static BOOL ANNUserLayersLeftOut = NO;
|
|
34
|
+
|
|
32
35
|
@implementation ANNNodeHelper {
|
|
33
36
|
ANNNavigationOptions *_options;
|
|
37
|
+
// The user layer: the choices by key, and their keys in the order they were set, the order they are written in.
|
|
38
|
+
NSMutableDictionary<NSString *, ANNUserChoice *> *_userChoices;
|
|
39
|
+
NSMutableArray<NSString *> *_userChoiceKeys;
|
|
34
40
|
// The ready handlers by key, and their keys in the order they were first set.
|
|
35
41
|
NSMutableDictionary<NSString *, dispatch_block_t> *_readyHandlers;
|
|
36
42
|
NSMutableArray<NSString *> *_readyKeys;
|
|
@@ -108,10 +114,27 @@ NSString *const ANNContainerReadyHandlerKey = @"ApexNavigation.container";
|
|
|
108
114
|
- (void)setDefaultOptions:(ANNNavigationOptions *)defaultOptions {
|
|
109
115
|
}
|
|
110
116
|
|
|
117
|
+
// With a user layer, the choices meet the merge as on Android: they see the app's resolution before it and after it
|
|
118
|
+
// (the merge in place for that, uncached), and those the merge changes leave; the setter then moves the cache once for
|
|
119
|
+
// both, also when a choice's rule throws: the new own options never stay with a cache of the old ones.
|
|
111
120
|
- (void)mergeOwnOptions:(ANNNavigationOptions *)options {
|
|
112
|
-
|
|
121
|
+
ANNAssertMainQueue();
|
|
122
|
+
ANNNavigationOptions *own = _options ?: [ANNNavigationOptions new];
|
|
123
|
+
ANNNavigationOptions *merged = [own copy];
|
|
113
124
|
[merged mergeOptions:options];
|
|
114
|
-
|
|
125
|
+
if (_userChoiceKeys.count == 0) {
|
|
126
|
+
self.options = merged;
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
ANNNavigationOptions *before = [self appResolution];
|
|
130
|
+
ANNNavigationOptions *stored = [merged withoutOneShotOptions];
|
|
131
|
+
_options = stored;
|
|
132
|
+
@try {
|
|
133
|
+
ANNNavigationOptions *after = [self appResolution];
|
|
134
|
+
[self userChoicesMeetMerge:options own:own before:before after:after];
|
|
135
|
+
} @finally {
|
|
136
|
+
self.options = stored;
|
|
137
|
+
}
|
|
115
138
|
}
|
|
116
139
|
|
|
117
140
|
- (void)changeOwnOptions:(void (^)(ANNNavigationOptions *options))change {
|
|
@@ -120,10 +143,78 @@ NSString *const ANNContainerReadyHandlerKey = @"ApexNavigation.container";
|
|
|
120
143
|
self.options = changed;
|
|
121
144
|
}
|
|
122
145
|
|
|
146
|
+
#pragma mark - The user layer
|
|
147
|
+
|
|
148
|
+
- (void)setUserChoice:(ANNUserChoice *)choice forKey:(NSString *)key {
|
|
149
|
+
ANNAssertMainQueue();
|
|
150
|
+
if (!choice && !_userChoices[key]) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!_userChoices) {
|
|
154
|
+
_userChoices = [NSMutableDictionary new];
|
|
155
|
+
_userChoiceKeys = [NSMutableArray new];
|
|
156
|
+
}
|
|
157
|
+
// A choice set again goes last: it is the newest.
|
|
158
|
+
[_userChoiceKeys removeObject:key];
|
|
159
|
+
if (choice) {
|
|
160
|
+
_userChoices[key] = choice;
|
|
161
|
+
[_userChoiceKeys addObject:key];
|
|
162
|
+
} else {
|
|
163
|
+
[_userChoices removeObjectForKey:key];
|
|
164
|
+
}
|
|
165
|
+
[ANNOptionsCache optionsChanged];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
- (ANNUserChoice *)userChoiceForKey:(NSString *)key {
|
|
169
|
+
return _userChoices[key];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Each choice answers the merge itself: it stays, keeps a part, or goes. The order of the rest stays.
|
|
173
|
+
- (void)userChoicesMeetMerge:(ANNNavigationOptions *)merge
|
|
174
|
+
own:(ANNNavigationOptions *)own
|
|
175
|
+
before:(ANNNavigationOptions *)before
|
|
176
|
+
after:(ANNNavigationOptions *)after {
|
|
177
|
+
for (NSString *key in [_userChoiceKeys copy]) {
|
|
178
|
+
ANNUserChoice *choice = _userChoices[key];
|
|
179
|
+
ANNUserChoice *kept = [choice choiceAfterMerge:merge own:own before:before after:after];
|
|
180
|
+
if (kept == choice) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (kept) {
|
|
184
|
+
_userChoices[key] = kept;
|
|
185
|
+
} else {
|
|
186
|
+
[_userChoices removeObjectForKey:key];
|
|
187
|
+
[_userChoiceKeys removeObject:key];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// The node's resolution with the defaults and without any user layer: what the app's options alone give (Android's
|
|
193
|
+
// `resolveCurrentOptions().withDefaultOptions`). Built now, never cached: the resolution reads no cache on the way.
|
|
194
|
+
- (ANNNavigationOptions *)appResolution {
|
|
195
|
+
BOOL leftOut = ANNUserLayersLeftOut;
|
|
196
|
+
ANNUserLayersLeftOut = YES;
|
|
197
|
+
@try {
|
|
198
|
+
return [self resolveOptionsWithDefaultUncached];
|
|
199
|
+
} @finally {
|
|
200
|
+
ANNUserLayersLeftOut = leftOut;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
- (void)applyUserLayerTo:(ANNNavigationOptions *)options {
|
|
205
|
+
if (ANNUserLayersLeftOut) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
for (NSString *key in _userChoiceKeys) {
|
|
209
|
+
[_userChoices[key] applyTo:options];
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
123
213
|
#pragma mark - Resolving
|
|
124
214
|
|
|
125
215
|
- (ANNNavigationOptions *)resolveOptions {
|
|
126
216
|
ANNNavigationOptions *result = _options ? [_options copy] : [ANNNavigationOptions new];
|
|
217
|
+
[self applyUserLayerTo:result];
|
|
127
218
|
UIViewController *child = [_node getCurrentChild];
|
|
128
219
|
if (child) {
|
|
129
220
|
[result mergeOptions:[child resolveOptions]];
|
|
@@ -168,7 +259,9 @@ NSString *const ANNContainerReadyHandlerKey = @"ApexNavigation.container";
|
|
|
168
259
|
return [self resolveOfNode:node parents:parents];
|
|
169
260
|
}
|
|
170
261
|
|
|
171
|
-
// Built on copies: the defaults never go into a node's own options.
|
|
262
|
+
// Built on copies: the defaults never go into a node's own options. Each parent's user layer goes over its own
|
|
263
|
+
// options; a node without a current child writes its own layer once more at the end, for the lists it takes from its
|
|
264
|
+
// parents or the defaults (a toggle of a button of the stack's). Writing a choice twice gives the same result.
|
|
172
265
|
- (ANNNavigationOptions *)resolveOfNode:(UIViewController *)node
|
|
173
266
|
parents:(NSArray<UIViewController *> *)parents {
|
|
174
267
|
ANNNavigationOptions *result = [ANNDefaultOptions.current copy];
|
|
@@ -177,8 +270,12 @@ NSString *const ANNContainerReadyHandlerKey = @"ApexNavigation.container";
|
|
|
177
270
|
if (own) {
|
|
178
271
|
[result mergeOptions:own];
|
|
179
272
|
}
|
|
273
|
+
[parent.nodeHelper applyUserLayerTo:result];
|
|
180
274
|
}
|
|
181
275
|
[result mergeOptions:[node resolveOptions]];
|
|
276
|
+
if (![node getCurrentChild]) {
|
|
277
|
+
[self applyUserLayerTo:result];
|
|
278
|
+
}
|
|
182
279
|
return result;
|
|
183
280
|
}
|
|
184
281
|
|
package/ios/Core/ANNParking.h
CHANGED
|
@@ -4,10 +4,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
4
4
|
|
|
5
5
|
/// A place where the views of nodes wait for their content unseen (their safe area views lay out only in a window): the
|
|
6
6
|
/// window under the current root while a root waits, a stack's view under UIKit's container while a screen of the stack
|
|
7
|
-
/// waits or renders
|
|
8
|
-
///
|
|
9
|
-
///
|
|
10
|
-
///
|
|
7
|
+
/// waits or renders, the tabs' view while a tab rendered before it shows renders its content. A parked view sits at the
|
|
8
|
+
/// back of its host, at the host's size and following it (a rotation, a resize), gets no touches and is hidden from
|
|
9
|
+
/// accessibility; it isn't a child of anything there (a tab stays the tabs' child), and its node's appearance is driven
|
|
10
|
+
/// meanwhile (`ANNAppearanceDispatcher driveAppearanceOf:`), so UIKit's appearance callbacks report nothing for it.
|
|
11
|
+
/// Each node leaves it as it was. Main queue.
|
|
11
12
|
@interface ANNParking : NSObject
|
|
12
13
|
|
|
13
14
|
/// `node`'s view waits in `host` from now on, with what it had kept. NO when it waits here already.
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#import "ANNReloadCoordinator.h"
|
|
2
|
-
#import "ANNArrangementState.h"
|
|
3
2
|
#import "ANNAssert.h"
|
|
4
3
|
#import "ANNErrorTexts.h"
|
|
5
4
|
#import "ANNHinge.h"
|
|
@@ -12,12 +11,10 @@
|
|
|
12
11
|
#import "ANNPreviewInteraction.h"
|
|
13
12
|
#import "ANNPreviewPush.h"
|
|
14
13
|
#import "ANNRootCoordinator.h"
|
|
15
|
-
#import "
|
|
14
|
+
#import "ANNScreenEnvironment.h"
|
|
16
15
|
#import "ANNScreenReadiness.h"
|
|
17
|
-
#import "ANNScreenRegions.h"
|
|
18
16
|
#import "ANNSplashViewController.h"
|
|
19
17
|
#import "ANNSplitViewCommands.h"
|
|
20
|
-
#import "ANNTabsPreloadWindow.h"
|
|
21
18
|
#import "ApexNavigation+Internal.h"
|
|
22
19
|
#import "UIViewController+LayoutProtocol.h"
|
|
23
20
|
#import <React/RCTConstants.h>
|
|
@@ -145,21 +142,17 @@ static BOOL ANNWatchingBundles;
|
|
|
145
142
|
[oldScreens addObjectsFromArray:[ANNOverlayCoordinator takeAllForReload]];
|
|
146
143
|
// 4. The bar components and the tabs' cells and accessories have no store to empty: each screen and each tabs node
|
|
147
144
|
// keeps its own roots in its registry, so a new node never gets an old root by its id, and the old roots stop with
|
|
148
|
-
// their old nodes after the hold. The
|
|
149
|
-
// updates are off already.
|
|
150
|
-
[ANNTabsPreloadWindow hideAllAfterReload];
|
|
145
|
+
// their old nodes after the hold. The loop updates are off already.
|
|
151
146
|
// 5. The native screens of the old screens are silent by their emitter. The modals and overlays waiting to show
|
|
152
147
|
// left what waits for them in steps 2 and 3; the screens that wait to show in a split view's column leave it here,
|
|
153
148
|
// without an answer.
|
|
154
149
|
[oldScreens addObjectsFromArray:[ANNSplitViewCommands takeAllForReload]];
|
|
155
150
|
// The new JavaScript counts its ids anew: nothing the safe area views of the old screens said stays ready for a new
|
|
156
151
|
// screen with the same id. The old surfaces are stopped or silent. The same for what the old screens kept for
|
|
157
|
-
// JavaScript
|
|
158
|
-
// insets or regions again: its emitter is not current).
|
|
152
|
+
// JavaScript, their environment: insets and padding, regions and arrangements (an old screen still in a window
|
|
153
|
+
// writes no insets or regions again: its emitter is not current).
|
|
159
154
|
[ANNScreenReadiness reset];
|
|
160
|
-
[
|
|
161
|
-
[ANNScreenRegions removeAll];
|
|
162
|
-
[ANNArrangementState removeAll];
|
|
155
|
+
[ANNScreenEnvironment removeAll];
|
|
163
156
|
// 6. The window shows the blank screen, which counts as the splash: a reload is not a launch. The
|
|
164
157
|
// reset runs from the second bundle of the process on.
|
|
165
158
|
if (window) {
|
package/ios/Core/ANNRenderWait.h
CHANGED
|
@@ -5,7 +5,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
5
5
|
|
|
6
6
|
/// What content a render wait waits for.
|
|
7
7
|
typedef NS_ENUM(NSInteger, ANNRenderWaitContent) {
|
|
8
|
-
/// No content: the bar components alone
|
|
8
|
+
/// No content: the bar components alone.
|
|
9
9
|
ANNRenderWaitContentNone,
|
|
10
10
|
/// Each screen of `screens` whose React content isn't ready, by its own ready handler (a root's screens). The limit
|
|
11
11
|
/// marks ready the screens still waited.
|
|
@@ -36,7 +36,7 @@ typedef NS_ENUM(NSInteger, ANNRenderWaitBar) {
|
|
|
36
36
|
|
|
37
37
|
/// `screens` gives the screens the wait is about: their bar components, the screens the limit marks ready, the screens
|
|
38
38
|
/// of the unknown-content rule, and with `ANNRenderWaitContentEachScreen` the screens whose content it waits for, each
|
|
39
|
-
/// by the readiness it needs (`ANNWaitedReadinessOf`: content, or "
|
|
39
|
+
/// by the readiness it needs (`ANNWaitedReadinessOf`: content, or "unseen" content without its bar components). It is
|
|
40
40
|
/// asked as the wait starts, as it takes its screens again (`retakeScreens:`) and as its bar phase starts. `node` is
|
|
41
41
|
/// the node of `ANNRenderWaitContentNode`; nil otherwise. `limit` 0: no limit.
|
|
42
42
|
- (instancetype)initWithContent:(ANNRenderWaitContent)content
|
|
@@ -49,16 +49,30 @@ typedef NS_ENUM(NSInteger, ANNRenderWaitBar) {
|
|
|
49
49
|
- (instancetype)init NS_UNAVAILABLE;
|
|
50
50
|
+ (instancetype)new NS_UNAVAILABLE;
|
|
51
51
|
|
|
52
|
-
/// The longest a waited screen of the "
|
|
53
|
-
///
|
|
54
|
-
///
|
|
55
|
-
@property(nonatomic) NSTimeInterval
|
|
52
|
+
/// The longest a waited screen of the "unseen" kind (`ANNWaitedReadinessOf`, an unselected tab's screen) is waited
|
|
53
|
+
/// for, from the start, also when the wait has no limit: a screen the user doesn't see never holds a command for long.
|
|
54
|
+
/// 0: only the wait's own limit.
|
|
55
|
+
@property(nonatomic) NSTimeInterval unseenLimit;
|
|
56
56
|
|
|
57
57
|
/// The rule for content of unknown readiness: 1 s after the start, a screen whose rendered state stays unknown (no safe
|
|
58
58
|
/// area view says it) counts as ready; a screen whose safe area view spoke waits for its signal. Off by default (a root
|
|
59
59
|
/// has none).
|
|
60
60
|
@property(nonatomic) BOOL unknownContentRule;
|
|
61
61
|
|
|
62
|
+
/// The content phase ends only once every call JavaScript made by then is applied on the main queue
|
|
63
|
+
/// (`ANNJavaScriptCalls`): the options a screen merges in the commit that mounted it are there before the owner's next
|
|
64
|
+
/// step. Also when the content is there already as the wait starts or takes its screens again (the commit that mounted
|
|
65
|
+
/// it may have run just now): such a phase ends after `start`, through `protect`, while JavaScript has a call invoker;
|
|
66
|
+
/// without one (no JavaScript running) the calls are applied already and the phase ends inside `start`, as without
|
|
67
|
+
/// this. Screens without React content (a native screen) end the phase at once. The limit still ends the phase
|
|
68
|
+
/// meanwhile. Off by default.
|
|
69
|
+
@property(nonatomic) BOOL settlesThroughJavaScript;
|
|
70
|
+
|
|
71
|
+
/// With `ANNRenderWaitBarAfterContent`, the bar phase that follows the content phase counts its limits from the wait's
|
|
72
|
+
/// start, not from its own: the time the content took comes off each kind's limit, and a kind past it by then waits no
|
|
73
|
+
/// more. A bar phase that starts again (`retakeScreens:`) counts from then, as without it. Off by default.
|
|
74
|
+
@property(nonatomic) BOOL barLimitsFromStart;
|
|
75
|
+
|
|
62
76
|
/// Runs inside `start`, after the ready handlers are set and before the readiness test (the stack parks and renders
|
|
63
77
|
/// its entry there). A ready handler that runs inside it is left to the test after it.
|
|
64
78
|
@property(nonatomic, copy, nullable) dispatch_block_t setUp;
|