@nakedcreativity/membrs-angular-helper 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,20 +1,16 @@
1
1
  {
2
2
  "name": "@nakedcreativity/membrs-angular-helper",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=15.0.0",
6
6
  "@angular/core": ">=15.0.0",
7
- "@uirouter/angular": "^11.x",
7
+ "@uirouter/angular": ">=11.0.0",
8
8
  "@auth0/angular-jwt": "^5.x"
9
9
  },
10
10
  "dependencies": {
11
11
  "tslib": "^2.0.0"
12
12
  },
13
- "module": "fesm2015/nakedcreativity-membrs-angular-helper.mjs",
14
- "es2020": "fesm2020/nakedcreativity-membrs-angular-helper.mjs",
15
- "esm2020": "esm2020/nakedcreativity-membrs-angular-helper.mjs",
16
- "fesm2020": "fesm2020/nakedcreativity-membrs-angular-helper.mjs",
17
- "fesm2015": "fesm2015/nakedcreativity-membrs-angular-helper.mjs",
13
+ "module": "fesm2022/nakedcreativity-membrs-angular-helper.mjs",
18
14
  "typings": "index.d.ts",
19
15
  "exports": {
20
16
  "./package.json": {
@@ -22,11 +18,9 @@
22
18
  },
23
19
  ".": {
24
20
  "types": "./index.d.ts",
25
- "esm2020": "./esm2020/nakedcreativity-membrs-angular-helper.mjs",
26
- "es2020": "./fesm2020/nakedcreativity-membrs-angular-helper.mjs",
27
- "es2015": "./fesm2015/nakedcreativity-membrs-angular-helper.mjs",
28
- "node": "./fesm2015/nakedcreativity-membrs-angular-helper.mjs",
29
- "default": "./fesm2020/nakedcreativity-membrs-angular-helper.mjs"
21
+ "esm2022": "./esm2022/nakedcreativity-membrs-angular-helper.mjs",
22
+ "esm": "./esm2022/nakedcreativity-membrs-angular-helper.mjs",
23
+ "default": "./fesm2022/nakedcreativity-membrs-angular-helper.mjs"
30
24
  }
31
25
  },
32
26
  "sideEffects": false
