Skip to content

Commit 0a6bb3b

Browse files
soumak77kensodemann
authored andcommitted
fix(navigation): check existence of done transition callback (#12640)
1 parent 1b9c3da commit 0a6bb3b

File tree

6 files changed

+47
-35
lines changed

6 files changed

+47
-35
lines changed

src/components/tabs/tab.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { GestureController } from '../../gestures/gesture-controller';
88
import { isTrueProperty } from '../../util/util';
99
import { Tab as ITab } from '../../navigation/nav-interfaces';
1010
import { NavControllerBase } from '../../navigation/nav-controller-base';
11-
import { NavOptions } from '../../navigation/nav-util';
11+
import { NavOptions, TransitionDoneFn } from '../../navigation/nav-util';
1212
import { Platform } from '../../platform/platform';
1313
import { TabButton } from './tab-button';
1414
import { Tabs } from './tabs';
@@ -304,7 +304,7 @@ export class Tab extends NavControllerBase implements ITab {
304304
/**
305305
* @hidden
306306
*/
307-
load(opts: NavOptions, done?: () => void) {
307+
load(opts: NavOptions, done?: TransitionDoneFn) {
308308
if (this._lazyRootFromUrl || (!this._loaded && this.root)) {
309309
this.setElementClass('show-tab', true);
310310
// okay, first thing we need to do if check if the view already exists
@@ -317,7 +317,10 @@ export class Tab extends NavControllerBase implements ITab {
317317
if (i === numViews) {
318318
// this is the last view in the stack and it's the same
319319
// as the segment so there's no change needed
320-
return done();
320+
if (done) {
321+
done(false, false);
322+
}
323+
return;
321324
} else {
322325
// it's not the exact view as the end
323326
// let's have this nav go back to this exact view
@@ -343,7 +346,10 @@ export class Tab extends NavControllerBase implements ITab {
343346
this._dom.read(() => {
344347
this.resize();
345348
});
346-
return done();
349+
if (done) {
350+
done(false, false);
351+
}
352+
return;
347353
}
348354
}
349355

src/navigation/deep-linker.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ComponentFactory, ComponentFactoryResolver } from '@angular/core';
22
import { Location } from '@angular/common';
33

44
import { App } from '../components/app/app';
5-
import { DIRECTION_BACK, NavLink, NavSegment, convertToViews, isNav, isTab, isTabs, } from './nav-util';
5+
import { DIRECTION_BACK, NavLink, NavSegment, TransitionDoneFn, convertToViews, isNav, isTab, isTabs } from './nav-util';
66
import { ModuleLoader } from '../util/module-loader';
77
import { isArray, isPresent } from '../util/util';
88
import { Tab, Tabs } from './nav-interfaces';
@@ -380,9 +380,9 @@ export class DeepLinker {
380380
*
381381
* @internal
382382
*/
383-
_loadViewForSegment(navContainer: NavigationContainer, segment: NavSegment, done: Function) {
383+
_loadViewForSegment(navContainer: NavigationContainer, segment: NavSegment, done: TransitionDoneFn) {
384384
if (!segment) {
385-
return done();
385+
return done(false, false);
386386
}
387387

388388
if (isTabs(navContainer) || (isTab(navContainer) && navContainer.parent)) {
@@ -395,7 +395,7 @@ export class DeepLinker {
395395
updateUrl: false,
396396
animate: false
397397
}, true);
398-
return done();
398+
return done(false, false);
399399
}
400400

401401
const navController = <NavController> <any> navContainer;
@@ -410,7 +410,7 @@ export class DeepLinker {
410410
if (i === numViews) {
411411
// this is the last view in the stack and it's the same
412412
// as the segment so there's no change needed
413-
return done();
413+
return done(false, false);
414414
} else {
415415
// it's not the exact view as the end
416416
// let's have this nav go back to this exact view

src/navigation/nav-controller-base.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
STATE_DESTROYED,
2525
STATE_INITIALIZED,
2626
STATE_NEW,
27+
TransitionDoneFn,
2728
TransitionInstruction,
2829
convertToViews,
2930
} from './nav-util';
@@ -106,39 +107,39 @@ export class NavControllerBase extends Ion implements NavController {
106107
this._destroyed = false;
107108
}
108109

109-
push(page: any, params?: any, opts?: NavOptions, done?: () => void): Promise<any> {
110+
push(page: any, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
110111
return this._queueTrns({
111112
insertStart: -1,
112113
insertViews: [{ page: page, params: params }],
113114
opts: opts,
114115
}, done);
115116
}
116117

117-
insert(insertIndex: number, page: any, params?: any, opts?: NavOptions, done?: () => void): Promise<any> {
118+
insert(insertIndex: number, page: any, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
118119
return this._queueTrns({
119120
insertStart: insertIndex,
120121
insertViews: [{ page: page, params: params }],
121122
opts: opts,
122123
}, done);
123124
}
124125

125-
insertPages(insertIndex: number, insertPages: any[], opts?: NavOptions, done?: () => void): Promise<any> {
126+
insertPages(insertIndex: number, insertPages: any[], opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
126127
return this._queueTrns({
127128
insertStart: insertIndex,
128129
insertViews: insertPages,
129130
opts: opts,
130131
}, done);
131132
}
132133

133-
pop(opts?: NavOptions, done?: () => void): Promise<any> {
134+
pop(opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
134135
return this._queueTrns({
135136
removeStart: -1,
136137
removeCount: 1,
137138
opts: opts,
138139
}, done);
139140
}
140141

141-
popTo(indexOrViewCtrl: any, opts?: NavOptions, done?: () => void): Promise<any> {
142+
popTo(indexOrViewCtrl: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
142143
let config: TransitionInstruction = {
143144
removeStart: -1,
144145
removeCount: -1,
@@ -153,7 +154,7 @@ export class NavControllerBase extends Ion implements NavController {
153154
return this._queueTrns(config, done);
154155
}
155156

156-
popToRoot(opts?: NavOptions, done?: () => void): Promise<any> {
157+
popToRoot(opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
157158
return this._queueTrns({
158159
removeStart: 1,
159160
removeCount: -1,
@@ -169,15 +170,15 @@ export class NavControllerBase extends Ion implements NavController {
169170
return Promise.all(promises);
170171
}
171172

172-
remove(startIndex: number, removeCount: number = 1, opts?: NavOptions, done?: () => void): Promise<any> {
173+
remove(startIndex: number, removeCount: number = 1, opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
173174
return this._queueTrns({
174175
removeStart: startIndex,
175176
removeCount: removeCount,
176177
opts: opts,
177178
}, done);
178179
}
179180

180-
removeView(viewController: ViewController, opts?: NavOptions, done?: () => void): Promise<any> {
181+
removeView(viewController: ViewController, opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
181182
return this._queueTrns({
182183
removeView: viewController,
183184
removeStart: 0,
@@ -186,12 +187,12 @@ export class NavControllerBase extends Ion implements NavController {
186187
}, done);
187188
}
188189

189-
setRoot(pageOrViewCtrl: any, params?: any, opts?: NavOptions, done?: () => void): Promise<any> {
190+
setRoot(pageOrViewCtrl: any, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
190191
return this.setPages([{ page: pageOrViewCtrl, params: params }], opts, done);
191192
}
192193

193194

194-
setPages(viewControllers: any[], opts?: NavOptions, done?: () => void): Promise<any> {
195+
setPages(viewControllers: any[], opts?: NavOptions, done?: TransitionDoneFn): Promise<any> {
195196
if (isBlank(opts)) {
196197
opts = {};
197198
}
@@ -218,7 +219,7 @@ export class NavControllerBase extends Ion implements NavController {
218219
// 7. _transitionStart(): called once the transition actually starts, it initializes the Animation underneath.
219220
// 8. _transitionFinish(): called once the transition finishes
220221
// 9. _cleanup(): syncs the navigation internal state with the DOM. For example it removes the pages from the DOM or hides/show them.
221-
_queueTrns(ti: TransitionInstruction, done: () => void): Promise<boolean> {
222+
_queueTrns(ti: TransitionInstruction, done: TransitionDoneFn): Promise<boolean> {
222223
const promise = new Promise<boolean>((resolve, reject) => {
223224
ti.resolve = resolve;
224225
ti.reject = reject;

src/navigation/nav-controller.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { EventEmitter } from '@angular/core';
22

33
import { Config } from '../config/config';
4-
import { NavOptions } from './nav-util';
4+
import { NavOptions, TransitionDoneFn } from './nav-util';
55
import { Page } from './nav-util';
66
import { ViewController } from './view-controller';
77
import { NavigationContainer } from './navigation-container';
@@ -420,7 +420,7 @@ export abstract class NavController implements NavigationContainer {
420420
* @param {object} [opts={}] Nav options to go with this transition.
421421
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
422422
*/
423-
abstract push(page: Page | string, params?: any, opts?: NavOptions, done?: Function): Promise<any>;
423+
abstract push(page: Page | string, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
424424

425425
/**
426426
* Inserts a component into the nav stack at the specified index. This is useful if
@@ -433,7 +433,7 @@ export abstract class NavController implements NavigationContainer {
433433
* @param {object} [opts={}] Nav options to go with this transition.
434434
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
435435
*/
436-
abstract insert(insertIndex: number, page: Page | string, params?: any, opts?: NavOptions, done?: Function): Promise<any>;
436+
abstract insert(insertIndex: number, page: Page | string, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
437437

438438
/**
439439
* Inserts an array of components into the nav stack at the specified index.
@@ -445,7 +445,7 @@ export abstract class NavController implements NavigationContainer {
445445
* @param {object} [opts={}] Nav options to go with this transition.
446446
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
447447
*/
448-
abstract insertPages(insertIndex: number, insertPages: Array<{page: Page | string, params?: any}>, opts?: NavOptions, done?: Function): Promise<any>;
448+
abstract insertPages(insertIndex: number, insertPages: Array<{page: Page | string, params?: any}>, opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
449449

450450
/**
451451
* Call to navigate back from a current component. Similar to `push()`, you
@@ -454,15 +454,15 @@ export abstract class NavController implements NavigationContainer {
454454
* @param {object} [opts={}] Nav options to go with this transition.
455455
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
456456
*/
457-
abstract pop(opts?: NavOptions, done?: Function): Promise<any>;
457+
abstract pop(opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
458458

459459
/**
460460
* Navigate back to the root of the stack, no matter how far back that is.
461461
*
462462
* @param {object} [opts={}] Nav options to go with this transition.
463463
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
464464
*/
465-
abstract popToRoot(opts?: NavOptions, done?: Function): Promise<any>;
465+
abstract popToRoot(opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
466466

467467
/**
468468
* @hidden
@@ -479,7 +479,7 @@ export abstract class NavController implements NavigationContainer {
479479
* @param {object} [opts={}] Nav options to go with this transition.
480480
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
481481
*/
482-
abstract popTo(page: Page | string | ViewController, params?: any, opts?: NavOptions, done?: Function): Promise<any>;
482+
abstract popTo(page: Page | string | ViewController, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
483483

484484
/**
485485
* @hidden
@@ -497,7 +497,7 @@ export abstract class NavController implements NavigationContainer {
497497
* @param {object} [opts={}] Any options you want to use pass to transtion.
498498
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
499499
*/
500-
abstract remove(startIndex: number, removeCount?: number, opts?: NavOptions, done?: Function): Promise<any>;
500+
abstract remove(startIndex: number, removeCount?: number, opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
501501

502502
/**
503503
* Removes the specified view controller from the nav stack.
@@ -506,7 +506,7 @@ export abstract class NavController implements NavigationContainer {
506506
* @param {object} [opts={}] Any options you want to use pass to transtion.
507507
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
508508
*/
509-
abstract removeView(viewController: ViewController, opts?: NavOptions, done?: Function): Promise<any>;
509+
abstract removeView(viewController: ViewController, opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
510510

511511
/**
512512
* Set the root for the current navigation stack.
@@ -516,7 +516,7 @@ export abstract class NavController implements NavigationContainer {
516516
* @param {Function} done Callback function on done.
517517
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
518518
*/
519-
abstract setRoot(pageOrViewCtrl: Page | string | ViewController, params?: any, opts?: NavOptions, done?: Function): Promise<any>;
519+
abstract setRoot(pageOrViewCtrl: Page | string | ViewController, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
520520
abstract goToRoot(options: NavOptions): Promise<any>;
521521

522522
/**
@@ -529,7 +529,7 @@ export abstract class NavController implements NavigationContainer {
529529
* @param {Object} [opts={}] Nav options to go with this transition.
530530
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
531531
*/
532-
abstract setPages(pages: ({page: Page | string, params?: any} | ViewController)[], opts?: NavOptions, done?: Function): Promise<any>;
532+
abstract setPages(pages: ({page: Page | string, params?: any} | ViewController)[], opts?: NavOptions, done?: TransitionDoneFn): Promise<any>;
533533

534534
/**
535535
* @param {number} index The index of the page to get.

src/navigation/nav-util.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,10 @@ export interface TransitionRejectFn {
221221
(rejectReason: any, transition?: Transition): void;
222222
}
223223

224+
export interface TransitionDoneFn {
225+
(hasCompleted: boolean, requiresTransition: boolean, enteringName?: string, leavingName?: string, direction?: string): void;
226+
}
227+
224228
export interface TransitionInstruction {
225229
opts: NavOptions;
226230
insertStart?: number;
@@ -230,7 +234,7 @@ export interface TransitionInstruction {
230234
removeCount?: number;
231235
resolve?: (hasCompleted: boolean) => void;
232236
reject?: (rejectReason: string) => void;
233-
done?: Function;
237+
done?: TransitionDoneFn;
234238
leavingRequiresTransition?: boolean;
235239
enteringRequiresTransition?: boolean;
236240
requiresTransition?: boolean;

src/util/mock-providers.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { GestureController } from '../gestures/gesture-controller';
1111
import { Haptic } from '../tap-click/haptic';
1212
import { IonicApp } from '../components/app/app-root';
1313
import { Menu } from '../components/menu/menu';
14-
import { NavOptions } from '../navigation/nav-util';
14+
import { NavOptions, TransitionDoneFn } from '../navigation/nav-util';
1515
import { NavControllerBase } from '../navigation/nav-controller-base';
1616
import { OverlayPortal } from '../components/app/overlay-portal';
1717
import { PageTransition } from '../transitions/page-transition';
@@ -501,8 +501,9 @@ export function mockTab(parentTabs: Tabs, overrideLoad: boolean = true): Tab {
501501
);
502502

503503
if (overrideLoad) {
504-
tab.load = (_opts: any, cb: Function) => {
505-
cb();
504+
tab.load = (_opts: any, cb: TransitionDoneFn) => {
505+
cb(false, false);
506+
return Promise.resolve();
506507
};
507508
}
508509

0 commit comments

Comments
 (0)