refactor(navigation): update nav, tabs and types to use interfaces more

This commit is contained in:
Dan Bucholtz
2017-11-22 15:40:38 -06:00
parent 956ec9ce2d
commit 2e2c9008af
6 changed files with 27 additions and 21 deletions

View File

@ -1,6 +1,6 @@
/* it is very important to keep this interface in sync with ./nav */ /* it is very important to keep this interface in sync with ./nav */
import { NavOptions, ViewController } from '../../index'; import { NavOptions, PublicViewController } from '../../index';
export interface PublicNav { export interface PublicNav {
push(component: any, data?: any, opts?: NavOptions): Promise<any>; push(component: any, data?: any, opts?: NavOptions): Promise<any>;
@ -11,14 +11,14 @@ export interface PublicNav {
popToRoot(opts?: NavOptions): Promise<any>; popToRoot(opts?: NavOptions): Promise<any>;
popTo(indexOrViewCtrl: any, opts?: NavOptions): Promise<any>; popTo(indexOrViewCtrl: any, opts?: NavOptions): Promise<any>;
removeIndex(startIndex: number, removeCount?: number, opts?: NavOptions): Promise<any>; removeIndex(startIndex: number, removeCount?: number, opts?: NavOptions): Promise<any>;
removeView(viewController: ViewController, opts?: NavOptions): Promise<any>; removeView(viewController: PublicViewController, opts?: NavOptions): Promise<any>;
setPages(componentDataPairs: any[], opts?: NavOptions): Promise<any>; setPages(componentDataPairs: any[], opts?: NavOptions): Promise<any>;
getActive?(): ViewController; getActive?(): PublicViewController;
getPrevious?(view?: ViewController): ViewController; getPrevious?(view?: PublicViewController): PublicViewController;
canGoBack?(nav: PublicNav): boolean; canGoBack?(): boolean;
canSwipeBack?(): boolean; canSwipeBack?(): boolean;
getFirstView?(): ViewController; getFirstView?(): PublicViewController;
element?: HTMLElement; element?: HTMLElement;
} }

View File

@ -7,6 +7,7 @@ import {
NavOptions, NavOptions,
NavState, NavState,
PublicNav, PublicNav,
PublicViewController,
RouterEntries, RouterEntries,
RouterEntry, RouterEntry,
ViewController ViewController
@ -79,7 +80,7 @@ export class Nav implements PublicNav {
} }
} }
getViews(): ViewController[] { getViews(): PublicViewController[] {
return getViews(this); return getViews(this);
} }
@ -124,7 +125,7 @@ export class Nav implements PublicNav {
} }
@Method() @Method()
removeView(viewController: ViewController, opts?: NavOptions): Promise<any> { removeView(viewController: PublicViewController, opts?: NavOptions): Promise<any> {
return removeViewImpl(this, viewController, opts); return removeViewImpl(this, viewController, opts);
} }
@ -134,18 +135,18 @@ export class Nav implements PublicNav {
} }
@Method() @Method()
getActive(): ViewController { getActive(): PublicViewController {
return getActiveImpl(this); return getActiveImpl(this);
} }
@Method() @Method()
getPrevious(view?: ViewController): ViewController { getPrevious(view?: PublicViewController): PublicViewController {
return getPreviousImpl(this, view); return getPreviousImpl(this, view as ViewController);
} }
@Method() @Method()
canGoBack(nav: Nav): boolean { canGoBack(): boolean {
return nav.views && nav.views.length > 0; return canGoBackImpl(this);
} }
@Method() @Method()
@ -154,7 +155,7 @@ export class Nav implements PublicNav {
} }
@Method() @Method()
getFirstView(): ViewController { getFirstView(): PublicViewController {
return getFirstView(this); return getFirstView(this);
} }
@ -278,9 +279,9 @@ export function removeImpl(nav: Nav, startIndex: number, removeCount: number, op
}); });
} }
export function removeViewImpl(nav: Nav, viewController: ViewController, opts?: NavOptions) { export function removeViewImpl(nav: Nav, viewController: PublicViewController, opts?: NavOptions) {
return getNavController(nav).then(() => { return getNavController(nav).then(() => {
return nav.navController.removeView(nav, viewController, opts); return nav.navController.removeView(nav, viewController as ViewController, opts);
}); });
} }
@ -298,6 +299,10 @@ export function getNavController(nav: Nav): Promise<any> {
return isReady(nav.navController as any as HTMLElement); return isReady(nav.navController as any as HTMLElement);
} }
export function canGoBackImpl(nav: Nav) {
return nav.views && nav.views.length > 0;
}
export function navInitializedImpl(potentialParent: Nav, event: CustomEvent) { export function navInitializedImpl(potentialParent: Nav, event: CustomEvent) {
if (potentialParent.element !== event.target) { if (potentialParent.element !== event.target) {
// set the parent on the child nav that dispatched the event // set the parent on the child nav that dispatched the event

View File

@ -1,5 +1,5 @@
import { Component, Element, Event, EventEmitter, Method, Prop, PropDidChange, State } from '@stencil/core'; import { Component, Element, Event, EventEmitter, Method, Prop, PropDidChange, State } from '@stencil/core';
import { StencilElement, ViewController } from '../../index'; import { PublicViewController, StencilElement } from '../../index';
/** /**
* @name Tab * @name Tab
@ -214,7 +214,7 @@ export class Tab {
} }
@Method() @Method()
getActive(): Promise<ViewController> { getActive(): Promise<PublicViewController> {
return this.nav.then(nav => nav && nav.getActive()); return this.nav.then(nav => nav && nav.getActive());
} }

View File

@ -481,7 +481,7 @@ export function initializeViewBeforeTransition(nav: Nav, ti: TransitionInstructi
return startTransaction(ti).then(() => { return startTransaction(ti).then(() => {
const viewControllers = convertComponentToViewController(nav, ti); const viewControllers = convertComponentToViewController(nav, ti);
ti.insertViews = viewControllers; ti.insertViews = viewControllers;
leavingView = ti.nav.getActive(); leavingView = ti.nav.getActive() as ViewController;
enteringView = getEnteringView(ti, ti.nav, leavingView); enteringView = getEnteringView(ti, ti.nav, leavingView);
if (!leavingView && !enteringView) { if (!leavingView && !enteringView) {

View File

@ -88,6 +88,7 @@ export interface TransitionBuilder {
} }
export interface PublicViewController { export interface PublicViewController {
id?: string;
component?: any; component?: any;
instance?: any; instance?: any;
element?: HTMLElement; element?: HTMLElement;

View File

@ -40,7 +40,7 @@ export function setZIndex(nav: Nav, enteringView: ViewController, leavingView: V
return; return;
} }
leavingView = leavingView || nav.getPrevious(enteringView); leavingView = leavingView || nav.getPrevious(enteringView) as ViewController;
if (leavingView && isDef(leavingView.zIndex)) { if (leavingView && isDef(leavingView.zIndex)) {
if (direction === DIRECTION_BACK) { if (direction === DIRECTION_BACK) {
@ -176,7 +176,7 @@ export function getActiveImpl(nav: Nav): ViewController {
export function getPreviousImpl(nav: Nav, viewController: ViewController): ViewController { export function getPreviousImpl(nav: Nav, viewController: ViewController): ViewController {
if (!viewController) { if (!viewController) {
viewController = nav.getActive(); viewController = nav.getActive() as ViewController;
} }
return nav.views[nav.views.indexOf(viewController) - 1]; return nav.views[nav.views.indexOf(viewController) - 1];
} }