1
1
import { Page } from 'ui/page'
2
- import { before , trace } from '../util/index'
2
+ import { topmost } from 'ui/frame'
3
+ import { before } from '../util/index'
3
4
4
5
export function patchRouter ( router , Vue ) {
5
6
if ( router . __patched_for_page_routing__ ) {
@@ -13,16 +14,55 @@ export function patchRouter(router, Vue) {
13
14
// This fixes it, since it allows the router.go logic to run
14
15
router . history . index = 0
15
16
17
+ // initial navigation states
18
+ router . isBackNavigation = false
19
+ router . shouldNavigate = true
20
+ router . pageStack = [ ]
21
+
22
+ router . _beginBackNavigation = ( shouldNavigate = true ) => {
23
+ if ( router . isBackNavigation ) {
24
+ throw new Error (
25
+ 'router._beginBackNavigation was called while already navigating back.'
26
+ )
27
+ }
28
+
29
+ router . isBackNavigation = true
30
+ router . shouldNavigate = shouldNavigate
31
+ }
32
+
33
+ router . _finishBackNavigation = ( ) => {
34
+ if ( ! router . isBackNavigation ) {
35
+ throw new Error (
36
+ 'router._finishBackNavigation was called while there was no back navigation.'
37
+ )
38
+ }
39
+
40
+ router . isBackNavigation = false
41
+ }
42
+
16
43
router . go = before ( router . go , router , n => {
17
- if ( n === - 1 ) {
18
- router . isBackNavigation = true
19
- Vue . navigateBack ( )
44
+ if ( n === - 1 && ! router . isBackNavigation ) {
45
+ router . _beginBackNavigation ( )
20
46
}
21
47
} )
22
48
23
49
router . afterEach ( ( ) => {
24
50
if ( router . isBackNavigation ) {
25
- router . isBackNavigation = false
51
+ if ( router . shouldNavigate ) {
52
+ Vue . navigateBack ( )
53
+ }
54
+ router . pageStack . pop ( )
55
+ const page = router . pageStack [ router . pageStack . length - 1 ]
56
+
57
+ const callback = ( { isBackNavigation } ) => {
58
+ if ( isBackNavigation ) {
59
+ router . _finishBackNavigation ( )
60
+ }
61
+ page . off ( Page . navigatedToEvent , callback )
62
+ }
63
+
64
+ page . on ( Page . navigatedToEvent , callback )
65
+
26
66
return
27
67
}
28
68
@@ -31,9 +71,11 @@ export function patchRouter(router, Vue) {
31
71
Vue . navigateTo ( component , {
32
72
context : { router }
33
73
} ) . then ( page => {
34
- page . off ( Page . navigatingFromEvent )
35
- page . on ( Page . navigatingFromEvent , args => {
36
- if ( args . isBackNavigation ) {
74
+ router . pageStack . push ( page )
75
+
76
+ page . on ( Page . navigatedFromEvent , ( { isBackNavigation } ) => {
77
+ if ( isBackNavigation && ! router . isBackNavigation ) {
78
+ router . _beginBackNavigation ( false )
37
79
router . back ( )
38
80
}
39
81
} )
@@ -69,6 +111,9 @@ export default {
69
111
this . $navigateTo ( initial , {
70
112
context : { router } ,
71
113
clearHistory : true
114
+ } ) . then ( page => {
115
+ // Todo: this callback never fires on iOS and causes an issue
116
+ router . pageStack . push ( page )
72
117
} )
73
118
}
74
119
}
0 commit comments