{"version":3,"file":"nakedcreativity-membrs-angular-helper.mjs","sources":["../../../projects/membrs/src/lib/config.service.ts","../../../projects/membrs/src/lib/membrs.service.ts","../../../projects/membrs/src/lib/router.config.ts","../../../projects/membrs/src/lib/token.ts","../../../projects/membrs/src/lib/membrs.module.ts","../../../projects/membrs/src/lib/auth.interceptor.ts","../../../projects/membrs/src/nakedcreativity-membrs-angular-helper.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MembrsConfig } from './config.interface';\n\n/**\n * This is not a real service, but it looks like it from the outside.\n * It's just an InjectionTToken used to import the config object, provided from the outside\n */\nexport const MembrsConfigService = new InjectionToken<MembrsConfig>(\"MembrsConfig\");\n","import { Injectable, Inject } from '@angular/core';\nimport { JwtHelperService } from '@auth0/angular-jwt';\nimport { HttpClient } from '@angular/common/http'\nimport { MembrsConfigService } from './config.service'\nimport { MembrsConfig } from './config.interface';\nimport { BehaviorSubject } from 'rxjs';\nconst jwtService = new JwtHelperService()\n\n@Injectable({\n  providedIn: 'root'\n})\n\n\nexport class MembrsService {\n\n  _token: string;\n  _decoded: any;\n\n  public decodedReady = new BehaviorSubject<any>(null);\n\n  _lsKey: string = 'membrs';\n  _loggedInObservable: BehaviorSubject<Boolean> = new BehaviorSubject(false)\n\n  constructor(private http: HttpClient, @Inject(MembrsConfigService) private config: MembrsConfig) {\n\n    // console.log('membrs constructor')\n    // if the token exists in local storage, retrieve it back to the service\n    if(localStorage.getItem(this._lsKey)){\n      this.token = localStorage.getItem(this._lsKey)\n    }\n  \n  }\n\n  reissue(token?: string) {\n    console.log('Reissuing token...'); // Log function entry\n    \n    return new Promise((resolve, reject) => {\n      if (!token && !this._token) {\n        console.log('No token provided and no token found.'); // Log missing token\n        reject('NOT_LOGGED_IN');\n      }\n  \n      if (token) {\n        console.log(`Token provided: ${token}`); // Log provided token\n        this.token = token;\n      }\n  \n      // check stored token has not expired, or needs to be reissued soon\n      var reissueIn = this._decoded.exp - Math.floor(Date.now() / 1000);\n  \n      // token has expired\n      if (reissueIn < 0) {\n        console.log('Token has expired.'); // Log expired token\n        reject('NOT_LOGGED_IN');\n      }\n  \n      // token expiring soon\n      if (reissueIn < 300) {\n        console.log('Token expiring soon. Reissuing...'); // Log imminent expiration\n        this.http.post(this.config.apiProtocol + this.config.api + '/token/' + this._token, {}).subscribe(\n          (response: any) => {\n            if (response.token) {\n              this.token = response.token;\n              this._loggedInObservable.next(true);\n              console.log('Token successfully reissued.'); // Log success\n              resolve(this._token);\n            } else {\n              console.log('Failed to reissue token.'); // Log failure\n              reject('NOT_LOGGED_IN');\n            }\n          },\n          (error) => {\n            console.log('Error reissuing token:', error); // Log error details\n            reject('NOT_LOGGED_IN');\n          }\n        );\n      } else {\n        this._loggedInObservable.next(true);\n        console.log('Token is valid. No need to reissue.'); // Log valid token\n        resolve(this._token);\n      }\n    });\n  }\n  \n\n  set token(token){\n    this._token = token\n    console.log('Token set.');\n    localStorage.setItem(this._lsKey, token)\n    this._decoded = jwtService.decodeToken(this._token)\n  }\n\n  deleteToken(){\n    localStorage.removeItem(this._lsKey)\n  }\n\n  isLoggedIn(){\n    return this.token ? true : false\n  }\n\n  get profile(){\n    return this._decoded\n  }\n\n  setProfile(decodedData) {\n    this._decoded = decodedData;\n    this.decodedReady.next(decodedData); // Emit the new value when profile is set\n    console.log(this.decodedReady);\n  }\n\n  get decodedReady$() {\n    return this.decodedReady.asObservable();\n  }\n\n  get token(){\n    return this._token\n  }\n\n  get admin (){\n    return this.profile.permission == 1\n  }\n\n  get isLoggedInObservable(){\n    return this._loggedInObservable\n  }\n  \n  logout(){\n    return new Promise((resolve, reject)=>{\n      this.http.delete(this.config.apiProtocol + this.config.api + '/token/' + this._token).subscribe((response:any)=>{\n        this._token = null;\n        localStorage.removeItem(this._lsKey);\n        resolve(this.config.login);\n      }, error => {\n        // If the API call fails (e.g. token already invalid/expired), still clear local state\n        console.warn('Logout API call failed, clearing local token anyway', error);\n        this._token = null;\n        localStorage.removeItem(this._lsKey);\n        resolve(this.config.login);\n      });\n    });\n  }\n\n\n}\n","import { UIRouter } from '@uirouter/core';\nimport { MembrsConfigService } from './config.service'\nimport { MembrsConfig } from './config.interface';\nimport { Injector } from '@angular/core';\nimport { MembrsService } from './membrs.service';\n\nexport function routerConfigFn(router: UIRouter, injector: Injector) {\n\n  const transitionService = router.transitionService;\n  const stateService = router.stateService\n  const config:MembrsConfig = injector.get(MembrsConfigService)\n  const membrsService = injector.get(MembrsService)\n\n \tstateService.defaultErrorHandler(function(error) {\n\t\t \t\n\t\tif(error.detail == 'NOT_LOGGED_IN'){\n\t\t\tmembrsService.deleteToken()\n\t\t\twindow.location.href = config.login;\n\t\t}\n\n\t\tif(error.detail == 'INSUFFICIENT_PERMISSIONS')\n\t\t\tstateService.go(config.defaultState)\n\n\t});\n\t\n}","export function retrieveToken() {\n    // console.log('retrieve from ls')\n    return localStorage.getItem('membrs');\n}","import { NgModule, ModuleWithProviders, Injector } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MembrsService } from './membrs.service';\nimport { JwtModule, JWT_OPTIONS } from \"@auth0/angular-jwt\";\nimport { provideHttpClient, withInterceptorsFromDi } from \"@angular/common/http\";\nimport { UIRouterModule } from '@uirouter/angular'\n\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { Transition, UIRouter } from '@uirouter/angular'\n\nimport { routerConfigFn } from './router.config';\nimport { MembrsConfig } from './config.interface';\nimport { MembrsConfigService } from './config.service';\nimport { retrieveToken } from './token';\n\nexport const validateResolve = {\n    token: 'reissue',\n    deps: [ Transition, UIRouter, MembrsService, MembrsConfigService ],\n    resolveFn: validateResolveFn\n}\n\nexport const reissueResolve = {\n  token: 'reissue',\n  deps: [ Transition, UIRouter, MembrsService, MembrsConfigService ],\n  resolveFn: reissueResolveFn\n}\n\nexport const reissueState:Ng2StateDeclaration = {\n\tname: 'reissue', \n\turl: '/reissue?token',\n\tviews: { },\n\tresolve: [\n    reissueResolve\n\t]\n}\n\nexport function reissueResolveFn(transition, router, membrsService, membrsConfig:MembrsConfig) {\n    \n    //console.log(membrsService)\n    return new Promise((resolve, reject) => {\n      // console.log('reissue promise resolve')\n      // console.log(transition.params().token)\n      membrsService.reissue(transition.params().token).then((response)=>{\n          if(localStorage.getItem('redirectUrlAfterLogin')){\n            const redirect = localStorage.getItem('redirectUrlAfterLogin')\n            localStorage.removeItem('redirectUrlAfterLogin')\n            window.location.pathname = redirect\n          }else {\n            router.stateService.go(membrsConfig.defaultState, {}, {inherit:false})\n          }\n          reject()\n      }).catch(error=>{\n          //console.log('error in reissue resolve')\n          //console.log(error)\n          //window.location.href = environment.login\n          reject(error)\n      })\n\n\t})\n}\n\nexport function validateResolveFn(transition, router, membrsService, membrsConfig:MembrsConfig) {\n  \n  //console.log(membrsService)\n  return new Promise((resolve, reject) => {\n    // console.log('validate promise resolve')\n    \n    membrsService.reissue().then((response)=>{\n      if(localStorage.getItem('redirectUrlAfterLogin')){\n        const redirect = localStorage.getItem('redirectUrlAfterLogin')\n        localStorage.removeItem('redirectUrlAfterLogin')\n        window.location.pathname = redirect\n      }\n      resolve(null)\n    }).catch(error=>{\n      localStorage.setItem('redirectUrlAfterLogin', window.location.pathname)\n      window.location.href = membrsConfig.login\n      reject(error)\n    })\n\n})\n}\n\nexport function jwtOptionsFactory(config) {\n  // console.log('jwt options factory')\n  // console.log(config)\n  return {\n    tokenGetter: () => {\n      console.log('token getter',  localStorage.getItem('membrs'))\n      return localStorage.getItem('membrs');\n    },\n    allowedDomains: [config.api]\n  }\n}\n\n\n/** The top level state(s) */\nexport const STATES = [\n    reissueState\n]\n\n\n@NgModule({ imports: [CommonModule,\n        JwtModule\n        // JwtModule.forRoot({\n        //   config: {\n        //     tokenGetter: retrieveToken\n        //   }\n        // })\n        // UIRouterModule.forChild({\n        //   states: STATES,\n        //   config: routerConfigFn,\n        // }),\n        // JwtModule.forRoot({})\n    ], providers: [provideHttpClient(withInterceptorsFromDi())] })\n\n\n\nexport class MembrsModule { \n  static forRoot(config: MembrsConfig): ModuleWithProviders<MembrsModule> {\n\n\n    const moduleProviders = UIRouterModule.forChild({\n      states: STATES,\n      config: routerConfigFn\n    }).providers\n\n    moduleProviders.push(JwtModule.forRoot({\n      config: {\n        tokenGetter: retrieveToken,\n        allowedDomains: []\n      }\n    }).providers)\n      \n    moduleProviders.push(MembrsService)\n    moduleProviders.push({provide: MembrsConfigService,useValue: config});\n    \n   \n    return {\n      ngModule: MembrsModule, \n      providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]\n    };\n    \n  }\n\n}\n","import { JwtHelperService } from \"@auth0/angular-jwt\";\nimport { Injectable } from \"@angular/core\";\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from \"@angular/common/http\";\nimport { Observable, from, throwError } from \"rxjs\";\nimport { switchMap, catchError, finalize, tap } from \"rxjs/operators\";\nimport { MembrsService } from \"./membrs.service\";\nimport { StateService } from \"@uirouter/angular\";\n\n@Injectable()\nexport class TokenInterceptor implements HttpInterceptor {\n  constructor(private jwtHelper: JwtHelperService, private membrsService: MembrsService, private stateService: StateService) {}\n\n  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    const token = localStorage.getItem(\"membrs\");\n\n    if (token && this.jwtHelper.isTokenExpired(token)) {\n      console.log(\"Token expired. Attempting to reissue.\");\n      return from(this.membrsService.reissue()).pipe(\n        switchMap(() => {\n          const refreshedToken = localStorage.getItem(\"membrs\");\n          if (refreshedToken && !this.jwtHelper.isTokenExpired(refreshedToken)) {\n            console.log(\"Token successfully reissued.\");\n            request = request.clone({\n              setHeaders: {\n                Authorization: refreshedToken,\n              },\n            });\n          }\n          return next.handle(request);\n        }),\n        catchError((err) => {\n          console.warn(\"Token refresh failed. Logging out.\");\n          this.membrsService.logout();\n          this.stateService.go(\"\");\n          return throwError(() => err);\n        }),\n        finalize(() => {\n          // this.busyService.finished()\n        })\n      );\n    }\n\n    if (token && !this.jwtHelper.isTokenExpired(token)) {\n      request = request.clone({\n        setHeaders: {\n          Authorization: token,\n        },\n      });\n    }\n\n    return next.handle(request).pipe(\n      tap((event) => {\n        // If this is an HttpResponse, check for x-new-token header\n        if (event && event.type === 4 && event.headers) {\n          const newToken = event.headers.get('x-new-token');\n          if (newToken) {\n            localStorage.setItem('membrs', newToken);\n          }\n        }\n      }),\n      finalize(() => {\n        // this.busyService.finished()\n      })\n    );\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.MembrsService"],"mappings":"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"}