diff --git a/packages/core/src/components/nav/nav.tsx b/packages/core/src/components/nav/nav.tsx index f63c7b598c..77ab2029a2 100644 --- a/packages/core/src/components/nav/nav.tsx +++ b/packages/core/src/components/nav/nav.tsx @@ -264,6 +264,11 @@ export class Nav implements PublicNav, NavOutlet { return reconcileFromExternalRouterImpl(this, component, data, escapeHatch, isTopLevel); } + @Method() + activateFromTab() { + return activateFromTabImpl(this); + } + canSwipeBack(): boolean { return (this.swipeBackEnabled && // this.childNavs.length === 0 && @@ -617,23 +622,25 @@ export function isUrl(component: any): boolean { return typeof component === 'string' && component.charAt(0) === '/'; } -export function navigateToUrl(nav: Nav, url: string, method: string): Promise { - let routingPromise: Promise = null; - return new Promise((resolve, reject) => { - nav.urlExternalNavMap.set(url, { - url, - method, - resolve, - reject - }); - if (!nav.routerDelegate) { - nav.routerDelegate = new DomRouterDelegate(); +export function navigateToUrl(nav: Nav, url: string, _method: string): Promise { + if (!nav.routerDelegate) { + nav.routerDelegate = new DomRouterDelegate(); + } + return nav.routerDelegate.pushUrlState(url); +} + +export function activateFromTabImpl(nav: Nav): Promise { + return nav.onAllTransitionsComplete().then(() => { + // if there is not a view set and it's not transitioning, + // go ahead and set the root + if (nav.getViews().length === 0 && !nav.isTransitioning()) { + return nav.setRoot(nav.root); } - routingPromise = nav.routerDelegate.pushUrlState(url); - }).then((navResult: NavResult) => { - return routingPromise.then(() => { - return navResult; - }); + + // okay, we have a view here, and it's almost certainly the correct view + // so what we need to do is update the browsers url to match what's in the top view + const viewController = nav.getActive() as ViewController; + return viewController && viewController.url ? navigateToUrl(nav, viewController.url, null) : Promise.resolve(); }); } diff --git a/packages/core/src/components/nav/readme.md b/packages/core/src/components/nav/readme.md index fbe58fc7fe..52aa34c278 100644 --- a/packages/core/src/components/nav/readme.md +++ b/packages/core/src/components/nav/readme.md @@ -89,6 +89,9 @@ boolean ## Methods +#### activateFromTab() + + #### canGoBack() diff --git a/packages/core/src/components/tab/tab.tsx b/packages/core/src/components/tab/tab.tsx index 664c117a0d..b21a74103d 100644 --- a/packages/core/src/components/tab/tab.tsx +++ b/packages/core/src/components/tab/tab.tsx @@ -126,13 +126,7 @@ export class Tab { // the tab's nav has not been initialized externally, so // check if we need to initiailize it return nav.componentOnReady() - .then(() => nav.onAllTransitionsComplete()) - .then(() => { - if (nav.getViews().length === 0 && !nav.isTransitioning() && !nav.initialized) { - return nav.setRoot(nav.root); - } - return Promise.resolve(); - }); + .then(() => nav.activateFromTab()); }); }