UNPKG

portal-www

Version:

Nova Portal Website. Based on Next starter by Ueno

139 lines (108 loc) 3.35 kB
import { Cookies } from 'react-cookie'; import { decodeToken, isValid, refreshAuth } from 'beta/utils/auth'; import { action, computed, extendObservable, makeObservable, observable } from 'mobx'; import { SalesChannel } from 'typings/graphql'; export interface IAccount { ssn: string; subscriptionId: string; } export type SelectedLocationState = { salesLocation: string; salesChannel: string; }; export default class Authentication { constructor({ authentication = {} }, account: IAccount, c: string | object | null) { this.accountInput = account; this.cookies = new Cookies(c); makeObservable(this, { isLoggingOut: observable, staffSalesLocation: observable, isRefreshingAuth: observable, accountInput: observable, isTokenValid: computed, isStaff: computed, staffInStore: computed, setAccountInput: action, refresh: action, logout: action, }); extendObservable(this, authentication); } cookies; isLoggingOut = false; isRefreshingAuth = false; staffSalesLocation: SelectedLocationState | undefined = undefined; accountInput: IAccount; get token(): string { return this.cookies.get('token'); } get isTokenValid() { return this.token && isValid(this.token); } get isStaff() { return decodeToken(this.token)?.is_staff === 'true'; } get username() { return decodeToken(this.token)?.name; } get email() { return decodeToken(this.token)?.email; } get loggedInUserSsn() { return decodeToken(this.token)?.ssn; } get customerId() { return decodeToken(this.token)?.customer_id; } get isEmailLogin() { return decodeToken(this.token)?.amr.includes('email'); } get hasSalesLocation() { return this.staffSalesLocation?.salesChannel && this.staffSalesLocation.salesLocation; } get staffInStore() { return this.staffSalesLocation?.salesChannel === SalesChannel.Retail; } get isAudkenni() { return decodeToken(this.token)?.idp === 'audkenni'; } getSalesLocations() { const salesLocation = this.cookies.get('salesLocation'); const salesChannel = this.cookies.get('salesChannel'); this.setSalesLocation({ salesChannel, salesLocation }); } setSalesLocation = (selectedLocationState: SelectedLocationState) => { this.staffSalesLocation = selectedLocationState; if (selectedLocationState.salesLocation && selectedLocationState.salesChannel) { const expires = new Date(new Date().setFullYear(new Date().getFullYear() + 2)); this.cookies.set('salesLocation', selectedLocationState.salesLocation, { path: '/', secure: true, expires, }); this.cookies.set('salesChannel', selectedLocationState.salesChannel, { path: '/', secure: true, expires, }); } }; setAccountInput( ssn: string = this.accountInput?.ssn ?? '', subscriptionId: string = this.accountInput?.subscriptionId ?? '', ) { this.accountInput = { ssn, subscriptionId }; } refresh = (returnPath?: string) => { this.isRefreshingAuth = true; if (returnPath) { refreshAuth(this.token, returnPath); } else { refreshAuth(this.token); } }; logout = () => { this.isLoggingOut = true; this.cookies.remove('token', { path: '/' }); }; }