@@ -1,63 +0,0 @@
1
- import { Injectable } from "@angular/core";
2
- import { from, throwError } from "rxjs";
3
- import { switchMap, catchError, finalize, tap } from "rxjs/operators";
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@auth0/angular-jwt";
6
- import * as i2 from "./membrs.service";
7
- import * as i3 from "@uirouter/angular";
8
- export class TokenInterceptor {
9
- constructor(jwtHelper, membrsService, stateService) {
10
- this.jwtHelper = jwtHelper;
11
- this.membrsService = membrsService;
12
- this.stateService = stateService;
13
- }
14
- intercept(request, next) {
15
- const token = localStorage.getItem("membrs");
16
- if (token && this.jwtHelper.isTokenExpired(token)) {
17
- console.log("Token expired. Attempting to reissue.");
18
- return from(this.membrsService.reissue()).pipe(switchMap(() => {
19
- const refreshedToken = localStorage.getItem("membrs");
20
- if (refreshedToken && !this.jwtHelper.isTokenExpired(refreshedToken)) {
21
- console.log("Token successfully reissued.");
22
- request = request.clone({
23
- setHeaders: {
24
- Authorization: refreshedToken,
25
- },
26
- });
27
- }
28
- return next.handle(request);
29
- }), catchError((err) => {
30
- console.warn("Token refresh failed. Logging out.");
31
- this.membrsService.logout();
32
- this.stateService.go("");
33
- return throwError(() => err);
34
- }), finalize(() => {
35
- // this.busyService.finished()
36
- }));
37
- }
38
- if (token && !this.jwtHelper.isTokenExpired(token)) {
39
- request = request.clone({
40
- setHeaders: {
41
- Authorization: token,
42
- },
43
- });
44
- }
45
- return next.handle(request).pipe(tap((event) => {
46
- // If this is an HttpResponse, check for x-new-token header
47
- if (event && event.type === 4 && event.headers) {
48
- const newToken = event.headers.get('x-new-token');
49
- if (newToken) {
50
- localStorage.setItem('membrs', newToken);
51
- }
52
- }
53
- }), finalize(() => {
54
- // this.busyService.finished()
55
- }));
56
- }
57
- }
58
- TokenInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor, deps: [{ token: i1.JwtHelperService }, { token: i2.MembrsService }, { token: i3.StateService }], target: i0.ɵɵFactoryTarget.Injectable });
59
- TokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor });
60
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor, decorators: [{
61
- type: Injectable
62
- }], ctorParameters: function () { return [{ type: i1.JwtHelperService }, { type: i2.MembrsService }, { type: i3.StateService }]; } });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21lbWJycy9zcmMvbGliL2F1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQWMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBS3RFLE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFBb0IsU0FBMkIsRUFBVSxhQUE0QixFQUFVLFlBQTBCO1FBQXJHLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUFHLENBQUM7SUFFN0gsU0FBUyxDQUFDLE9BQXlCLEVBQUUsSUFBaUI7UUFDcEQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3QyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDckQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDNUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUNwRSxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7b0JBQzVDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO3dCQUN0QixVQUFVLEVBQUU7NEJBQ1YsYUFBYSxFQUFFLGNBQWM7eUJBQzlCO3FCQUNGLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osOEJBQThCO1lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUVELElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixhQUFhLEVBQUUsS0FBSztpQkFDckI7YUFDRixDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzlCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osMkRBQTJEO1lBQzNELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQzlDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLFFBQVEsRUFBRTtvQkFDWixZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDMUM7YUFDRjtRQUNILENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWiw4QkFBOEI7UUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzhHQXZEVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQjs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSnd0SGVscGVyU2VydmljZSB9IGZyb20gXCJAYXV0aDAvYW5ndWxhci1qd3RcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBIYW5kbGVyLCBIdHRwRXZlbnQsIEh0dHBJbnRlcmNlcHRvciB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IsIGZpbmFsaXplLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IE1lbWJyc1NlcnZpY2UgfSBmcm9tIFwiLi9tZW1icnMuc2VydmljZVwiO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIkB1aXJvdXRlci9hbmd1bGFyXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUb2tlbkludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBqd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UsIHByaXZhdGUgbWVtYnJzU2VydmljZTogTWVtYnJzU2VydmljZSwgcHJpdmF0ZSBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZSkge31cblxuICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm1lbWJyc1wiKTtcblxuICAgIGlmICh0b2tlbiAmJiB0aGlzLmp3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiVG9rZW4gZXhwaXJlZC4gQXR0ZW1wdGluZyB0byByZWlzc3VlLlwiKTtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMubWVtYnJzU2VydmljZS5yZWlzc3VlKCkpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmcmVzaGVkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm1lbWJyc1wiKTtcbiAgICAgICAgICBpZiAocmVmcmVzaGVkVG9rZW4gJiYgIXRoaXMuand0SGVscGVyLmlzVG9rZW5FeHBpcmVkKHJlZnJlc2hlZFRva2VuKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUb2tlbiBzdWNjZXNzZnVsbHkgcmVpc3N1ZWQuXCIpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogcmVmcmVzaGVkVG9rZW4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiVG9rZW4gcmVmcmVzaCBmYWlsZWQuIExvZ2dpbmcgb3V0LlwiKTtcbiAgICAgICAgICB0aGlzLm1lbWJyc1NlcnZpY2UubG9nb3V0KCk7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuZ28oXCJcIik7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAvLyB0aGlzLmJ1c3lTZXJ2aWNlLmZpbmlzaGVkKClcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuICYmICF0aGlzLmp3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikpIHtcbiAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgc2V0SGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IHRva2VuLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gSHR0cFJlc3BvbnNlLCBjaGVjayBmb3IgeC1uZXctdG9rZW4gaGVhZGVyXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC50eXBlID09PSA0ICYmIGV2ZW50LmhlYWRlcnMpIHtcbiAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IGV2ZW50LmhlYWRlcnMuZ2V0KCd4LW5ldy10b2tlbicpO1xuICAgICAgICAgIGlmIChuZXdUb2tlbikge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21lbWJycycsIG5ld1Rva2VuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLmJ1c3lTZXJ2aWNlLmZpbmlzaGVkKClcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -1,124 +0,0 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { JwtHelperService } from '@auth0/angular-jwt';
3
- import { MembrsConfigService } from './config.service';
4
- import { BehaviorSubject } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common/http";
7
- const jwtService = new JwtHelperService();
8
- export class MembrsService {
9
- constructor(http, config) {
10
- this.http = http;
11
- this.config = config;
12
- this.decodedReady = new BehaviorSubject(null);
13
- this._lsKey = 'membrs';
14
- this._loggedInObservable = new BehaviorSubject(false);
15
- // console.log('membrs constructor')
16
- // if the token exists in local storage, retrieve it back to the service
17
- if (localStorage.getItem(this._lsKey)) {
18
- this.token = localStorage.getItem(this._lsKey);
19
- }
20
- }
21
- reissue(token) {
22
- console.log('Reissuing token...'); // Log function entry
23
- return new Promise((resolve, reject) => {
24
- if (!token && !this._token) {
25
- console.log('No token provided and no token found.'); // Log missing token
26
- reject('NOT_LOGGED_IN');
27
- }
28
- if (token) {
29
- console.log(`Token provided: ${token}`); // Log provided token
30
- this.token = token;
31
- }
32
- // check stored token has not expired, or needs to be reissued soon
33
- var reissueIn = this._decoded.exp - Math.floor(Date.now() / 1000);
34
- // token has expired
35
- if (reissueIn < 0) {
36
- console.log('Token has expired.'); // Log expired token
37
- reject('NOT_LOGGED_IN');
38
- }
39
- // token expiring soon
40
- if (reissueIn < 300) {
41
- console.log('Token expiring soon. Reissuing...'); // Log imminent expiration
42
- this.http.post(this.config.apiProtocol + this.config.api + '/token/' + this._token, {}).subscribe((response) => {
43
- if (response.token) {
44
- this.token = response.token;
45
- this._loggedInObservable.next(true);
46
- console.log('Token successfully reissued.'); // Log success
47
- resolve(this._token);
48
- }
49
- else {
50
- console.log('Failed to reissue token.'); // Log failure
51
- reject('NOT_LOGGED_IN');
52
- }
53
- }, (error) => {
54
- console.log('Error reissuing token:', error); // Log error details
55
- reject('NOT_LOGGED_IN');
56
- });
57
- }
58
- else {
59
- this._loggedInObservable.next(true);
60
- console.log('Token is valid. No need to reissue.'); // Log valid token
61
- resolve(this._token);
62
- }
63
- });
64
- }
65
- set token(token) {
66
- this._token = token;
67
- console.log('Token set.');
68
- localStorage.setItem(this._lsKey, token);
69
- this._decoded = jwtService.decodeToken(this._token);
70
- }
71
- deleteToken() {
72
- localStorage.removeItem(this._lsKey);
73
- }
74
- isLoggedIn() {
75
- return this.token ? true : false;
76
- }
77
- get profile() {
78
- return this._decoded;
79
- }
80
- setProfile(decodedData) {
81
- this._decoded = decodedData;
82
- this.decodedReady.next(decodedData); // Emit the new value when profile is set
83
- console.log(this.decodedReady);
84
- }
85
- get decodedReady$() {
86
- return this.decodedReady.asObservable();
87
- }
88
- get token() {
89
- return this._token;
90
- }
91
- get admin() {
92
- return this.profile.permission == 1;
93
- }
94
- get isLoggedInObservable() {
95
- return this._loggedInObservable;
96
- }
97
- logout() {
98
- return new Promise((resolve, reject) => {
99
- this.http.delete(this.config.apiProtocol + this.config.api + '/token/' + this._token).subscribe((response) => {
100
- this._token = null;
101
- localStorage.removeItem(this._lsKey);
102
- resolve(this.config.login);
103
- }, error => {
104
- // If the API call fails (e.g. token already invalid/expired), still clear local state
105
- console.warn('Logout API call failed, clearing local token anyway', error);
106
- this._token = null;
107
- localStorage.removeItem(this._lsKey);
108
- resolve(this.config.login);
109
- });
110
- });
111
- }
112
- }
113
- MembrsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, deps: [{ token: i1.HttpClient }, { token: MembrsConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
114
- MembrsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, providedIn: 'root' });
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, decorators: [{
116
- type: Injectable,
117
- args: [{
118
- providedIn: 'root'
119
- }]
120
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
121
- type: Inject,
122
- args: [MembrsConfigService]
123
- }] }]; } });
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYnJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZW1icnMvc3JjL2xpYi9tZW1icnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFBO0FBT3pDLE1BQU0sT0FBTyxhQUFhO0lBVXhCLFlBQW9CLElBQWdCLEVBQXVDLE1BQW9CO1FBQTNFLFNBQUksR0FBSixJQUFJLENBQVk7UUFBdUMsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUx4RixpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBRXJELFdBQU0sR0FBVyxRQUFRLENBQUM7UUFDMUIsd0JBQW1CLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBSXhFLG9DQUFvQztRQUNwQyx3RUFBd0U7UUFDeEUsSUFBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBQztZQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQy9DO0lBRUgsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFjO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUV4RCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lB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QU0sQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1Qsc0ZBQXNGO2dCQUN0RixPQUFPLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbkIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzsyR0EvSFUsYUFBYSw0Q0FVc0IsbUJBQW1COytHQVZ0RCxhQUFhLGNBSlosTUFBTTs0RkFJUCxhQUFhO2tCQUx6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBYXdDLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2FuZ3VsYXItand0JztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcbmltcG9ydCB7IE1lbWJyc0NvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgTWVtYnJzQ29uZmlnIH0gZnJvbSAnLi9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuY29uc3Qgand0U2VydmljZSA9IG5ldyBKd3RIZWxwZXJTZXJ2aWNlKClcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5cblxuZXhwb3J0IGNsYXNzIE1lbWJyc1NlcnZpY2Uge1xuXG4gIF90b2tlbjogc3RyaW5nO1xuICBfZGVjb2RlZDogYW55O1xuXG4gIHB1YmxpYyBkZWNvZGVkUmVhZHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG5cbiAgX2xzS2V5OiBzdHJpbmcgPSAnbWVtYnJzJztcbiAgX2xvZ2dlZEluT2JzZXJ2YWJsZTogQmVoYXZpb3JTdWJqZWN0PEJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSlcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIEBJbmplY3QoTWVtYnJzQ29uZmlnU2VydmljZSkgcHJpdmF0ZSBjb25maWc6IE1lbWJyc0NvbmZpZykge1xuXG4gICAgLy8gY29uc29sZS5sb2coJ21lbWJycyBjb25zdHJ1Y3RvcicpXG4gICAgLy8gaWYgdGhlIHRva2VuIGV4aXN0cyBpbiBsb2NhbCBzdG9yYWdlLCByZXRyaWV2ZSBpdCBiYWNrIHRvIHRoZSBzZXJ2aWNlXG4gICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5fbHNLZXkpKXtcbiAgICAgIHRoaXMudG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLl9sc0tleSlcbiAgICB9XG4gIFxuICB9XG5cbiAgcmVpc3N1ZSh0b2tlbj86IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKCdSZWlzc3VpbmcgdG9rZW4uLi4nKTsgLy8gTG9nIGZ1bmN0aW9uIGVudHJ5XG4gICAgXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdG9rZW4gJiYgIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdObyB0b2tlbiBwcm92aWRlZCBhbmQgbm8gdG9rZW4gZm91bmQuJyk7IC8vIExvZyBtaXNzaW5nIHRva2VuXG4gICAgICAgIHJlamVjdCgnTk9UX0xPR0dFRF9JTicpO1xuICAgICAgfVxuICBcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICBjb25zb2xlLmxvZyhgVG9rZW4gcHJvdmlkZWQ6ICR7dG9rZW59YCk7IC8vIExvZyBwcm92aWRlZCB0b2tlblxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICB9XG4gIFxuICAgICAgLy8gY2hlY2sgc3RvcmVkIHRva2VuIGhhcyBub3QgZXhwaXJlZCwgb3IgbmVlZHMgdG8gYmUgcmVpc3N1ZWQgc29vblxuICAgICAgdmFyIHJlaXNzdWVJbiA9IHRoaXMuX2RlY29kZWQuZXhwIC0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gIFxuICAgICAgLy8gdG9rZW4gaGFzIGV4cGlyZWRcbiAgICAgIGlmIChyZWlzc3VlSW4gPCAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdUb2tlbiBoYXMgZXhwaXJlZC4nKTsgLy8gTG9nIGV4cGlyZWQgdG9rZW5cbiAgICAgICAgcmVqZWN0KCdOT1RfTE9HR0VEX0lOJyk7XG4gICAgICB9XG4gIFxuICAgICAgLy8gdG9rZW4gZXhwaXJpbmcgc29vblxuICAgICAgaWYgKHJlaXNzdWVJbiA8IDMwMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnVG9rZW4gZXhwaXJpbmcgc29vbi4gUmVpc3N1aW5nLi4uJyk7IC8vIExvZyBpbW1pbmVudCBleHBpcmF0aW9uXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuY29uZmlnLmFwaVByb3RvY29sICsgdGhpcy5jb25maWcuYXBpICsgJy90b2tlbi8nICsgdGhpcy5fdG9rZW4sIHt9KS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS50b2tlbikge1xuICAgICAgICAgICAgICB0aGlzLnRva2VuID0gcmVzcG9uc2UudG9rZW47XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlZEluT2JzZXJ2YWJsZS5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVG9rZW4gc3VjY2Vzc2Z1bGx5IHJlaXNzdWVkLicpOyAvLyBMb2cgc3VjY2Vzc1xuICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuX3Rva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gcmVpc3N1ZSB0b2tlbi4nKTsgLy8gTG9nIGZhaWx1cmVcbiAgICAgICAgICAgICAgcmVqZWN0KCdOT1RfTE9HR0VEX0lOJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciByZWlzc3VpbmcgdG9rZW46JywgZXJyb3IpOyAvLyBMb2cgZXJyb3IgZGV0YWlsc1xuICAgICAgICAgICAgcmVqZWN0KCdOT1RfTE9HR0VEX0lOJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VkSW5PYnNlcnZhYmxlLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdUb2tlbiBpcyB2YWxpZC4gTm8gbmVlZCB0byByZWlzc3VlLicpOyAvLyBMb2cgdmFsaWQgdG9rZW5cbiAgICAgICAgcmVzb2x2ZSh0aGlzLl90b2tlbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG5cbiAgc2V0IHRva2VuKHRva2VuKXtcbiAgICB0aGlzLl90b2tlbiA9IHRva2VuXG4gICAgY29uc29sZS5sb2coJ1Rva2VuIHNldC4nKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLl9sc0tleSwgdG9rZW4pXG4gICAgdGhpcy5fZGVjb2RlZCA9IGp3dFNlcnZpY2UuZGVjb2RlVG9rZW4odGhpcy5fdG9rZW4pXG4gIH1cblxuICBkZWxldGVUb2tlbigpe1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuX2xzS2V5KVxuICB9XG5cbiAgaXNMb2dnZWRJbigpe1xuICAgIHJldHVybiB0aGlzLnRva2VuID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxuICBnZXQgcHJvZmlsZSgpe1xuICAgIHJldHVybiB0aGlzLl9kZWNvZGVkXG4gIH1cblxuICBzZXRQcm9maWxlKGRlY29kZWREYXRhKSB7XG4gICAgdGhpcy5fZGVjb2RlZCA9IGRlY29kZWREYXRhO1xuICAgIHRoaXMuZGVjb2RlZFJlYWR5Lm5leHQoZGVjb2RlZERhdGEpOyAvLyBFbWl0IHRoZSBuZXcgdmFsdWUgd2hlbiBwcm9maWxlIGlzIHNldFxuICAgIGNvbnNvbGUubG9nKHRoaXMuZGVjb2RlZFJlYWR5KTtcbiAgfVxuXG4gIGdldCBkZWNvZGVkUmVhZHkkKCkge1xuICAgIHJldHVybiB0aGlzLmRlY29kZWRSZWFkeS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCB0b2tlbigpe1xuICAgIHJldHVybiB0aGlzLl90b2tlblxuICB9XG5cbiAgZ2V0IGFkbWluICgpe1xuICAgIHJldHVybiB0aGlzLnByb2ZpbGUucGVybWlzc2lvbiA9PSAxXG4gIH1cblxuICBnZXQgaXNMb2dnZWRJbk9ic2VydmFibGUoKXtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VkSW5PYnNlcnZhYmxlXG4gIH1cbiAgXG4gIGxvZ291dCgpe1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+e1xuICAgICAgdGhpcy5odHRwLmRlbGV0ZSh0aGlzLmNvbmZpZy5hcGlQcm90b2NvbCArIHRoaXMuY29uZmlnLmFwaSArICcvdG9rZW4vJyArIHRoaXMuX3Rva2VuKS5zdWJzY3JpYmUoKHJlc3BvbnNlOmFueSk9PntcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBudWxsO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLl9sc0tleSk7XG4gICAgICAgIHJlc29sdmUodGhpcy5jb25maWcubG9naW4pO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAvLyBJZiB0aGUgQVBJIGNhbGwgZmFpbHMgKGUuZy4gdG9rZW4gYWxyZWFkeSBpbnZhbGlkL2V4cGlyZWQpLCBzdGlsbCBjbGVhciBsb2NhbCBzdGF0ZVxuICAgICAgICBjb25zb2xlLndhcm4oJ0xvZ291dCBBUEkgY2FsbCBmYWlsZWQsIGNsZWFyaW5nIGxvY2FsIHRva2VuIGFueXdheScsIGVycm9yKTtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBudWxsO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLl9sc0tleSk7XG4gICAgICAgIHJlc29sdmUodGhpcy5jb25maWcubG9naW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG59XG4iXX0=
@@ -1,364 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Inject, NgModule } from '@angular/core';
3
- import * as i1$1 from '@auth0/angular-jwt';
4
- import { JwtHelperService, JwtModule } from '@auth0/angular-jwt';
5
- import { BehaviorSubject, from, throwError } from 'rxjs';
6
- import * as i1 from '@angular/common/http';
7
- import { HttpClientModule } from '@angular/common/http';
8
- import { CommonModule } from '@angular/common';
9
- import * as i3 from '@uirouter/angular';
10
- import { Transition, UIRouter, UIRouterModule } from '@uirouter/angular';
11
- import { switchMap, catchError, finalize, tap } from 'rxjs/operators';
12
-
13
- /**
14
- * This is not a real service, but it looks like it from the outside.
15
- * It's just an InjectionTToken used to import the config object, provided from the outside
16
- */
17
- const MembrsConfigService = new InjectionToken("MembrsConfig");
18
-
19
- const jwtService = new JwtHelperService();
20
- class MembrsService {
21
- constructor(http, config) {
22
- this.http = http;
23
- this.config = config;
24
- this.decodedReady = new BehaviorSubject(null);
25
- this._lsKey = 'membrs';
26
- this._loggedInObservable = new BehaviorSubject(false);
27
- // console.log('membrs constructor')
28
- // if the token exists in local storage, retrieve it back to the service
29
- if (localStorage.getItem(this._lsKey)) {
30
- this.token = localStorage.getItem(this._lsKey);
31
- }
32
- }
33
- reissue(token) {
34
- console.log('Reissuing token...'); // Log function entry
35
- return new Promise((resolve, reject) => {
36
- if (!token && !this._token) {
37
- console.log('No token provided and no token found.'); // Log missing token
38
- reject('NOT_LOGGED_IN');
39
- }
40
- if (token) {
41
- console.log(`Token provided: ${token}`); // Log provided token
42
- this.token = token;
43
- }
44
- // check stored token has not expired, or needs to be reissued soon
45
- var reissueIn = this._decoded.exp - Math.floor(Date.now() / 1000);
46
- // token has expired
47
- if (reissueIn < 0) {
48
- console.log('Token has expired.'); // Log expired token
49
- reject('NOT_LOGGED_IN');
50
- }
51
- // token expiring soon
52
- if (reissueIn < 300) {
53
- console.log('Token expiring soon. Reissuing...'); // Log imminent expiration
54
- this.http.post(this.config.apiProtocol + this.config.api + '/token/' + this._token, {}).subscribe((response) => {
55
- if (response.token) {
56
- this.token = response.token;
57
- this._loggedInObservable.next(true);
58
- console.log('Token successfully reissued.'); // Log success
59
- resolve(this._token);
60
- }
61
- else {
62
- console.log('Failed to reissue token.'); // Log failure
63
- reject('NOT_LOGGED_IN');
64
- }
65
- }, (error) => {
66
- console.log('Error reissuing token:', error); // Log error details
67
- reject('NOT_LOGGED_IN');
68
- });
69
- }
70
- else {
71
- this._loggedInObservable.next(true);
72
- console.log('Token is valid. No need to reissue.'); // Log valid token
73
- resolve(this._token);
74
- }
75
- });
76
- }
77
- set token(token) {
78
- this._token = token;
79
- console.log('Token set.');
80
- localStorage.setItem(this._lsKey, token);
81
- this._decoded = jwtService.decodeToken(this._token);
82
- }
83
- deleteToken() {
84
- localStorage.removeItem(this._lsKey);
85
- }
86
- isLoggedIn() {
87
- return this.token ? true : false;
88
- }
89
- get profile() {
90
- return this._decoded;
91
- }
92
- setProfile(decodedData) {
93
- this._decoded = decodedData;
94
- this.decodedReady.next(decodedData); // Emit the new value when profile is set
95
- console.log(this.decodedReady);
96
- }
97
- get decodedReady$() {
98
- return this.decodedReady.asObservable();
99
- }
100
- get token() {
101
- return this._token;
102
- }
103
- get admin() {
104
- return this.profile.permission == 1;
105
- }
106
- get isLoggedInObservable() {
107
- return this._loggedInObservable;
108
- }
109
- logout() {
110
- return new Promise((resolve, reject) => {
111
- this.http.delete(this.config.apiProtocol + this.config.api + '/token/' + this._token).subscribe((response) => {
112
- this._token = null;
113
- localStorage.removeItem(this._lsKey);
114
- resolve(this.config.login);
115
- }, error => {
116
- // If the API call fails (e.g. token already invalid/expired), still clear local state
117
- console.warn('Logout API call failed, clearing local token anyway', error);
118
- this._token = null;
119
- localStorage.removeItem(this._lsKey);
120
- resolve(this.config.login);
121
- });
122
- });
123
- }
124
- }
125
- MembrsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, deps: [{ token: i1.HttpClient }, { token: MembrsConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
126
- MembrsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, providedIn: 'root' });
127
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, decorators: [{
128
- type: Injectable,
129
- args: [{
130
- providedIn: 'root'
131
- }]
132
- }], ctorParameters: function () {
133
- return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
134
- type: Inject,
135
- args: [MembrsConfigService]
136
- }] }];
137
- } });
138
-
139
- function routerConfigFn(router, injector) {
140
- const transitionService = router.transitionService;
141
- const stateService = router.stateService;
142
- const config = injector.get(MembrsConfigService);
143
- const membrsService = injector.get(MembrsService);
144
- stateService.defaultErrorHandler(function (error) {
145
- if (error.detail == 'NOT_LOGGED_IN') {
146
- membrsService.deleteToken();
147
- window.location.href = config.login;
148
- }
149
- if (error.detail == 'INSUFFICIENT_PERMISSIONS')
150
- stateService.go(config.defaultState);
151
- });
152
- }
153
-
154
- function retrieveToken() {
155
- // console.log('retrieve from ls')
156
- return localStorage.getItem('membrs');
157
- }
158
-
159
- const validateResolve = {
160
- token: 'reissue',
161
- deps: [Transition, UIRouter, MembrsService, MembrsConfigService],
162
- resolveFn: validateResolveFn
163
- };
164
- const reissueResolve = {
165
- token: 'reissue',
166
- deps: [Transition, UIRouter, MembrsService, MembrsConfigService],
167
- resolveFn: reissueResolveFn
168
- };
169
- const reissueState = {
170
- name: 'reissue',
171
- url: '/reissue?token',
172
- views: {},
173
- resolve: [
174
- reissueResolve
175
- ]
176
- };
177
- function reissueResolveFn(transition, router, membrsService, membrsConfig) {
178
- //console.log(membrsService)
179
- return new Promise((resolve, reject) => {
180
- // console.log('reissue promise resolve')
181
- // console.log(transition.params().token)
182
- membrsService.reissue(transition.params().token).then((response) => {
183
- if (localStorage.getItem('redirectUrlAfterLogin')) {
184
- const redirect = localStorage.getItem('redirectUrlAfterLogin');
185
- localStorage.removeItem('redirectUrlAfterLogin');
186
- window.location.pathname = redirect;
187
- }
188
- else {
189
- router.stateService.go(membrsConfig.defaultState, {}, { inherit: false });
190
- }
191
- reject();
192
- }).catch(error => {
193
- //console.log('error in reissue resolve')
194
- //console.log(error)
195
- //window.location.href = environment.login
196
- reject(error);
197
- });
198
- });
199
- }
200
- function validateResolveFn(transition, router, membrsService, membrsConfig) {
201
- //console.log(membrsService)
202
- return new Promise((resolve, reject) => {
203
- // console.log('validate promise resolve')
204
- membrsService.reissue().then((response) => {
205
- if (localStorage.getItem('redirectUrlAfterLogin')) {
206
- const redirect = localStorage.getItem('redirectUrlAfterLogin');
207
- localStorage.removeItem('redirectUrlAfterLogin');
208
- window.location.pathname = redirect;
209
- }
210
- resolve(null);
211
- }).catch(error => {
212
- localStorage.setItem('redirectUrlAfterLogin', window.location.pathname);
213
- window.location.href = membrsConfig.login;
214
- reject(error);
215
- });
216
- });
217
- }
218
- function jwtOptionsFactory(config) {
219
- // console.log('jwt options factory')
220
- // console.log(config)
221
- return {
222
- tokenGetter: () => {
223
- console.log('token getter', localStorage.getItem('membrs'));
224
- return localStorage.getItem('membrs');
225
- },
226
- allowedDomains: [config.api]
227
- };
228
- }
229
- /** The top level state(s) */
230
- const STATES = [
231
- reissueState
232
- ];
233
- class MembrsModule {
234
- static forRoot(config) {
235
- const moduleProviders = UIRouterModule.forChild({
236
- states: STATES,
237
- config: routerConfigFn
238
- }).providers;
239
- moduleProviders.push(JwtModule.forRoot({
240
- config: {
241
- tokenGetter: retrieveToken,
242
- allowedDomains: []
243
- }
244
- }).providers);
245
- moduleProviders.push(MembrsService);
246
- moduleProviders.push({ provide: MembrsConfigService, useValue: config });
247
- return {
248
- ngModule: MembrsModule,
249
- providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]
250
- };
251
- }
252
- }
253
- MembrsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
254
- MembrsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, imports: [CommonModule,
255
- HttpClientModule,
256
- JwtModule
257
- // JwtModule.forRoot({
258
- // config: {
259
- // tokenGetter: retrieveToken
260
- // }
261
- // })
262
- // UIRouterModule.forChild({
263
- // states: STATES,
264
- // config: routerConfigFn,
265
- // }),
266
- // JwtModule.forRoot({})
267
- ] });
268
- MembrsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, imports: [CommonModule,
269
- HttpClientModule,
270
- JwtModule
271
- // JwtModule.forRoot({
272
- // config: {
273
- // tokenGetter: retrieveToken
274
- // }
275
- // })
276
- // UIRouterModule.forChild({
277
- // states: STATES,
278
- // config: routerConfigFn,
279
- // }),
280
- // JwtModule.forRoot({})
281
- ] });
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, decorators: [{
283
- type: NgModule,
284
- args: [{
285
- imports: [
286
- CommonModule,
287
- HttpClientModule,
288
- JwtModule
289
- // JwtModule.forRoot({
290
- // config: {
291
- // tokenGetter: retrieveToken
292
- // }
293
- // })
294
- // UIRouterModule.forChild({
295
- // states: STATES,
296
- // config: routerConfigFn,
297
- // }),
298
- // JwtModule.forRoot({})
299
- ]
300
- }]
301
- }] });
302
-
303
- class TokenInterceptor {
304
- constructor(jwtHelper, membrsService, stateService) {
305
- this.jwtHelper = jwtHelper;
306
- this.membrsService = membrsService;
307
- this.stateService = stateService;
308
- }
309
- intercept(request, next) {
310
- const token = localStorage.getItem("membrs");
311
- if (token && this.jwtHelper.isTokenExpired(token)) {
312
- console.log("Token expired. Attempting to reissue.");
313
- return from(this.membrsService.reissue()).pipe(switchMap(() => {
314
- const refreshedToken = localStorage.getItem("membrs");
315
- if (refreshedToken && !this.jwtHelper.isTokenExpired(refreshedToken)) {
316
- console.log("Token successfully reissued.");
317
- request = request.clone({
318
- setHeaders: {
319
- Authorization: refreshedToken,
320
- },
321
- });
322
- }
323
- return next.handle(request);
324
- }), catchError((err) => {
325
- console.warn("Token refresh failed. Logging out.");
326
- this.membrsService.logout();
327
- this.stateService.go("");
328
- return throwError(() => err);
329
- }), finalize(() => {
330
- // this.busyService.finished()
331
- }));
332
- }
333
- if (token && !this.jwtHelper.isTokenExpired(token)) {
334
- request = request.clone({
335
- setHeaders: {
336
- Authorization: token,
337
- },
338
- });
339
- }
340
- return next.handle(request).pipe(tap((event) => {
341
- // If this is an HttpResponse, check for x-new-token header
342
- if (event && event.type === 4 && event.headers) {
343
- const newToken = event.headers.get('x-new-token');
344
- if (newToken) {
345
- localStorage.setItem('membrs', newToken);
346
- }
347
- }
348
- }), finalize(() => {
349
- // this.busyService.finished()
350
- }));
351
- }
352
- }
353
- TokenInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor, deps: [{ token: i1$1.JwtHelperService }, { token: MembrsService }, { token: i3.StateService }], target: i0.ɵɵFactoryTarget.Injectable });
354
- TokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor });
355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor, decorators: [{
356
- type: Injectable
357
- }], ctorParameters: function () { return [{ type: i1$1.JwtHelperService }, { type: MembrsService }, { type: i3.StateService }]; } });
358
-
359
- /**
360
- * Generated bundle index. Do not edit.
361
- */
362
-
363
- export { MembrsModule, MembrsService, STATES, TokenInterceptor, jwtOptionsFactory, reissueResolve, reissueResolveFn, reissueState, retrieveToken, validateResolve, validateResolveFn };
364
- //# sourceMappingURL=nakedcreativity-membrs-angular-helper.mjs.map