Skip to content

Commit d2b3395

Browse files
ADjenkovADjenkov
ADjenkov
authored and
ADjenkov
committed
feat(frame-service): extend FrameService to provide reusable frames
FrameServices should be responsible for delivering the correct topmost frame too
1 parent dc8080b commit d2b3395

File tree

1 file changed

+63
-1
lines changed

1 file changed

+63
-1
lines changed

Diff for: nativescript-angular/platform-providers.ts

+63-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,69 @@ export const defaultPageFactoryProvider = { provide: PAGE_FACTORY, useValue: def
6666
@Injectable()
6767
export class FrameService {
6868
// 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
6975
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;
71133
}
72134
}

0 commit comments

Comments
 (0)