import { Injectable } from '@angular/core'; import * as jwt_decode from 'jwt-decode'; import { BehaviorSubject } from 'rxjs'; import { TOKEN_DURATION } from './global.const'; import { Utils } from './utils'; declare var Keycloak: any; declare let CONFIG: any; // @dynamic @Injectable({ providedIn: 'root', }) export class KeycloakService { private keycloakSetup = new BehaviorSubject(false); private refreshToken = new BehaviorSubject(false); static keycloak; keycloakConfig: any; cast = this.keycloakSetup.asObservable(); refreshTokenCast = this.refreshToken.asObservable(); static getKeycloak() { return KeycloakService.keycloak || this; } init() { this.keycloakConfig = new Keycloak(CONFIG.KEYCLOAK); KeycloakService.keycloak = this; this.keycloakConfig .init({ onLoad: 'login-required', checkLoginIframe: false }) .then(() => { this.keycloakInitialised(); this.saveToken(); KeycloakService.keycloak = this; }) .catch(error => { Utils.showError('keycloak.init()', error); }); } keycloakInitialised() { // notify the keycloak initialisation completion this.keycloakSetup.next(true); } saveToken(): void { if (this.keycloakConfig.token) { if (!localStorage.getItem('espToken')) { setTimeout(()=> window.location.reload(), 1000); } localStorage.setItem('espToken', this.keycloakConfig.token); this.getUserDetail(); } } getToken(): string { return this.keycloakConfig.token ? this.keycloakConfig.token : ''; } updateToken() { if (this.keycloakConfig.updateToken) { return this.keycloakConfig.updateToken(TOKEN_DURATION); } else { window.location.reload(); } } getUserDetail(): any { const userDetail = this.keycloakConfig ? jwt_decode(this.keycloakConfig.token) : null; localStorage.setItem('user-detail', JSON.stringify(userDetail)); return userDetail; } login() { if (this.keycloakConfig) { this.keycloakConfig.login(); } } logout() { localStorage.clear(); this.keycloakConfig.logout({ redirectUrl: CONFIG.BASE_URL }); this.keycloakConfig = null; } } export function kcFactory(keycloakService: KeycloakService) { return () => setTimeout(() => keycloakService.init(), 1000); }