forked from CIT/Vmeda.Online
		
	MOBILE-2302 core: Implement redirect to another page/site
This commit is contained in:
		
							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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user