feat: resume at origin path after login

Closes #168
This commit is contained in:
Jovan Krunić
2022-02-11 15:19:37 +01:00
parent 19b36c07b7
commit a5e5a5b407
5 changed files with 78 additions and 12 deletions

View File

@@ -1,9 +1,10 @@
import {Component, OnInit, OnDestroy} from '@angular/core'; import {Component, OnInit, OnDestroy} from '@angular/core';
import {NavController} from '@ionic/angular'; import {NavController} from '@ionic/angular';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
import {IAuthAction} from 'ionic-appauth'; import {AuthActions, IAuthAction} from 'ionic-appauth';
import {Subscription} from 'rxjs'; import {Subscription} from 'rxjs';
import {DefaultAuthService} from '../../default-auth.service'; import {DefaultAuthService} from '../../default-auth.service';
import {AuthHelperService} from '../../auth-helper.service';
@Component({ @Component({
selector: 'auth-callback', selector: 'auth-callback',
@@ -17,6 +18,7 @@ export class AuthCallbackPageComponent implements OnInit, OnDestroy {
private auth: DefaultAuthService, private auth: DefaultAuthService,
private navCtrl: NavController, private navCtrl: NavController,
private router: Router, private router: Router,
private authHelper: AuthHelperService,
) {} ) {}
ngOnInit() { ngOnInit() {
@@ -28,7 +30,14 @@ export class AuthCallbackPageComponent implements OnInit, OnDestroy {
this.sub.unsubscribe(); this.sub.unsubscribe();
} }
async postCallback(_action: IAuthAction) { async postCallback(action: IAuthAction) {
await this.navCtrl.navigateRoot('profile'); if (action.action === AuthActions.SignInSuccess) {
const originPath = await this.authHelper.getOriginPath();
this.navCtrl.navigateRoot(originPath ?? 'profile');
this.authHelper.deleteOriginPath();
}
if (action.action === AuthActions.SignInFailed) {
this.navCtrl.navigateRoot('profile');
}
} }
} }

View File

@@ -1,5 +1,10 @@
import {Injectable} from '@angular/core'; import {Injectable} from '@angular/core';
import {CanActivate, Router, RouterStateSnapshot} from '@angular/router'; import {
CanActivate,
NavigationExtras,
Router,
RouterStateSnapshot,
} from '@angular/router';
import {DefaultAuthService} from './default-auth.service'; import {DefaultAuthService} from './default-auth.service';
import {PAIAAuthService} from './paia/paia-auth.service'; import {PAIAAuthService} from './paia/paia-auth.service';
import {IAuthService} from 'ionic-appauth'; import {IAuthService} from 'ionic-appauth';
@@ -33,7 +38,14 @@ export class AuthGuardService implements CanActivate {
try { try {
await this.authService.getValidToken(); await this.authService.getValidToken();
} catch { } catch {
this.router.navigate(['profile']); const originNavigation = this.router.getCurrentNavigation();
let extras: NavigationExtras = {};
if (originNavigation) {
const url = originNavigation.extractedUrl.toString();
extras = {queryParams: {origin_path: url}};
}
this.router.navigate(['profile'], extras);
return false; return false;
} }

View File

@@ -11,6 +11,8 @@ import {
SCUserConfigurationMap, SCUserConfigurationMap,
} from '@openstapps/core'; } from '@openstapps/core';
import {ConfigProvider} from '../config/config.provider'; import {ConfigProvider} from '../config/config.provider';
import {StorageProvider} from '../storage/storage.provider';
const AUTH_ORIGIN_PATH = 'stapps.auth.origin_path';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
@@ -21,6 +23,7 @@ export class AuthHelperService {
constructor( constructor(
private translateService: TranslateService, private translateService: TranslateService,
private configProvider: ConfigProvider, private configProvider: ConfigProvider,
private storageProvider: StorageProvider,
) { ) {
this.userConfigurationMap = ( this.userConfigurationMap = (
this.configProvider.getAnyValue('auth') as { this.configProvider.getAnyValue('auth') as {
@@ -62,4 +65,22 @@ export class AuthHelperService {
return user; return user;
} }
async deleteOriginPath() {
return this.storageProvider.delete(AUTH_ORIGIN_PATH);
}
async setOriginPath(path: string) {
return this.storageProvider.put<string>(AUTH_ORIGIN_PATH, path);
}
async getOriginPath() {
let originPath: string;
try {
originPath = await this.storageProvider.get<string>(AUTH_ORIGIN_PATH);
} catch {
return;
}
return originPath;
}
} }

View File

@@ -1,9 +1,10 @@
import {Component, OnInit, OnDestroy} from '@angular/core'; import {Component, OnInit, OnDestroy} from '@angular/core';
import {NavController} from '@ionic/angular'; import {NavController} from '@ionic/angular';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
import {IAuthAction} from 'ionic-appauth'; import {AuthActions, IAuthAction} from 'ionic-appauth';
import {Subscription} from 'rxjs'; import {Subscription} from 'rxjs';
import {PAIAAuthService} from '../../paia-auth.service'; import {PAIAAuthService} from '../../paia-auth.service';
import {AuthHelperService} from '../../../auth-helper.service';
@Component({ @Component({
selector: 'auth-callback', selector: 'auth-callback',
@@ -17,6 +18,7 @@ export class PAIAAuthCallbackPageComponent implements OnInit, OnDestroy {
private auth: PAIAAuthService, private auth: PAIAAuthService,
private navCtrl: NavController, private navCtrl: NavController,
private router: Router, private router: Router,
private authHelper: AuthHelperService,
) {} ) {}
ngOnInit() { ngOnInit() {
@@ -28,7 +30,14 @@ export class PAIAAuthCallbackPageComponent implements OnInit, OnDestroy {
this.sub.unsubscribe(); this.sub.unsubscribe();
} }
async postCallback(_action: IAuthAction) { async postCallback(action: IAuthAction) {
if (action.action === AuthActions.SignInSuccess) {
const originPath = await this.authHelper.getOriginPath();
this.navCtrl.navigateRoot(originPath ?? 'profile');
this.authHelper.deleteOriginPath();
}
if (action.action === AuthActions.SignInFailed) {
this.navCtrl.navigateRoot('profile'); this.navCtrl.navigateRoot('profile');
} }
} }
}

View File

@@ -24,6 +24,7 @@ import {
SCAuthorizationProviderType, SCAuthorizationProviderType,
SCUserConfiguration, SCUserConfiguration,
} from '@openstapps/core'; } from '@openstapps/core';
import {ActivatedRoute} from '@angular/router';
@Component({ @Component({
selector: 'app-home', selector: 'app-home',
@@ -36,6 +37,8 @@ export class ProfilePageComponent implements OnInit, OnDestroy {
paia: {loggedIn: false}, paia: {loggedIn: false},
}; };
originPath: string | null;
userInfo?: SCUserConfiguration; userInfo?: SCUserConfiguration;
subscriptions: Subscription[] = []; subscriptions: Subscription[] = [];
@@ -44,7 +47,8 @@ export class ProfilePageComponent implements OnInit, OnDestroy {
private defaultAuth: DefaultAuthService, private defaultAuth: DefaultAuthService,
private paiaAuth: PAIAAuthService, private paiaAuth: PAIAAuthService,
private requestor: Requestor, private requestor: Requestor,
private authHelperService: AuthHelperService, private authHelper: AuthHelperService,
private route: ActivatedRoute,
) {} ) {}
ngOnInit() { ngOnInit() {
@@ -70,6 +74,9 @@ export class ProfilePageComponent implements OnInit, OnDestroy {
this.data.paia.loggedIn = false; this.data.paia.loggedIn = false;
}); });
}), }),
this.route.queryParamMap.subscribe(queryParams => {
this.originPath = queryParams.get('origin_path');
}),
); );
} }
@@ -79,15 +86,17 @@ export class ProfilePageComponent implements OnInit, OnDestroy {
userInfoHandler userInfoHandler
.performUserInfoRequest(this.defaultAuth.localConfiguration, token) .performUserInfoRequest(this.defaultAuth.localConfiguration, token)
.then(userInfo => { .then(userInfo => {
this.userInfo = this.authHelperService.getUserFromUserInfo(userInfo); this.userInfo = this.authHelper.getUserFromUserInfo(userInfo);
}); });
} }
public signIn() { async signIn() {
await this.handleOriginPath();
this.defaultAuth.signIn(); this.defaultAuth.signIn();
} }
signInPAIA() { async signInPAIA() {
await this.handleOriginPath();
this.paiaAuth.signIn(); this.paiaAuth.signIn();
} }
@@ -105,4 +114,10 @@ export class ProfilePageComponent implements OnInit, OnDestroy {
subscription.unsubscribe(); subscription.unsubscribe();
} }
} }
private async handleOriginPath() {
this.originPath
? await this.authHelper.setOriginPath(this.originPath)
: await this.authHelper.deleteOriginPath();
}
} }