MOBILE-2302 core: Implement redirect to another page/site
parent
730631e153
commit
ad5365edfe
|
@ -615,6 +615,42 @@ export class CoreLoginHelperProvider {
|
||||||
return code == CoreConstants.loginSSOCode || code == CoreConstants.loginSSOInAppCode;
|
return code == CoreConstants.loginSSOCode || code == CoreConstants.loginSSOInAppCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a site and load a certain page in that site.
|
||||||
|
*
|
||||||
|
* @param {string} page Name of the page to load.
|
||||||
|
* @param {any} params Params to pass to the page.
|
||||||
|
* @param {string} siteId Site to load.
|
||||||
|
*/
|
||||||
|
protected loadSiteAndPage(page: string, params: any, siteId: string) : void {
|
||||||
|
if (siteId == CoreConstants.noSiteId) {
|
||||||
|
// Page doesn't belong to a site, just load the page.
|
||||||
|
this.navCtrl.setRoot(page, params);
|
||||||
|
} else {
|
||||||
|
let modal = this.domUtils.showModalLoading();
|
||||||
|
this.sitesProvider.loadSite(siteId).then(() => {
|
||||||
|
if (!this.isSiteLoggedOut(page, params)) {
|
||||||
|
this.loadPageInMainMenu(page, params);
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
// Site doesn't exist.
|
||||||
|
this.navCtrl.setRoot('CoreLoginSitesPage')
|
||||||
|
}).finally(() => {
|
||||||
|
modal.dismiss();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a certain page in the main menu page.
|
||||||
|
*
|
||||||
|
* @param {string} page Name of the page to load.
|
||||||
|
* @param {any} params Params to pass to the page.
|
||||||
|
*/
|
||||||
|
protected loadPageInMainMenu(page: string, params: any) : void {
|
||||||
|
this.navCtrl.setRoot('CoreMainMenuPage', {redirectPage: page, redirectParams: params})
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a browser to perform OAuth login (Google, Facebook, Microsoft).
|
* Open a browser to perform OAuth login (Google, Facebook, Microsoft).
|
||||||
*
|
*
|
||||||
|
@ -773,6 +809,41 @@ export class CoreLoginHelperProvider {
|
||||||
return loginUrl;
|
return loginUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Redirect to a new page, setting it as the root page and loading the right site if needed.
|
||||||
|
*
|
||||||
|
* @param {string} page Name of the page to load.
|
||||||
|
* @param {any} params Params to pass to the page.
|
||||||
|
* @param {string} [siteId] Site to load. If not defined, current site.
|
||||||
|
*/
|
||||||
|
redirect(page: string, params?: any, siteId?: string) : void {
|
||||||
|
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||||
|
|
||||||
|
if (this.sitesProvider.isLoggedIn()) {
|
||||||
|
if (siteId && siteId != this.sitesProvider.getCurrentSiteId()) {
|
||||||
|
// Target page belongs to a different site. Change site.
|
||||||
|
// @todo Once we have addon manager.
|
||||||
|
// if ($mmAddonManager.hasRemoteAddonsLoaded()) {
|
||||||
|
// // The site has remote addons so the app will be restarted. Store the data and logout.
|
||||||
|
// this.appProvider.storeRedirect(siteId, page, params);
|
||||||
|
// this.sitesProvider.logout();
|
||||||
|
// } else {
|
||||||
|
this.sitesProvider.logout().then(() => {
|
||||||
|
this.loadSiteAndPage(page, params, siteId);
|
||||||
|
});
|
||||||
|
// }
|
||||||
|
} else {
|
||||||
|
this.loadPageInMainMenu(page, params);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (siteId) {
|
||||||
|
this.loadSiteAndPage(page, params, siteId);
|
||||||
|
} else {
|
||||||
|
this.navCtrl.setRoot('CoreLoginSitesPage')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request a password reset.
|
* Request a password reset.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
<ion-tabs *ngIf="loaded">
|
<ion-tabs *ngIf="loaded" #mainTabs>
|
||||||
|
<ion-tab [enabled]="false" [show]="false" [root]="redirectPage" [rootParams]="redirectParams"></ion-tab>
|
||||||
<ion-tab *ngFor="let tab of tabs" [root]="tab.page" [tabTitle]="tab.title | translate" [tabIcon]="tab.icon" class="{{tab.class}}"></ion-tab>
|
<ion-tab *ngFor="let tab of tabs" [root]="tab.page" [tabTitle]="tab.title | translate" [tabIcon]="tab.icon" class="{{tab.class}}"></ion-tab>
|
||||||
</ion-tabs>
|
</ion-tabs>
|
|
@ -12,8 +12,8 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Component, OnDestroy } from '@angular/core';
|
import { Component, OnDestroy, ViewChild } from '@angular/core';
|
||||||
import { IonicPage, NavController } from 'ionic-angular';
|
import { IonicPage, NavController, NavParams, Tabs } from 'ionic-angular';
|
||||||
import { CoreEventsProvider } from '../../../../providers/events';
|
import { CoreEventsProvider } from '../../../../providers/events';
|
||||||
import { CoreSitesProvider } from '../../../../providers/sites';
|
import { CoreSitesProvider } from '../../../../providers/sites';
|
||||||
import { CoreMainMenuProvider } from '../../providers/mainmenu';
|
import { CoreMainMenuProvider } from '../../providers/mainmenu';
|
||||||
|
@ -28,8 +28,33 @@ import { CoreMainMenuDelegate, CoreMainMenuHandlerData } from '../../providers/d
|
||||||
templateUrl: 'menu.html',
|
templateUrl: 'menu.html',
|
||||||
})
|
})
|
||||||
export class CoreMainMenuPage implements OnDestroy {
|
export class CoreMainMenuPage implements OnDestroy {
|
||||||
|
// Use a setter to wait for ion-tabs to be loaded because it's inside a ngIf.
|
||||||
|
@ViewChild('mainTabs') set mainTabs(ionTabs: Tabs) {
|
||||||
|
if (ionTabs && this.redirectPage && !this.redirectPageLoaded) {
|
||||||
|
// Tabs ready and there is a redirect page set. Load it.
|
||||||
|
this.redirectPageLoaded = true;
|
||||||
|
|
||||||
|
// Check if the page is the root page of any of the tabs.
|
||||||
|
let indexToSelect = 0;
|
||||||
|
for (let i = 0; i < this.tabs.length; i++) {
|
||||||
|
if (this.tabs[i].page == this.redirectPage) {
|
||||||
|
indexToSelect = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use a setTimeout, otherwise loading the first tab opens a new state for some reason.
|
||||||
|
setTimeout(() => {
|
||||||
|
ionTabs.select(indexToSelect);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
tabs: CoreMainMenuHandlerData[] = [];
|
tabs: CoreMainMenuHandlerData[] = [];
|
||||||
loaded: boolean;
|
loaded: boolean;
|
||||||
|
redirectPage: string;
|
||||||
|
redirectParams: any;
|
||||||
|
|
||||||
protected subscription;
|
protected subscription;
|
||||||
protected moreTabData = {
|
protected moreTabData = {
|
||||||
page: 'CoreMainMenuMorePage',
|
page: 'CoreMainMenuMorePage',
|
||||||
|
@ -37,15 +62,12 @@ export class CoreMainMenuPage implements OnDestroy {
|
||||||
icon: 'more'
|
icon: 'more'
|
||||||
};
|
};
|
||||||
protected moreTabAdded = false;
|
protected moreTabAdded = false;
|
||||||
protected logoutObserver;
|
protected redirectPageLoaded = false;
|
||||||
|
|
||||||
constructor(private menuDelegate: CoreMainMenuDelegate, private sitesProvider: CoreSitesProvider,
|
constructor(private menuDelegate: CoreMainMenuDelegate, private sitesProvider: CoreSitesProvider, navParams: NavParams,
|
||||||
private navCtrl: NavController, eventsProvider: CoreEventsProvider) {
|
private navCtrl: NavController, eventsProvider: CoreEventsProvider) {
|
||||||
|
this.redirectPage = navParams.get('redirectPage');
|
||||||
// Go to sites page when user is logged out.
|
this.redirectParams = navParams.get('redirectParams');
|
||||||
this.logoutObserver = eventsProvider.on(CoreEventsProvider.LOGOUT, () => {
|
|
||||||
this.navCtrl.setRoot('CoreLoginSitesPage');
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -93,6 +115,5 @@ export class CoreMainMenuPage implements OnDestroy {
|
||||||
*/
|
*/
|
||||||
ngOnDestroy() {
|
ngOnDestroy() {
|
||||||
this.subscription && this.subscription.unsubscribe();
|
this.subscription && this.subscription.unsubscribe();
|
||||||
this.logoutObserver && this.logoutObserver.off();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue