@apexnative/navigation 1.0.0-alpha.1 → 1.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/README.md +147 -51
- package/android/CLAUDE.md +31 -6
- package/android/CORE.md +7 -2
- package/android/RECIPES.md +4 -3
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +29 -1
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +5 -4
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +3 -2
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +5 -4
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +7 -6
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +3 -35
- 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 +101 -87
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +76 -13
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
- 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 +86 -16
- 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 +41 -23
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +24 -20
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +25 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +4 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +42 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +29 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +2 -0
- 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 +3 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +5 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +4 -7
- 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 +8 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +16 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +287 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +148 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +24 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +51 -11
- 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 +105 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +123 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +19 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +5 -5
- 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 +85 -27
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +5 -4
- 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 +45 -1
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +2 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +4 -6
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +4 -6
- package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +15 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +137 -1
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +8 -1
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +26 -4
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +4 -3
- package/cli/app.js +1 -1
- package/cli/project.js +6 -2
- package/cli/setup/index.js +13 -0
- package/cli/setup/steps/appDelegate.js +66 -11
- package/cli/setup/steps/sceneDelegate.js +108 -0
- package/docs-md/architecture/transitions.md +7 -1
- package/docs-md/containers/modals.md +4 -2
- package/docs-md/containers/overlays.md +3 -1
- package/docs-md/containers/side-menu.md +4 -2
- package/docs-md/containers/tabs.md +2 -0
- package/docs-md/flows/forms-in-a-modal.md +1 -1
- package/docs-md/guides/deep-links.md +15 -33
- package/docs-md/help/glossary.md +1 -1
- package/docs-md/index.json +8 -0
- package/docs-md/screen-ui/back-and-gestures.md +6 -0
- package/docs-md/screen-ui/system-ui.md +1 -1
- package/docs-md/start/installation.md +1 -0
- package/ios/Animations/ANNTransitionAnimator.mm +13 -11
- 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 +7 -5
- package/ios/Animations/Elements/ANNElementTransition.mm +17 -19
- package/ios/Animations/Elements/ANNSharedElementFlight.h +13 -8
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +59 -24
- package/ios/CLAUDE.md +10 -2
- package/ios/CORE.md +3 -2
- package/ios/Contract/ANNCommandAnswer.h +4 -3
- package/ios/Contract/ANNCommandAnswer.mm +12 -2
- package/ios/Contract/ANNCommandRunner.h +2 -2
- package/ios/Contract/ANNCommandRunner.mm +1 -1
- package/ios/Contract/ANNErrorTexts.h +6 -2
- package/ios/Contract/ANNErrorTexts.mm +18 -10
- package/ios/Core/ANNDeepLinkQueue.h +20 -1
- package/ios/Core/ANNDeepLinkQueue.mm +107 -12
- package/ios/Core/ANNErrorHandler.h +8 -3
- package/ios/Core/ANNErrorHandler.mm +17 -1
- package/ios/Core/ANNEventContract.h +246 -0
- package/ios/Core/ANNEventContract.mm +225 -0
- package/ios/Core/ANNEventEmitter.h +5 -1
- package/ios/Core/ANNEventEmitter.mm +117 -80
- package/ios/Core/ANNHinge.mm +6 -4
- package/ios/Core/ANNSceneDelegate.mm +25 -15
- package/ios/Core/ANNSystemUI.h +3 -2
- package/ios/Core/ANNSystemUI.mm +7 -0
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +6 -4
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +1 -1
- 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/Root/ANNRootCoordinator.mm +12 -3
- package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
- package/ios/Layouts/Screen/ANNComponentViewController.mm +28 -7
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
- package/ios/Layouts/Screen/ANNScreenInsets.mm +6 -4
- package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -6
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +4 -7
- package/ios/Options/ANNSheetOptions.h +4 -1
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
- package/ios/RECIPES.md +2 -1
- package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
- package/ios/TurboModules/ANNTurboModule.mm +5 -2
- package/lib/module/ARCHITECTURE.md +7 -4
- package/lib/module/api/app/createNavigation.js +2 -0
- package/lib/module/api/app/createNavigation.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/linking/dispatchedLinks.js +23 -0
- package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
- package/lib/module/interfaces/contract/errors.json +275 -0
- package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useNavigation.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/interfaces/Events.d.ts +9 -0
- package/lib/typescript/interfaces/Events.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/animations.d.ts +27 -18
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/modals.d.ts +33 -24
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/sideMenu.d.ts +7 -6
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/system.d.ts +10 -6
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ARCHITECTURE.md +7 -4
- package/src/api/app/createNavigation.ts +2 -0
- package/src/api/hooks/useNavigation.ts +8 -3
- package/src/api/linking/dispatchedLinks.ts +18 -0
- package/src/interfaces/Events.ts +10 -0
- package/src/interfaces/contract/errors.json +275 -0
- package/src/interfaces/options/animations.ts +27 -18
- package/src/interfaces/options/modals.ts +33 -24
- package/src/interfaces/options/sideMenu.ts +7 -6
- package/src/interfaces/options/system.ts +10 -6
|
@@ -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
|
package dev.apexnative.navigation.react
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -6,116 +8,129 @@ package dev.apexnative.navigation.react
|
|
|
6
8
|
* <command>:`.
|
|
7
9
|
*/
|
|
8
10
|
internal object ErrorTexts {
|
|
9
|
-
|
|
11
|
+
// Where the screen is.
|
|
12
|
+
|
|
13
|
+
fun screenNotShown(componentId: String) = "the screen '$componentId' is not shown"
|
|
10
14
|
|
|
11
|
-
fun notInStack(
|
|
15
|
+
fun notInStack(componentId: String) = "the screen '$componentId' is not in a stack"
|
|
12
16
|
|
|
13
|
-
fun firstScreenOfStack(
|
|
17
|
+
fun firstScreenOfStack(componentId: String) = "the screen '$componentId' is the first screen of its stack"
|
|
14
18
|
|
|
15
|
-
fun notInThisStack(
|
|
19
|
+
fun notInThisStack(componentId: String) = "the screen '$componentId' is not in this stack"
|
|
16
20
|
|
|
17
|
-
fun notInModal(
|
|
21
|
+
fun notInModal(componentId: String) = "the screen '$componentId' is not in a modal"
|
|
18
22
|
|
|
19
|
-
fun notInOverlay(
|
|
23
|
+
fun notInOverlay(componentId: String) = "the screen '$componentId' is not in an overlay"
|
|
20
24
|
|
|
21
|
-
fun notInSplitView(
|
|
25
|
+
fun notInSplitView(componentId: String) = "the screen '$componentId' is not in a split view"
|
|
22
26
|
|
|
23
|
-
fun neitherSplitViewNorStack(
|
|
27
|
+
fun neitherSplitViewNorStack(componentId: String) =
|
|
28
|
+
"the screen '$componentId' is neither in a split view nor in a stack"
|
|
24
29
|
|
|
25
|
-
fun noSuchColumn(
|
|
30
|
+
fun noSuchColumn(componentId: String, column: String) =
|
|
31
|
+
"the split view of the screen '$componentId' has no '$column' column"
|
|
26
32
|
|
|
27
|
-
fun columnIsStack(
|
|
28
|
-
"the '$column' column of the split view of the screen '$
|
|
33
|
+
fun columnIsStack(componentId: String, column: String) =
|
|
34
|
+
"the '$column' column of the split view of the screen '$componentId' is a stack: it takes a screen, not a stack"
|
|
29
35
|
|
|
30
|
-
fun columnNotStack(
|
|
31
|
-
"the '$column' column of the split view of the screen '$
|
|
36
|
+
fun columnNotStack(componentId: String, column: String) =
|
|
37
|
+
"the '$column' column of the split view of the screen '$componentId' is not a stack"
|
|
32
38
|
|
|
33
|
-
fun noScreensForStack(
|
|
39
|
+
fun noScreensForStack(componentId: String) = "there are no screens to put in the stack of the screen '$componentId'"
|
|
34
40
|
|
|
35
|
-
fun alreadyShown(
|
|
41
|
+
fun alreadyShown(componentId: String) = "the screen '$componentId' shows already: an id goes to one screen"
|
|
36
42
|
|
|
37
|
-
|
|
38
|
-
"setRoot was replaced by a newer setRoot before the root '$id' finished showing"
|
|
43
|
+
// Root, modals, the app.
|
|
39
44
|
|
|
40
|
-
fun
|
|
45
|
+
fun setRootReplaced(rootId: String) =
|
|
46
|
+
"setRoot was replaced by a newer setRoot before the root '$rootId' finished showing"
|
|
41
47
|
|
|
42
|
-
fun
|
|
48
|
+
fun rootDestroyed(rootId: String) = "the root '$rootId' was destroyed before it showed"
|
|
49
|
+
|
|
50
|
+
fun modalWithoutRoot(componentId: String) = "the modal '$componentId' can't be dismissed: there is no root under it"
|
|
43
51
|
|
|
44
52
|
fun nowhereToShow() = "the navigation has nowhere to show screens: the app has no activity or window"
|
|
45
53
|
|
|
54
|
+
// Native screens.
|
|
55
|
+
|
|
46
56
|
fun nativeScreenNotRegistered(name: String) = "no native screen is registered as '$name'"
|
|
47
57
|
|
|
48
58
|
fun nativeScreenNotCreated(name: String) =
|
|
49
59
|
"the native screen '$name' could not be created: its creator returned nothing"
|
|
50
60
|
|
|
51
|
-
|
|
61
|
+
/** The error of a call of a native screen whose JavaScript reloaded before it answered. */
|
|
62
|
+
fun nativeCallReloaded(name: String, componentId: String) =
|
|
63
|
+
"JavaScript reloaded before the call '$name' of the screen '$componentId' was answered"
|
|
52
64
|
|
|
53
|
-
|
|
65
|
+
/** The error of a call of a native screen while no JavaScript can answer it. */
|
|
66
|
+
fun nativeCallNotRunning(name: String, componentId: String) =
|
|
67
|
+
"the navigation is not running: the call '$name' of the screen '$componentId' can't be answered"
|
|
54
68
|
|
|
55
|
-
|
|
56
|
-
"the side menu '$id' has a child of type '$type': it takes SideMenuLeft, SideMenuCenter and SideMenuRight"
|
|
69
|
+
// The layout.
|
|
57
70
|
|
|
58
|
-
fun
|
|
71
|
+
fun unknownNodeType(type: String) = "the layout has a node of unknown type '$type'"
|
|
59
72
|
|
|
60
|
-
fun
|
|
73
|
+
fun nodeWithoutId(type: String) = "the layout has a node of type '$type' without an id"
|
|
61
74
|
|
|
62
|
-
fun
|
|
75
|
+
fun sideMenuChild(menuId: String, type: String) =
|
|
76
|
+
"the side menu '$menuId' has a child of type '$type': it takes SideMenuLeft, SideMenuCenter and SideMenuRight"
|
|
63
77
|
|
|
64
|
-
fun
|
|
78
|
+
fun stackTakesScreens(stackId: String, type: String) = "the stack '$stackId' takes screens, not a '$type'"
|
|
65
79
|
|
|
66
|
-
fun
|
|
80
|
+
fun emptyStack(stackId: String) = "the stack '$stackId' has no screens"
|
|
67
81
|
|
|
68
|
-
fun
|
|
82
|
+
fun emptyTabs(tabsId: String) = "the tabs '$tabsId' have no tabs"
|
|
69
83
|
|
|
70
|
-
|
|
84
|
+
/** Only Android checks it: its tab bar shows at most 5 tabs. */
|
|
85
|
+
fun tooManyTabs(tabsId: String, count: Int) = "the tabs '$tabsId' have $count tabs: Android shows at most 5"
|
|
71
86
|
|
|
72
|
-
fun
|
|
73
|
-
"the
|
|
87
|
+
fun splitViewColumns(splitViewId: String) =
|
|
88
|
+
"the split view '$splitViewId' needs its primary and its secondary column"
|
|
74
89
|
|
|
75
|
-
/**
|
|
76
|
-
fun
|
|
77
|
-
"the option '$path' of the default options has a value the navigation can't read"
|
|
90
|
+
/** Only iOS checks it: Android has pairs on every version. */
|
|
91
|
+
fun pairUnsupported(pairId: String) = "the pair '$pairId' needs iOS 27.1 and an app built with its SDK"
|
|
78
92
|
|
|
79
|
-
fun
|
|
93
|
+
fun pairNeedsTwoScreens(pairId: String) = "the pair '$pairId' needs two screens: its primary and its secondary"
|
|
80
94
|
|
|
81
|
-
|
|
82
|
-
fun couldNot(what: String, reason: String) = "could not $what: $reason"
|
|
95
|
+
fun nodeWithoutName(type: String, nodeId: String) = "the layout has a node '$nodeId' of type '$type' without a name"
|
|
83
96
|
|
|
84
|
-
fun
|
|
85
|
-
"JavaScript reloaded before the call '$name' of the screen '$id' was answered"
|
|
97
|
+
fun rootMissing() = "the layout of setRoot has no root"
|
|
86
98
|
|
|
87
|
-
fun
|
|
88
|
-
"the navigation is not running: the call '$name' of the screen '$id' can't be answered"
|
|
99
|
+
fun tabsInTabs(tabsId: String) = "the tabs '$tabsId' have a tab of type 'BottomTabs': tabs don't go inside tabs"
|
|
89
100
|
|
|
90
|
-
|
|
91
|
-
|
|
101
|
+
fun sideMenuSides(menuId: String) =
|
|
102
|
+
"the side menu '$menuId' takes one SideMenuCenter and at most one SideMenuLeft and one SideMenuRight"
|
|
92
103
|
|
|
93
|
-
|
|
94
|
-
|
|
104
|
+
fun sideChildCount(sideId: String, menuId: String) =
|
|
105
|
+
"the side '$sideId' of the side menu '$menuId' needs exactly one child"
|
|
95
106
|
|
|
96
|
-
|
|
107
|
+
fun sideMenuInSide(menuId: String) =
|
|
108
|
+
"the side menu '$menuId' has a side menu in a side: a side menu doesn't go inside a side menu"
|
|
97
109
|
|
|
98
|
-
fun
|
|
110
|
+
fun sideOutsideMenu(nodeId: String, type: String) =
|
|
111
|
+
"the layout has a node '$nodeId' of type '$type' outside a side menu"
|
|
99
112
|
|
|
100
|
-
fun
|
|
113
|
+
fun splitViewInColumn(splitViewId: String) =
|
|
114
|
+
"the split view '$splitViewId' has a column of type 'SplitView': a split view doesn't go inside a split view"
|
|
101
115
|
|
|
102
|
-
fun
|
|
116
|
+
fun idGivenTwice(nodeId: String) = "the layout gives the id '$nodeId' to two nodes"
|
|
103
117
|
|
|
104
|
-
|
|
105
|
-
"the side menu '$id' takes one SideMenuCenter and at most one SideMenuLeft and one SideMenuRight"
|
|
118
|
+
// Options, previews, any other failure.
|
|
106
119
|
|
|
107
|
-
fun
|
|
108
|
-
"the
|
|
120
|
+
fun unreadableOption(path: String, componentId: String) =
|
|
121
|
+
"the option '$path' of the screen '$componentId' has a value the navigation can't read"
|
|
109
122
|
|
|
110
|
-
|
|
111
|
-
|
|
123
|
+
/** An unreadable value of `setDefaultOptions`: the default options belong to no screen. */
|
|
124
|
+
fun unreadableDefaultOption(path: String) =
|
|
125
|
+
"the option '$path' of the default options has a value the navigation can't read"
|
|
112
126
|
|
|
113
|
-
fun
|
|
127
|
+
fun previewGone(previewId: String) = "the preview '$previewId' went without being opened"
|
|
114
128
|
|
|
115
|
-
|
|
116
|
-
|
|
129
|
+
/** Any other failure: what could not be done and why, `could not <what>: <reason>`. */
|
|
130
|
+
fun couldNot(what: String, reason: String) = "could not $what: $reason"
|
|
117
131
|
|
|
118
|
-
|
|
132
|
+
/** A command whose part of the native core is not written yet. */
|
|
133
|
+
fun notDoneYet(method: String) = "could not run '$method': the native core doesn't do it yet"
|
|
119
134
|
|
|
120
135
|
/** The reason of [couldNot] for an exception: its message, else the name of its class. */
|
|
121
136
|
fun reasonOf(e: Throwable): String =
|
|
@@ -12,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner
|
|
|
12
12
|
import com.facebook.react.ReactApplication
|
|
13
13
|
import com.facebook.react.bridge.Arguments
|
|
14
14
|
import com.facebook.react.bridge.WritableMap
|
|
15
|
+
import dev.apexnative.navigation.react.events.EventContract
|
|
15
16
|
import dev.apexnative.navigation.react.events.EventEmitter
|
|
16
17
|
import dev.apexnative.navigation.utils.WindowFolds
|
|
17
18
|
import java.lang.ref.WeakReference
|
|
@@ -148,7 +149,7 @@ internal object Hinge {
|
|
|
148
149
|
|
|
149
150
|
private fun toMap(value: Value?): WritableMap = Arguments.createMap().apply {
|
|
150
151
|
if (value == null) return@apply
|
|
151
|
-
putString(
|
|
152
|
-
value.angle?.let { putDouble(
|
|
152
|
+
putString(EventContract.HingeChanged.STATE, value.state)
|
|
153
|
+
value.angle?.let { putDouble(EventContract.HingeChanged.ANGLE, it.toDouble()) }
|
|
153
154
|
}
|
|
154
155
|
}
|
|
@@ -73,7 +73,7 @@ internal class OptionsCommands(
|
|
|
73
73
|
prepare = { OptionsReader.read(options, context()) },
|
|
74
74
|
) { read ->
|
|
75
75
|
if (!runner.hasActivity()) {
|
|
76
|
-
runner.logFailure(MERGE_OPTIONS, ErrorTexts.
|
|
76
|
+
runner.logFailure(MERGE_OPTIONS, ErrorTexts.nowhereToShow())
|
|
77
77
|
return@runVoid
|
|
78
78
|
}
|
|
79
79
|
val node = findNode(componentId) ?: return@runVoid
|
|
@@ -4,6 +4,7 @@ import android.content.Context
|
|
|
4
4
|
import com.facebook.react.ReactApplication
|
|
5
5
|
import com.facebook.react.bridge.Arguments
|
|
6
6
|
import com.facebook.react.bridge.WritableMap
|
|
7
|
+
import dev.apexnative.navigation.react.events.EventContract
|
|
7
8
|
import dev.apexnative.navigation.react.events.EventEmitter
|
|
8
9
|
import java.util.concurrent.ConcurrentHashMap
|
|
9
10
|
|
|
@@ -61,9 +62,9 @@ object ScreenInsets {
|
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
private fun toMap(value: Insets): WritableMap = Arguments.createMap().apply {
|
|
64
|
-
putDouble(
|
|
65
|
-
putDouble(
|
|
66
|
-
putDouble(
|
|
67
|
-
putDouble(
|
|
65
|
+
putDouble(EventContract.ScreenInsetsChanged.TOP, value.top)
|
|
66
|
+
putDouble(EventContract.ScreenInsetsChanged.RIGHT, value.right)
|
|
67
|
+
putDouble(EventContract.ScreenInsetsChanged.BOTTOM, value.bottom)
|
|
68
|
+
putDouble(EventContract.ScreenInsetsChanged.LEFT, value.left)
|
|
68
69
|
}
|
|
69
70
|
}
|
|
@@ -7,6 +7,7 @@ import com.facebook.react.ReactApplication
|
|
|
7
7
|
import com.facebook.react.bridge.Arguments
|
|
8
8
|
import com.facebook.react.bridge.WritableArray
|
|
9
9
|
import com.facebook.react.bridge.WritableMap
|
|
10
|
+
import dev.apexnative.navigation.react.events.EventContract
|
|
10
11
|
import dev.apexnative.navigation.react.events.EventEmitter
|
|
11
12
|
import dev.apexnative.navigation.utils.WindowFolds
|
|
12
13
|
import java.util.concurrent.ConcurrentHashMap
|
|
@@ -70,17 +71,17 @@ internal object ScreenRegions {
|
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
private fun toMap(value: Regions): WritableMap = Arguments.createMap().apply {
|
|
73
|
-
putArray(
|
|
74
|
-
putArray(
|
|
74
|
+
putArray(EventContract.ScreenRegionsChanged.DIVISION, toArray(value.division))
|
|
75
|
+
putArray(EventContract.ScreenRegionsChanged.OCCLUSION, toArray(value.occlusion))
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
private fun toArray(regions: List<Region>): WritableArray = Arguments.createArray().apply {
|
|
78
79
|
for (region in regions) {
|
|
79
80
|
pushMap(Arguments.createMap().apply {
|
|
80
|
-
putDouble(
|
|
81
|
-
putDouble(
|
|
82
|
-
putDouble(
|
|
83
|
-
putDouble(
|
|
81
|
+
putDouble(EventContract.ScreenRegionRect.X, region.x)
|
|
82
|
+
putDouble(EventContract.ScreenRegionRect.Y, region.y)
|
|
83
|
+
putDouble(EventContract.ScreenRegionRect.WIDTH, region.width)
|
|
84
|
+
putDouble(EventContract.ScreenRegionRect.HEIGHT, region.height)
|
|
84
85
|
})
|
|
85
86
|
}
|
|
86
87
|
}
|
package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt
CHANGED
|
@@ -210,43 +210,18 @@ internal object AppearanceDispatcher {
|
|
|
210
210
|
// A transition whose caller sends the state itself ends: the DidDisappears it sends ask for no update.
|
|
211
211
|
private var holdsState = false
|
|
212
212
|
|
|
213
|
-
// A side menu's drawer jumps open: the appearances that start in it send no WillAppear.
|
|
214
|
-
private var skipsWillAppear = false
|
|
215
|
-
|
|
216
213
|
// The native screens that told JavaScript they went: once per node.
|
|
217
214
|
private val released: MutableSet<ViewController<*>> = Collections.newSetFromMap(WeakHashMap())
|
|
218
215
|
|
|
219
216
|
// Appearance of a record.
|
|
220
217
|
|
|
221
|
-
/**
|
|
222
|
-
* The record starts to appear: WillAppear, now when it is ready, else held. Only once per appearance; none inside
|
|
223
|
-
* [withoutWillAppear].
|
|
224
|
-
*/
|
|
218
|
+
/** The record starts to appear: WillAppear, now when it is ready, else held. Only once per appearance. */
|
|
225
219
|
fun willAppear(record: ScreenAppearance) {
|
|
226
220
|
if (record.phase != Phase.Hidden) return
|
|
227
221
|
record.phase = Phase.Appearing
|
|
228
|
-
if (skipsWillAppear) {
|
|
229
|
-
record.skippedWill = true
|
|
230
|
-
return
|
|
231
|
-
}
|
|
232
222
|
if (record.isReady) send(record, Event.WillAppear) else hold(record, Event.WillAppear)
|
|
233
223
|
}
|
|
234
224
|
|
|
235
|
-
/**
|
|
236
|
-
* Runs [block], in which the appearances that start send no WillAppear: their DidAppear is their first event, and
|
|
237
|
-
* their DidDisappear goes only once that DidAppear went. A side menu's drawer that opens without animation does so
|
|
238
|
-
* on Android; the screens' options and the components of their bars go as at any appearance.
|
|
239
|
-
*/
|
|
240
|
-
fun withoutWillAppear(block: () -> Unit) {
|
|
241
|
-
val outer = skipsWillAppear
|
|
242
|
-
skipsWillAppear = true
|
|
243
|
-
try {
|
|
244
|
-
block()
|
|
245
|
-
} finally {
|
|
246
|
-
skipsWillAppear = outer
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
225
|
/**
|
|
251
226
|
* The record has appeared: DidAppear, after a WillAppear (asked now when it wasn't), now when nothing is held and
|
|
252
227
|
* it is ready, else held behind what is held. Only once per appearance.
|
|
@@ -261,19 +236,12 @@ internal object AppearanceDispatcher {
|
|
|
261
236
|
/**
|
|
262
237
|
* The record has disappeared. Nothing when it didn't appear. When its WillAppear is still held, JavaScript never
|
|
263
238
|
* heard it appear: what is held goes away and nothing is sent. Otherwise a held DidAppear goes away and
|
|
264
|
-
* DidDisappear is sent: a swipe that was cancelled gives WillAppear, then DidDisappear.
|
|
265
|
-
* WillAppear ([withoutWillAppear]) appeared once its DidAppear went.
|
|
239
|
+
* DidDisappear is sent: a swipe that was cancelled gives WillAppear, then DidDisappear.
|
|
266
240
|
*/
|
|
267
241
|
fun didDisappear(record: ScreenAppearance) {
|
|
268
242
|
if (record.phase == Phase.Hidden) return
|
|
269
|
-
val wasShown = record.phase == Phase.Shown
|
|
270
243
|
record.phase = Phase.Hidden
|
|
271
|
-
val appeared =
|
|
272
|
-
wasShown && Event.DidAppear !in record.held
|
|
273
|
-
} else {
|
|
274
|
-
Event.WillAppear !in record.held
|
|
275
|
-
}
|
|
276
|
-
record.skippedWill = false
|
|
244
|
+
val appeared = Event.WillAppear !in record.held
|
|
277
245
|
record.held.clear()
|
|
278
246
|
cancelLimit(record)
|
|
279
247
|
// What waited for its DidAppear goes now: none will be sent for this appearance.
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// Made by scripts/contract.mjs from the event types of src/interfaces/: change them and run the script again.
|
|
2
|
+
|
|
3
|
+
package dev.apexnative.navigation.react.events
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The names of the events `ANN.<Name>` ([EVENT]) and the keys of their payloads, as the types of `src/interfaces/` give
|
|
7
|
+
* them; what each field means is its JSDoc there. The object types a field holds have keys of their own. The sender
|
|
8
|
+
* and the builders of payloads take every name and key from here: `EventContract.CommandCompleted.COMMAND_ID`. The
|
|
9
|
+
* events and fields only iOS sends are not here.
|
|
10
|
+
*/
|
|
11
|
+
internal object EventContract {
|
|
12
|
+
/** `ANN.AppLaunched`. */
|
|
13
|
+
object AppLaunched {
|
|
14
|
+
const val EVENT = "ANN.AppLaunched"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** `ANN.ArrangementChanged`. */
|
|
18
|
+
object ArrangementChanged {
|
|
19
|
+
const val EVENT = "ANN.ArrangementChanged"
|
|
20
|
+
const val COMPONENT_ID = "componentId"
|
|
21
|
+
const val PLACEMENT = "placement"
|
|
22
|
+
const val LAYOUT = "layout"
|
|
23
|
+
const val FRONT = "front"
|
|
24
|
+
const val HIDDEN = "hidden"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** `ANN.BottomTabLongPressed`. */
|
|
28
|
+
object BottomTabLongPressed {
|
|
29
|
+
const val EVENT = "ANN.BottomTabLongPressed"
|
|
30
|
+
const val SELECTED_TAB_INDEX = "selectedTabIndex"
|
|
31
|
+
const val BOTTOM_TABS_ID = "bottomTabsId"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** `ANN.BottomTabPressed`. */
|
|
35
|
+
object BottomTabPressed {
|
|
36
|
+
const val EVENT = "ANN.BottomTabPressed"
|
|
37
|
+
const val TAB_INDEX = "tabIndex"
|
|
38
|
+
const val BOTTOM_TABS_ID = "bottomTabsId"
|
|
39
|
+
/** Optional. */
|
|
40
|
+
const val SCREEN_ID = "screenId"
|
|
41
|
+
const val WAS_SELECTED = "wasSelected"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** `ANN.BottomTabSelected`. */
|
|
45
|
+
object BottomTabSelected {
|
|
46
|
+
const val EVENT = "ANN.BottomTabSelected"
|
|
47
|
+
const val SELECTED_TAB_INDEX = "selectedTabIndex"
|
|
48
|
+
const val UNSELECTED_TAB_INDEX = "unselectedTabIndex"
|
|
49
|
+
const val BOTTOM_TABS_ID = "bottomTabsId"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** `ANN.CommandCompleted`. */
|
|
53
|
+
object CommandCompleted {
|
|
54
|
+
const val EVENT = "ANN.CommandCompleted"
|
|
55
|
+
const val COMMAND_NAME = "commandName"
|
|
56
|
+
const val COMMAND_ID = "commandId"
|
|
57
|
+
const val COMPLETION_TIME = "completionTime"
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** `ANN.ComponentDidAppear`. */
|
|
61
|
+
object ComponentDidAppear {
|
|
62
|
+
const val EVENT = "ANN.ComponentDidAppear"
|
|
63
|
+
const val COMPONENT_ID = "componentId"
|
|
64
|
+
const val COMPONENT_NAME = "componentName"
|
|
65
|
+
const val COMPONENT_TYPE = "componentType"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** `ANN.ComponentDidDisappear`. */
|
|
69
|
+
object ComponentDidDisappear {
|
|
70
|
+
const val EVENT = "ANN.ComponentDidDisappear"
|
|
71
|
+
const val COMPONENT_ID = "componentId"
|
|
72
|
+
const val COMPONENT_NAME = "componentName"
|
|
73
|
+
const val COMPONENT_TYPE = "componentType"
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** `ANN.ComponentWillAppear`. */
|
|
77
|
+
object ComponentWillAppear {
|
|
78
|
+
const val EVENT = "ANN.ComponentWillAppear"
|
|
79
|
+
const val COMPONENT_ID = "componentId"
|
|
80
|
+
const val COMPONENT_NAME = "componentName"
|
|
81
|
+
const val COMPONENT_TYPE = "componentType"
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** `ANN.HingeChanged`. */
|
|
85
|
+
object HingeChanged {
|
|
86
|
+
const val EVENT = "ANN.HingeChanged"
|
|
87
|
+
/** Optional. */
|
|
88
|
+
const val STATE = "state"
|
|
89
|
+
/** Optional. */
|
|
90
|
+
const val ANGLE = "angle"
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** `ANN.ModalAttemptedToDismiss`. */
|
|
94
|
+
object ModalAttemptedToDismiss {
|
|
95
|
+
const val EVENT = "ANN.ModalAttemptedToDismiss"
|
|
96
|
+
const val COMPONENT_ID = "componentId"
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** `ANN.ModalDismissed`. */
|
|
100
|
+
object ModalDismissed {
|
|
101
|
+
const val EVENT = "ANN.ModalDismissed"
|
|
102
|
+
const val COMPONENT_ID = "componentId"
|
|
103
|
+
const val COMPONENT_NAME = "componentName"
|
|
104
|
+
const val MODALS_DISMISSED = "modalsDismissed"
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** `ANN.NativeScreenCall`. */
|
|
108
|
+
object NativeScreenCall {
|
|
109
|
+
const val EVENT = "ANN.NativeScreenCall"
|
|
110
|
+
const val COMPONENT_ID = "componentId"
|
|
111
|
+
const val CALL_ID = "callId"
|
|
112
|
+
const val KIND = "kind"
|
|
113
|
+
const val NAME = "name"
|
|
114
|
+
const val ARGS = "args"
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** `ANN.NativeScreenReleased`. */
|
|
118
|
+
object NativeScreenReleased {
|
|
119
|
+
const val EVENT = "ANN.NativeScreenReleased"
|
|
120
|
+
const val COMPONENT_ID = "componentId"
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** `ANN.NavigationButtonPressed`. */
|
|
124
|
+
object NavigationButtonPressed {
|
|
125
|
+
const val EVENT = "ANN.NavigationButtonPressed"
|
|
126
|
+
const val COMPONENT_ID = "componentId"
|
|
127
|
+
const val BUTTON_ID = "buttonId"
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** `ANN.NavigationStateChanged`. */
|
|
131
|
+
object NavigationStateChanged {
|
|
132
|
+
const val EVENT = "ANN.NavigationStateChanged"
|
|
133
|
+
const val SCREEN = "screen"
|
|
134
|
+
const val TAB = "tab"
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** The object of `ANN.NavigationStateChanged.screen`. */
|
|
138
|
+
object NavigationStateChangedScreen {
|
|
139
|
+
const val ID = "id"
|
|
140
|
+
const val NAME = "name"
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** `ANN.ScreenInsetsChanged`. */
|
|
144
|
+
object ScreenInsetsChanged {
|
|
145
|
+
const val EVENT = "ANN.ScreenInsetsChanged"
|
|
146
|
+
const val COMPONENT_ID = "componentId"
|
|
147
|
+
const val TOP = "top"
|
|
148
|
+
const val RIGHT = "right"
|
|
149
|
+
const val BOTTOM = "bottom"
|
|
150
|
+
const val LEFT = "left"
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** `ANN.ScreenPopped`. */
|
|
154
|
+
object ScreenPopped {
|
|
155
|
+
const val EVENT = "ANN.ScreenPopped"
|
|
156
|
+
const val COMPONENT_ID = "componentId"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** The object of `ANN.ScreenRegionsChanged.division`. */
|
|
160
|
+
object ScreenRegionRect {
|
|
161
|
+
const val X = "x"
|
|
162
|
+
const val Y = "y"
|
|
163
|
+
const val WIDTH = "width"
|
|
164
|
+
const val HEIGHT = "height"
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** `ANN.ScreenRegionsChanged`. */
|
|
168
|
+
object ScreenRegionsChanged {
|
|
169
|
+
const val EVENT = "ANN.ScreenRegionsChanged"
|
|
170
|
+
const val COMPONENT_ID = "componentId"
|
|
171
|
+
const val DIVISION = "division"
|
|
172
|
+
const val OCCLUSION = "occlusion"
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** `ANN.SearchBarCancelPressed`. */
|
|
176
|
+
object SearchBarCancelPressed {
|
|
177
|
+
const val EVENT = "ANN.SearchBarCancelPressed"
|
|
178
|
+
const val COMPONENT_ID = "componentId"
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** `ANN.SearchBarSubmitted`. */
|
|
182
|
+
object SearchBarSubmitted {
|
|
183
|
+
const val EVENT = "ANN.SearchBarSubmitted"
|
|
184
|
+
const val COMPONENT_ID = "componentId"
|
|
185
|
+
const val TEXT = "text"
|
|
186
|
+
/** Optional. */
|
|
187
|
+
const val SCOPE = "scope"
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** `ANN.SearchBarUpdated`. */
|
|
191
|
+
object SearchBarUpdated {
|
|
192
|
+
const val EVENT = "ANN.SearchBarUpdated"
|
|
193
|
+
const val COMPONENT_ID = "componentId"
|
|
194
|
+
const val TEXT = "text"
|
|
195
|
+
const val IS_FOCUSED = "isFocused"
|
|
196
|
+
/** Optional. */
|
|
197
|
+
const val SCOPE = "scope"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** `ANN.SearchSuggestionPicked`. */
|
|
201
|
+
object SearchSuggestionPicked {
|
|
202
|
+
const val EVENT = "ANN.SearchSuggestionPicked"
|
|
203
|
+
const val COMPONENT_ID = "componentId"
|
|
204
|
+
const val SUGGESTION_ID = "suggestionId"
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** `ANN.SheetDetentChanged`. */
|
|
208
|
+
object SheetDetentChanged {
|
|
209
|
+
const val EVENT = "ANN.SheetDetentChanged"
|
|
210
|
+
const val COMPONENT_ID = "componentId"
|
|
211
|
+
const val DETENT = "detent"
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** `ANN.SlotDestroyed`. */
|
|
215
|
+
object SlotDestroyed {
|
|
216
|
+
const val EVENT = "ANN.SlotDestroyed"
|
|
217
|
+
const val COMPONENT_ID = "componentId"
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** `ANN.SplitViewColumnsStacked`. */
|
|
221
|
+
object SplitViewColumnsStacked {
|
|
222
|
+
const val EVENT = "ANN.SplitViewColumnsStacked"
|
|
223
|
+
const val COMPONENT_ID = "componentId"
|
|
224
|
+
const val STACKED = "stacked"
|
|
225
|
+
}
|
|
226
|
+
}
|