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 {NavController} from '@ionic/angular';
import {Router} from '@angular/router';
import {IAuthAction} from 'ionic-appauth';
import {AuthActions, IAuthAction} from 'ionic-appauth';
import {Subscription} from 'rxjs';
import {DefaultAuthService} from '../../default-auth.service';
import {AuthHelperService} from '../../auth-helper.service';
@Component({
selector: 'auth-callback',
@@ -17,6 +18,7 @@ export class AuthCallbackPageComponent implements OnInit, OnDestroy {
private auth: DefaultAuthService,
private navCtrl: NavController,
private router: Router,
private authHelper: AuthHelperService,
) {}
ngOnInit() {
@@ -28,7 +30,14 @@ export class AuthCallbackPageComponent implements OnInit, OnDestroy {
this.sub.unsubscribe();
}
async postCallback(_action: IAuthAction) {
await this.navCtrl.navigateRoot('profile');
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');
}
}
}

View File

@@ -1,5 +1,10 @@
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 {PAIAAuthService} from './paia/paia-auth.service';
import {IAuthService} from 'ionic-appauth';
@@ -33,7 +38,14 @@ export class AuthGuardService implements CanActivate {
try {
await this.authService.getValidToken();
} 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;
}

View File

@@ -11,6 +11,8 @@ import {
SCUserConfigurationMap,
} from '@openstapps/core';
import {ConfigProvider} from '../config/config.provider';
import {StorageProvider} from '../storage/storage.provider';
const AUTH_ORIGIN_PATH = 'stapps.auth.origin_path';
@Injectable({
providedIn: 'root',
@@ -21,6 +23,7 @@ export class AuthHelperService {
constructor(
private translateService: TranslateService,
private configProvider: ConfigProvider,
private storageProvider: StorageProvider,
) {
this.userConfigurationMap = (
this.configProvider.getAnyValue('auth') as {
@@ -62,4 +65,22 @@ export class AuthHelperService {
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 {NavController} from '@ionic/angular';
import {Router} from '@angular/router';
import {IAuthAction} from 'ionic-appauth';
import {AuthActions, IAuthAction} from 'ionic-appauth';
import {Subscription} from 'rxjs';
import {PAIAAuthService} from '../../paia-auth.service';
import {AuthHelperService} from '../../../auth-helper.service';
@Component({
selector: 'auth-callback',
@@ -17,6 +18,7 @@ export class PAIAAuthCallbackPageComponent implements OnInit, OnDestroy {
private auth: PAIAAuthService,
private navCtrl: NavController,
private router: Router,
private authHelper: AuthHelperService,
) {}
ngOnInit() {
@@ -28,7 +30,14 @@ export class PAIAAuthCallbackPageComponent implements OnInit, OnDestroy {
this.sub.unsubscribe();
}
async postCallback(_action: IAuthAction) {
this.navCtrl.navigateRoot('profile');
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');
}
}
}

View File

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