import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { BehaviorSubject, Observable } from 'rxjs'; export interface UserDetails { _id: string; email: string; fullName: string; languaje: string; keepsession: boolean; exp: number; iat: number; } export interface TokenPayload { email: string; password: string; } @Injectable({ providedIn: 'root' }) export class AuthenticationService { private token: string; private loginStatus: BehaviorSubject = new BehaviorSubject(null); public loginStatus$: Observable = this.loginStatus.asObservable(); constructor(private router: Router) {} updateLoginStatus(loginstatus) { this.loginStatus.next(loginstatus); } public saveToken(token: string): void { let payload; payload = token.split('.')[1]; payload = window.atob(payload); payload = JSON.parse(payload); if (payload.keepsession) { localStorage.setItem('admin-token', token); sessionStorage.removeItem('admin-token'); } else { sessionStorage.setItem('admin-token', token); localStorage.removeItem('admin-token'); } this.token = token; this.updateLoginStatus(true); } public getToken(): string { if (!this.token) { this.token = localStorage.getItem('admin-token'); if (!this.token) { this.token = sessionStorage.getItem('admin-token'); } } return this.token; } public logout(): void { this.updateLoginStatus(false); this.token = ''; localStorage.removeItem('admin-token'); sessionStorage.removeItem('admin-token'); this.router.navigateByUrl('/main/welcome'); } public getUserDetails(): UserDetails { const token = this.getToken(); let payload; if (token) { payload = token.split('.')[1]; payload = window.atob(payload); return JSON.parse(payload); } else { return null; } } public isLoggedIn(): boolean { const user = this.getUserDetails(); if (user) { if (user.exp > Date.now() / 1000) { this.updateLoginStatus(true); return true; } else { this.updateLoginStatus(false); return false; } } else { this.updateLoginStatus(false); return false; } } }