{"version":3,"sources":["src/app/models/public-user.model.ts","src/app/models/user.model.ts","node_modules/@auth0/angular-jwt/fesm2020/auth0-angular-jwt.mjs","src/app/core/services/local-storage.service.ts","src/app/features/user/services/token-storage.service.ts","src/app/models/referral.model.ts","src/app/core/services/referral.service.ts","src/app/core/services/idle-callback.service.ts","src/app/core/services/plausible.service.ts","src/app/features/user/services/user.service.ts"],"sourcesContent":["export class PublicUser {\n firstname: string;\n profilePicture: string;\n profilePictureThumbnail: string;\n\n deserialize(input: any): this {\n this.firstname = input.first_name;\n this.profilePicture = input.profile_picture;\n this.profilePictureThumbnail = input.profile_picture_thumbnail;\n return this;\n }\n}\n","class FieldMapping {\n fieldMap = {\n firstname: 'first_name',\n lastname: 'last_name',\n email: 'email',\n phonenumber: 'phone_number',\n profilePicture: 'profile_picture',\n referralCode: 'referral_code',\n credits: 'credits',\n country: 'country',\n city: 'city',\n verified: 'verified',\n travelMeaning: 'travel_meaning',\n isStaff: 'is_staff',\n groups: 'groups',\n localLeaderTrips: 'local_leader_trips',\n };\n\n reverseFieldMap = Object.keys(this.fieldMap).reduce((obj, key) => {\n obj[this.fieldMap[key]] = key;\n return obj;\n }, {});\n}\n\nexport class User {\n firstname: string;\n lastname: string;\n email: string;\n phonenumber: string;\n profilePicture: string;\n referralCode: string;\n credits: number;\n country: string;\n city: string;\n verified: boolean;\n travelMeaning: string;\n isStaff: boolean;\n groups: string[];\n localLeaderTrips: string[];\n\n private static fieldMap = new FieldMapping().fieldMap;\n\n private static reverseFieldMap = new FieldMapping().reverseFieldMap;\n\n public static mapField(field: string) {\n return this.fieldMap[field];\n }\n public static reverseMapField(field: string) {\n return this.reverseFieldMap[field];\n }\n\n deserialize(input: any): this {\n for (let [key, value] of Object.entries(input)) {\n this[User.reverseMapField(key)] = value;\n }\n return this;\n }\n\n serialize() {\n return {\n first_name: this.firstname,\n last_name: this.lastname,\n email: this.email,\n phone_number: this.phonenumber,\n profile_picture: this.profilePicture,\n };\n }\n}\n","import * as i0 from '@angular/core';\nimport { InjectionToken, Injectable, Inject, NgModule, Optional, SkipSelf } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { map, mergeMap } from 'rxjs/operators';\nimport { defer, of } from 'rxjs';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nconst JWT_OPTIONS = new InjectionToken('JWT_OPTIONS');\n\n/* eslint-disable no-bitwise */\nlet JwtHelperService = /*#__PURE__*/(() => {\n class JwtHelperService {\n constructor(config = null) {\n this.tokenGetter = config && config.tokenGetter || function () {};\n }\n urlBase64Decode(str) {\n let output = str.replace(/-/g, '+').replace(/_/g, '/');\n switch (output.length % 4) {\n case 0:\n {\n break;\n }\n case 2:\n {\n output += '==';\n break;\n }\n case 3:\n {\n output += '=';\n break;\n }\n default:\n {\n throw new Error('Illegal base64url string!');\n }\n }\n return this.b64DecodeUnicode(output);\n }\n // credits for decoder goes to https://github.com/atk\n b64decode(str) {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n let output = '';\n str = String(str).replace(/=+$/, '');\n if (str.length % 4 === 1) {\n throw new Error(`'atob' failed: The string to be decoded is not correctly encoded.`);\n }\n for (\n // initialize result and counters\n let bc = 0, bs, buffer, idx = 0;\n // get next character\n buffer = str.charAt(idx++);\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n }\n b64DecodeUnicode(str) {\n return decodeURIComponent(Array.prototype.map.call(this.b64decode(str), c => {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(''));\n }\n decodeToken(token = this.tokenGetter()) {\n if (token instanceof Promise) {\n return token.then(t => this._decodeToken(t));\n }\n return this._decodeToken(token);\n }\n _decodeToken(token) {\n if (!token || token === '') {\n return null;\n }\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error(`The inspected token doesn't appear to be a JWT. Check to make sure it has three parts and see https://jwt.io for more.`);\n }\n const decoded = this.urlBase64Decode(parts[1]);\n if (!decoded) {\n throw new Error('Cannot decode the token.');\n }\n return JSON.parse(decoded);\n }\n getTokenExpirationDate(token = this.tokenGetter()) {\n if (token instanceof Promise) {\n return token.then(t => this._getTokenExpirationDate(t));\n }\n return this._getTokenExpirationDate(token);\n }\n _getTokenExpirationDate(token) {\n let decoded;\n decoded = this.decodeToken(token);\n if (!decoded || !decoded.hasOwnProperty('exp')) {\n return null;\n }\n const date = new Date(0);\n date.setUTCSeconds(decoded.exp);\n return date;\n }\n isTokenExpired(token = this.tokenGetter(), offsetSeconds) {\n if (token instanceof Promise) {\n return token.then(t => this._isTokenExpired(t, offsetSeconds));\n }\n return this._isTokenExpired(token, offsetSeconds);\n }\n _isTokenExpired(token, offsetSeconds) {\n if (!token || token === '') {\n return true;\n }\n const date = this.getTokenExpirationDate(token);\n offsetSeconds = offsetSeconds || 0;\n if (date === null) {\n return false;\n }\n return !(date.valueOf() > new Date().valueOf() + offsetSeconds * 1000);\n }\n getAuthScheme(authScheme, request) {\n if (typeof authScheme === 'function') {\n return authScheme(request);\n }\n return authScheme;\n }\n }\n JwtHelperService.ɵfac = function JwtHelperService_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || JwtHelperService)(i0.ɵɵinject(JWT_OPTIONS));\n };\n JwtHelperService.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: JwtHelperService,\n factory: JwtHelperService.ɵfac\n });\n return JwtHelperService;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst fromPromiseOrValue = input => {\n if (input instanceof Promise) {\n return defer(() => input);\n }\n return of(input);\n};\nlet JwtInterceptor = /*#__PURE__*/(() => {\n class JwtInterceptor {\n constructor(config, jwtHelper, document) {\n this.jwtHelper = jwtHelper;\n this.document = document;\n this.standardPorts = ['80', '443'];\n this.tokenGetter = config.tokenGetter;\n this.headerName = config.headerName || 'Authorization';\n this.authScheme = config.authScheme || config.authScheme === '' ? config.authScheme : 'Bearer ';\n this.allowedDomains = config.allowedDomains || [];\n this.disallowedRoutes = config.disallowedRoutes || [];\n this.throwNoTokenError = config.throwNoTokenError || false;\n this.skipWhenExpired = config.skipWhenExpired;\n }\n isAllowedDomain(request) {\n const requestUrl = new URL(request.url, this.document.location.origin);\n // If the host equals the current window origin,\n // the domain is allowed by default\n if (requestUrl.host === this.document.location.host) {\n return true;\n }\n // If not the current domain, check the allowed list\n const hostName = `${requestUrl.hostname}${requestUrl.port && !this.standardPorts.includes(requestUrl.port) ? ':' + requestUrl.port : ''}`;\n return this.allowedDomains.findIndex(domain => typeof domain === 'string' ? domain === hostName : domain instanceof RegExp ? domain.test(hostName) : false) > -1;\n }\n isDisallowedRoute(request) {\n const requestedUrl = new URL(request.url, this.document.location.origin);\n return this.disallowedRoutes.findIndex(route => {\n if (typeof route === 'string') {\n const parsedRoute = new URL(route, this.document.location.origin);\n return parsedRoute.hostname === requestedUrl.hostname && parsedRoute.pathname === requestedUrl.pathname;\n }\n if (route instanceof RegExp) {\n return route.test(request.url);\n }\n return false;\n }) > -1;\n }\n handleInterception(token, request, next) {\n const authScheme = this.jwtHelper.getAuthScheme(this.authScheme, request);\n if (!token && this.throwNoTokenError) {\n throw new Error('Could not get token from tokenGetter function.');\n }\n let tokenIsExpired = of(false);\n if (this.skipWhenExpired) {\n tokenIsExpired = token ? fromPromiseOrValue(this.jwtHelper.isTokenExpired(token)) : of(true);\n }\n if (token) {\n return tokenIsExpired.pipe(map(isExpired => isExpired && this.skipWhenExpired ? request.clone() : request.clone({\n setHeaders: {\n [this.headerName]: `${authScheme}${token}`\n }\n })), mergeMap(innerRequest => next.handle(innerRequest)));\n }\n return next.handle(request);\n }\n intercept(request, next) {\n if (!this.isAllowedDomain(request) || this.isDisallowedRoute(request)) {\n return next.handle(request);\n }\n const token = this.tokenGetter(request);\n return fromPromiseOrValue(token).pipe(mergeMap(asyncToken => {\n return this.handleInterception(asyncToken, request, next);\n }));\n }\n }\n JwtInterceptor.ɵfac = function JwtInterceptor_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || JwtInterceptor)(i0.ɵɵinject(JWT_OPTIONS), i0.ɵɵinject(JwtHelperService), i0.ɵɵinject(DOCUMENT));\n };\n JwtInterceptor.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: JwtInterceptor,\n factory: JwtInterceptor.ɵfac\n });\n return JwtInterceptor;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet JwtModule = /*#__PURE__*/(() => {\n class JwtModule {\n constructor(parentModule) {\n if (parentModule) {\n throw new Error(`JwtModule is already loaded. It should only be imported in your application's main module.`);\n }\n }\n static forRoot(options) {\n return {\n ngModule: JwtModule,\n providers: [{\n provide: HTTP_INTERCEPTORS,\n useClass: JwtInterceptor,\n multi: true\n }, options.jwtOptionsProvider || {\n provide: JWT_OPTIONS,\n useValue: options.config\n }, JwtHelperService]\n };\n }\n }\n JwtModule.ɵfac = function JwtModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || JwtModule)(i0.ɵɵinject(JwtModule, 12));\n };\n JwtModule.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: JwtModule\n });\n JwtModule.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n return JwtModule;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/*\n * Public API Surface of angular-jwt\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { JWT_OPTIONS, JwtHelperService, JwtInterceptor, JwtModule };\n","import { Inject, Injectable, InjectionToken } from '@angular/core';\nimport { EnvironmentService } from '@core/services/environment.service';\nimport { WINDOW } from '@core/services/window.service';\n\nexport const LOCALSTORAGE = new InjectionToken('Local Storage');\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LocalStorageService {\n private readonly localStorageRef: Storage;\n\n private readonly dummyLocalStorage = {\n clear: () => {\n /*noop*/\n },\n getItem: (key: string) => undefined as string,\n key: (index: number) => undefined as string,\n removeItem: (key: string) => {\n /*noop*/\n },\n setItem: (key: string, value: string) => {\n /*noop*/\n },\n length: 0,\n };\n\n constructor(\n private environmentService: EnvironmentService,\n @Inject(WINDOW) window: Window\n ) {\n if (\n environmentService.isBrowser() &&\n navigator.cookieEnabled &&\n window.localStorage\n ) {\n this.localStorageRef = localStorage;\n } else {\n this.localStorageRef = this.dummyLocalStorage;\n }\n }\n\n get localStorage(): Storage {\n return this.localStorageRef;\n }\n}\n","import { isPlatformServer } from '@angular/common';\nimport { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { JwtHelperService } from '@auth0/angular-jwt';\nimport { DjangoService } from '@core/services/django.service';\nimport { LOCALSTORAGE } from '@core/services/local-storage.service';\nimport { httpRetry } from '@core/utils/httpRetry';\nimport { Observable } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TokenStorageService {\n private token: string;\n private readonly JWT_TOKEN = 'JWT_TOKEN';\n private readonly REFRESH_TOKEN = 'REFRESH_TOKEN';\n private readonly tokenObservable = new Observable();\n private jwtHelper: JwtHelperService = new JwtHelperService();\n\n constructor(\n private djangoService: DjangoService,\n @Inject(LOCALSTORAGE) private localStorage: Storage,\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n this.tokenObservable = new Observable(subscriber => {\n if (!this.getJwtToken() || isPlatformServer(this.platformId)) {\n console.log('Not Authenticated!');\n subscriber.next(null);\n subscriber.complete();\n } else {\n if (this.isJwtTokenExpired()) {\n if (this.isRefreshTokenExpired()) {\n console.error('Refresh Token expired');\n this.djangoService.logout().subscribe(() => {\n this.removeTokens();\n subscriber.next(null);\n subscriber.complete();\n });\n } else {\n console.log('Refreshing token');\n this.refreshToken().subscribe({\n next: token => {\n subscriber.next(token);\n subscriber.complete();\n },\n error: err => {\n console.error('Error refreshing Token');\n this.djangoService.logout().subscribe(() => {\n this.removeTokens();\n subscriber.next(null);\n subscriber.complete();\n });\n },\n });\n }\n } else {\n subscriber.next(this.getJwtToken());\n subscriber.complete();\n }\n }\n });\n }\n\n getJwtToken() {\n if (!this.token) {\n this.token = this.localStorage.getItem(this.JWT_TOKEN);\n }\n return this.token;\n }\n\n getRefreshToken() {\n return this.localStorage.getItem(this.REFRESH_TOKEN);\n }\n\n storeJwtToken(jwt: string) {\n this.token = jwt;\n this.localStorage.setItem(this.JWT_TOKEN, jwt);\n }\n\n storeRefreshToken(refreshToken: string) {\n this.localStorage.setItem(this.REFRESH_TOKEN, refreshToken);\n }\n\n storeTokens(jwt, refreshToken) {\n this.storeJwtToken(jwt);\n this.storeRefreshToken(refreshToken);\n }\n\n isJwtTokenExpired() {\n return this.jwtHelper.isTokenExpired(this.getJwtToken(), 30);\n }\n isRefreshTokenExpired() {\n return this.jwtHelper.isTokenExpired(this.getRefreshToken(), 30);\n }\n\n getToken(): Observable {\n return this.tokenObservable;\n }\n\n removeTokens() {\n this.token = null;\n this.localStorage.removeItem(this.JWT_TOKEN);\n this.localStorage.removeItem(this.REFRESH_TOKEN);\n }\n\n refreshToken() {\n const data = {\n refresh: this.getRefreshToken(),\n };\n return this.djangoService.refresh(data).pipe(\n httpRetry(3, 200),\n tap((data: any) => {\n this.storeJwtToken(data.access);\n this.storeRefreshToken(data.refresh);\n }),\n map((tokens: any): string => tokens.access)\n );\n }\n}\n","export class Referral {\n firstname: string;\n profilePicture: string;\n credit: any;\n\n deserialize(input: any): this {\n this.firstname = input.user.first_name;\n this.profilePicture = input.user.profile_picture_thumbnail;\n this.credit = input.credit;\n return this;\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { Referral } from '@models/referral.model';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { DjangoService } from './django.service';\nimport { LOCALSTORAGE } from './local-storage.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ReferralService {\n constructor(\n private djangoService: DjangoService,\n @Inject(LOCALSTORAGE) private localStorage: Storage\n ) {}\n\n private readonly REFERRAL_CODE = 'REFERRAL_CODE';\n\n getReferralCode() {\n return this.localStorage.getItem(this.REFERRAL_CODE);\n }\n\n storeReferralCode(code: string) {\n this.localStorage.setItem(this.REFERRAL_CODE, code);\n }\n\n referrals(): Observable {\n return this.djangoService\n .referrals()\n .pipe(\n map((data: []) =>\n data.map(referralData =>\n new Referral().deserialize(referralData)\n )\n )\n );\n }\n\n countReferral() {\n const data = {\n referral_code: this.getReferralCode(),\n };\n return this.djangoService.countReferralCode(data);\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { EnvironmentService } from '@core/services/environment.service';\nimport { WINDOW } from '@core/services/window.service';\nimport { Observable } from 'rxjs';\nimport { shareReplay, take } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class IdleCallbackService {\n private idle: Observable;\n\n constructor(\n private environmentService: EnvironmentService,\n @Inject(WINDOW) private window: Window\n ) {\n this.idle = this.idleCallBack(2000).pipe(take(1), shareReplay(1));\n this.idle.subscribe();\n }\n\n idleCallBack(timeout: number = 1000): Observable {\n return new Observable(observer => {\n if (this.environmentService.isBrowser()) {\n if (this.window.requestIdleCallback) {\n this.window.requestIdleCallback(() => {\n observer.next(null);\n observer.complete();\n });\n } else {\n setTimeout(() => {\n observer.next(null);\n observer.complete();\n }, timeout);\n }\n } else {\n observer.next(null);\n observer.complete();\n }\n });\n }\n\n firstIdleCallback() {\n return this.idle;\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { EnvironmentService } from '@core/services/environment.service';\nimport { Tracker } from '@core/services/event-tracker.service';\nimport { IdleCallbackService } from '@core/services/idle-callback.service';\nimport { AnalyticsEventName } from '@core/utils/AnalyticsEvents';\nimport { LOCALSTORAGE } from './local-storage.service';\nimport { WINDOW } from './window.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PlausibleService implements Tracker {\n plausible: any;\n readonly flag = 'plausible_ignore';\n constructor(\n private environmentService: EnvironmentService,\n private idleCallbackService: IdleCallbackService,\n @Inject(WINDOW) private window: Window,\n @Inject(PLATFORM_ID) private platformId: Object,\n @Inject(LOCALSTORAGE) private localStorage: Storage,\n @Inject(DOCUMENT) private document: Document\n ) {\n if (isPlatformBrowser(this.platformId)) {\n // @ts-ignore\n this.plausible = this.window.plausible;\n }\n }\n\n trackEvent(\n name: AnalyticsEventName,\n props?: { [key: string]: string | number | boolean }\n ) {\n if (isPlatformBrowser(this.platformId) && this.plausible) {\n this.plausible(name, { props: props });\n }\n }\n\n disable() {\n this.localStorage.setItem(this.flag, 'true');\n }\n\n isActive() {\n return this.localStorage.getItem(this.flag) !== 'true';\n }\n\n setup() {\n if (\n this.environmentService.isBrowser() &&\n !this.document.getElementById('plausible-script')\n ) {\n const script = this.document.createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('id', 'plausible-script');\n script.setAttribute('defer', '');\n script.setAttribute('async', '');\n script.setAttribute(\n 'data-domain',\n this.environmentService.hostName().replace(/https?:\\/\\//i, '')\n );\n script.setAttribute(\n 'src',\n 'https://plausible.followalice.com/js/script.js'\n );\n // @ts-ignore\n script.onload = () => (this.plausible = this.window.plausible);\n this.idleCallbackService\n .firstIdleCallback()\n .subscribe(() => this.document.head.appendChild(script));\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\nimport { DjangoService } from '@core/services/django.service';\nimport { PlausibleService } from '@core/services/plausible.service';\nimport { ReferralService } from '@core/services/referral.service';\nimport { PublicUser } from '@models/public-user.model';\nimport { User } from '@models/user.model';\nimport { Observable, concat, of, timer } from 'rxjs';\nimport {\n catchError,\n map,\n switchMap,\n switchMapTo,\n take,\n tap,\n} from 'rxjs/operators';\nimport { TokenStorageService } from './token-storage.service';\n\nexport enum UserGroups {\n salesPerson = 'Sales',\n tripManager = 'Trip Manager',\n paymentsAdmin = 'Payments Admin',\n bookingAdmin = 'Booking Admin',\n editor = 'Editor',\n preview = 'Preview',\n localLeader = 'Local Leader',\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserService {\n private cache: Observable;\n private readonly authenticationObservable = new Observable();\n\n constructor(\n private djangoService: DjangoService,\n private tokenStorageService: TokenStorageService,\n private referralService: ReferralService,\n private plausibleService: PlausibleService\n ) {\n this.authenticationObservable = this.tokenStorageService\n .getToken()\n .pipe(map((token: string) => !!token));\n }\n\n create(\n firstname: string,\n lastname: string,\n email: string,\n phonenumber: string = null,\n profile_picture: string = null\n ) {\n const user = new User();\n user.firstname = firstname;\n user.lastname = lastname;\n user.email = email;\n user.phonenumber = phonenumber;\n user.profilePicture = profile_picture;\n return user;\n }\n\n register(user: User, password1: string, password2: string) {\n const data = user.serialize();\n data['password1'] = password1;\n data['password2'] = password2;\n data['referred_by'] = this.referralService.getReferralCode();\n return this.djangoService\n .register(data)\n .pipe(map(data => this.handleLoginData(data)));\n }\n\n validateEmailExists({\n value,\n }: AbstractControl): Observable {\n const observable = this.djangoService.emailExists(value).pipe(take(1));\n return timer(1000).pipe(\n switchMapTo(observable),\n catchError(error => of(null)),\n map(data => {\n if (!data) {\n return null;\n } else {\n return { emailExists: true };\n }\n })\n );\n }\n\n saveLocation(country: string, city: string) {\n const data = {};\n if (country) {\n data['country'] = country;\n }\n if (city) {\n data['city'] = city;\n }\n return this.updateUser(data);\n }\n\n updateUser(inputData: any) {\n const backendData = {};\n for (let [key, value] of Object.entries(inputData)) {\n backendData[User.mapField(key)] = value;\n }\n this.djangoService.clear_cache();\n return this.djangoService.updateUser(backendData);\n }\n\n saveProfilePicture(imageData: string) {\n const data = {\n profile_picture: imageData,\n };\n this.djangoService.clear_cache();\n return this.djangoService.uploadProfilePicture(data);\n }\n\n fetch_user(): Observable {\n return this.djangoService.user().pipe(\n map(data => new User().deserialize(data)),\n tap(user => {\n if (user.isStaff) {\n this.plausibleService.disable();\n }\n })\n );\n }\n\n userVerified(): Observable {\n return concat(\n of(true),\n this.fetch_user().pipe(map((user: User) => user.verified))\n );\n }\n\n profile(referralCode: string): Observable {\n return this.djangoService\n .profile(referralCode)\n .pipe(map(data => new PublicUser().deserialize(data)));\n }\n\n resendVerificationEmail() {\n return this.djangoService.resendVerificationEmail();\n }\n\n login(email: string, password: string) {\n const data = {\n email: email,\n password: password,\n };\n return this.djangoService\n .login(data)\n .pipe(map(data => this.handleLoginData(data)));\n }\n\n logout() {\n return this.isAuthenticated().pipe(\n switchMap(isAuthenticated =>\n isAuthenticated ? this.djangoService.logout() : of(null)\n ),\n tap(() => this.tokenStorageService.removeTokens())\n );\n }\n\n public requestPasswordReset(email: string): Observable {\n return this.djangoService.requestPasswordReset({ email: email });\n }\n\n public resetPassword(\n uid: string,\n token: string,\n password1: string,\n password2: string\n ) {\n const data = {\n uid: uid,\n token: token,\n new_password1: password1,\n new_password2: password2,\n };\n return this.djangoService.confirmPasswordReset(data);\n }\n\n public isAuthenticated(): Observable {\n return this.authenticationObservable;\n }\n\n public isStaff(): Observable {\n const isStaff = this.fetch_user().pipe(\n map((user: User) => user.isStaff)\n );\n return this.isAuthenticated().pipe(\n switchMap(isAuthenticated =>\n isAuthenticated ? isStaff : of(false)\n )\n );\n }\n\n public hasGroup(group: string): Observable {\n const hasGroup = this.fetch_user().pipe(\n map((user: User) => user.groups.includes(group))\n );\n return this.isAuthenticated().pipe(\n switchMap(isAuthenticated =>\n isAuthenticated ? hasGroup : of(false)\n )\n );\n }\n\n public hasAnyGroup(...groups: UserGroups[]): Observable {\n const hasGroup = this.fetch_user().pipe(\n map((user: User) =>\n groups.filter(group => user.groups.includes(group))\n )\n );\n return this.isAuthenticated().pipe(\n switchMap(isAuthenticated => (isAuthenticated ? hasGroup : of([])))\n );\n }\n\n private clearCache() {\n this.cache = null;\n }\n\n private handleLoginData(data: any) {\n this.tokenStorageService.storeTokens(data.access, data.refresh);\n return new User().deserialize(data.user);\n }\n}\n"],"mappings":"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","names":["PublicUser","deserialize","input","firstname","first_name","profilePicture","profile_picture","profilePictureThumbnail","profile_picture_thumbnail","FieldMapping","constructor","fieldMap","firstname","lastname","email","phonenumber","profilePicture","referralCode","credits","country","city","verified","travelMeaning","isStaff","groups","localLeaderTrips","reverseFieldMap","Object","keys","reduce","obj","key","User","mapField","field","reverseMapField","deserialize","input","value","entries","serialize","first_name","last_name","phone_number","profile_picture","JWT_OPTIONS","InjectionToken","JwtHelperService","config","str","output","chars","bc","bs","buffer","idx","c","token","parts","decoded","date","offsetSeconds","t","authScheme","request","__ngFactoryType__","ɵɵinject","ɵɵdefineInjectable","LOCALSTORAGE","InjectionToken","LocalStorageService","constructor","environmentService","window","dummyLocalStorage","clear","getItem","key","index","removeItem","setItem","value","length","isBrowser","navigator","cookieEnabled","localStorage","localStorageRef","ɵɵinject","EnvironmentService","WINDOW","factory","ɵfac","providedIn","TokenStorageService","constructor","djangoService","localStorage","platformId","JWT_TOKEN","REFRESH_TOKEN","tokenObservable","Observable","jwtHelper","JwtHelperService","subscriber","getJwtToken","isPlatformServer","console","log","next","complete","isJwtTokenExpired","isRefreshTokenExpired","error","logout","subscribe","removeTokens","refreshToken","token","err","getItem","getRefreshToken","storeJwtToken","jwt","setItem","storeRefreshToken","storeTokens","isTokenExpired","getToken","removeItem","data","refresh","pipe","httpRetry","tap","access","map","tokens","ɵɵinject","DjangoService","LOCALSTORAGE","PLATFORM_ID","factory","ɵfac","providedIn","Referral","deserialize","input","firstname","user","first_name","profilePicture","profile_picture_thumbnail","credit","ReferralService","constructor","djangoService","localStorage","REFERRAL_CODE","getReferralCode","getItem","storeReferralCode","code","setItem","referrals","pipe","map","data","referralData","Referral","deserialize","countReferral","referral_code","countReferralCode","ɵɵinject","DjangoService","LOCALSTORAGE","factory","ɵfac","providedIn","IdleCallbackService","constructor","environmentService","window","idle","idleCallBack","pipe","take","shareReplay","subscribe","timeout","Observable","observer","isBrowser","requestIdleCallback","next","complete","setTimeout","firstIdleCallback","ɵɵinject","EnvironmentService","WINDOW","factory","ɵfac","providedIn","PlausibleService","constructor","environmentService","idleCallbackService","window","platformId","localStorage","document","flag","isPlatformBrowser","plausible","trackEvent","name","props","disable","setItem","isActive","getItem","setup","isBrowser","getElementById","script","createElement","setAttribute","hostName","replace","onload","firstIdleCallback","subscribe","head","appendChild","ɵɵinject","EnvironmentService","IdleCallbackService","WINDOW","PLATFORM_ID","LOCALSTORAGE","DOCUMENT","factory","ɵfac","providedIn","UserGroups","UserService","constructor","djangoService","tokenStorageService","referralService","plausibleService","authenticationObservable","Observable","getToken","pipe","map","token","create","firstname","lastname","email","phonenumber","profile_picture","user","User","profilePicture","register","password1","password2","data","serialize","getReferralCode","handleLoginData","validateEmailExists","value","observable","emailExists","take","timer","switchMapTo","catchError","error","of","saveLocation","country","city","updateUser","inputData","backendData","key","Object","entries","mapField","clear_cache","saveProfilePicture","imageData","uploadProfilePicture","fetch_user","deserialize","tap","isStaff","disable","userVerified","concat","verified","profile","referralCode","PublicUser","resendVerificationEmail","login","password","logout","isAuthenticated","switchMap","removeTokens","requestPasswordReset","resetPassword","uid","new_password1","new_password2","confirmPasswordReset","hasGroup","group","groups","includes","hasAnyGroup","filter","clearCache","cache","storeTokens","access","refresh","ɵɵinject","DjangoService","TokenStorageService","ReferralService","PlausibleService","factory","ɵfac","providedIn"],"x_google_ignoreList":[2]}