import { Injectable } from '@angular/core'; import { Resolve } from '@angular/router'; import { ApplicantService } from '@core/services/auth-user/applicant.service'; import { MixpanelService } from '@core/services/mixpanel.service'; import { PortalDeterminationService } from '@core/services/portal-determination.service'; import { TokenService } from '@core/services/token/token.service'; import { Applicant } from '@core/typings/applicant.typing'; import { User } from '@core/typings/client-user.typing'; import { PortalTypes } from '@core/typings/token.typing'; import { ClientSettingsService } from '@features/client-settings/client-settings.service'; import { ClientUserService } from '@features/client-user/client-user.service'; import { UserService } from '../user.service'; @Injectable({ providedIn: 'root' }) export class UserResolver implements Resolve { constructor ( private tokenService: TokenService, private applicantService: ApplicantService, private clientUserService: ClientUserService, private portal: PortalDeterminationService, private mixpanel: MixpanelService, private userService: UserService, private clientSettingsService: ClientSettingsService ) { } async resolve () { let user: Applicant|User; const tokenContent = this.tokenService.parseJwt(); if (this.portal.isApply) { const applicant = await this.applicantService.getApplicant(true); this.userService.setApplicant(applicant); user = applicant; } else if (this.portal.isManager) { const clientUser = await this.clientUserService.getUser(true, true); user = clientUser; } else { const admin = this.tokenService.castTokenContentToUser(tokenContent); this.userService.setAdmin(admin); this.userService.setAdminPermissions(); user = admin; } const currency = this.userService.applicant ? this.userService.applicant.lastSelectedCurrency : null; this.userService.setLastSelectedCurrency(currency); const affiliateInfo = await this.getAffiliateInfo(this.portal.isApply); if (this.tokenService.hasImpersonationToken()) { this.mixpanel.register({ ...affiliateInfo, 'Is Impersonating': 'Yes', 'Impersonated First Name': user.firstName, 'Impersonated Last Name': user.lastName, 'Impersonated Email': user.email }); this.mixpanel.identify(PortalTypes.Admin + '-' +tokenContent.impersonated_by_user_id); } else { const portalType = this.portal.isApply ? PortalTypes.Applicant : this.portal.isManager ? PortalTypes.GrantManager : PortalTypes.Admin; this.mixpanel.identify(portalType + '-' + user.id); this.mixpanel.setProfile({ ...affiliateInfo, $first_name: user.firstName, $last_name: user.lastName, $name: user.firstName + ' ' + user.lastName, $email: user.email, 'Portal Type': portalType }); } } async getAffiliateInfo (isApplicantPortal: boolean) { if (isApplicantPortal) { const applicantAffiliateInfo = await this.applicantService.getClientAffiliateInfoWithFriendlyNames(); return applicantAffiliateInfo; } else { const managerAffiliateInfo = await this.clientUserService.getClientAffiliateInfoWithFriendlyNames( this.clientSettingsService?.clientBranding?.name ); return managerAffiliateInfo; } } }