@@ -66,7 +66,69 @@ export const defaultPageFactoryProvider = { provide: PAGE_FACTORY, useValue: def
66
66
@Injectable ( )
67
67
export class FrameService {
68
68
// TODO: Add any methods that are needed to handle frame/page navigation
69
+ private frames : { frame : Frame , name : string , rootOutlet : string } [ ] = [ ] ;
70
+
71
+ // Return the topmost frame.
72
+ // TabView with frames scenario: topmost() will return the root TabViewItem frame,
73
+ // which could be the wrong topmost frame (modal with nested frame e.g.):
74
+ // TabViewItem -> Frame -> Modal -> Frame2 -> Frame2-Navigation
69
75
getFrame ( ) : Frame {
70
- return topmost ( ) ;
76
+ let tompostFrame = topmost ( ) ;
77
+ const { cachedFrame, cachedFrameRootOutlet } = this . findFrame ( tompostFrame ) ;
78
+
79
+ if ( cachedFrame && cachedFrameRootOutlet ) {
80
+ const latestFrameByOutlet = this . getLatestFrameByOutlet ( cachedFrameRootOutlet ) ;
81
+
82
+ if ( latestFrameByOutlet && latestFrameByOutlet !== cachedFrame ) {
83
+ tompostFrame = latestFrameByOutlet ;
84
+ }
85
+ }
86
+
87
+ return tompostFrame ;
88
+ }
89
+
90
+ addFrame ( frame : Frame , name : string , rootOutlet : string ) {
91
+ this . frames . push ( { frame : frame , name : name , rootOutlet : rootOutlet } ) ;
92
+ }
93
+
94
+ removeFrame ( frame : Frame ) {
95
+ this . frames = this . frames . filter ( currentFrame => currentFrame . frame !== frame ) ;
96
+ }
97
+
98
+ findFrame ( frame : Frame , name ?: string ) {
99
+ let cachedFrame ;
100
+ let cachedFrameRootOutlet ;
101
+ let hasDuplicateOutlet = false ;
102
+
103
+ for ( let i = 0 ; i < this . frames . length ; i ++ ) {
104
+ const currentFrame = this . frames [ i ] ;
105
+
106
+ if ( currentFrame . frame === frame ) {
107
+ cachedFrame = currentFrame ;
108
+ cachedFrameRootOutlet = currentFrame . rootOutlet ;
109
+ }
110
+
111
+ if ( name && currentFrame . name === name ) {
112
+ hasDuplicateOutlet = true ;
113
+ }
114
+ }
115
+
116
+ return { cachedFrame, cachedFrameRootOutlet, hasDuplicateOutlet } ;
117
+ }
118
+
119
+ // Return the latest navigated frame from the given outlet branch.
120
+ private getLatestFrameByOutlet ( rootOutlet : string ) : Frame {
121
+ let frame : Frame ;
122
+
123
+ for ( let i = this . frames . length - 1 ; i > 0 ; i -- ) {
124
+ const currentFrame = this . frames [ i ] ;
125
+
126
+ if ( currentFrame . rootOutlet === rootOutlet ) {
127
+ frame = currentFrame . frame ;
128
+ break ;
129
+ }
130
+ }
131
+
132
+ return frame ;
71
133
}
72
134
}
0 commit comments