{"version":3,"file":"diContainer.90bf41c73c6494292724.bundle.js","mappings":"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","sources":["webpack://elc-service-vto/./node_modules/@estee/elc-base-theme/src/Breakpoints.ts","webpack://elc-service-vto/./src/internal/constants/Vto.ts","webpack://elc-service-vto/./src/internal/constants/VtoSkinCare.ts","webpack://elc-service-vto/./src/internal/constants/VtoSurvey.ts","webpack://elc-service-vto/./src/service-setup/ConfigStore.tsx","webpack://elc-service-vto/./src/internal/utils/getVtoMatchCookie.ts","webpack://elc-service-vto/./src/internal/utils/setVtoMatchCookie.ts","webpack://elc-service-vto/./src/internal/use-cases/BestMatchUseCase.ts","webpack://elc-service-vto/./src/service-setup/ServiceBusController.ts","webpack://elc-service-vto/./node_modules/@estee/elc-service/src/ViewController.ts","webpack://elc-service-vto/./src/internal/utils/UserAgent.ts","webpack://elc-service-vto/./src/internal/controllers/VtoBaseController.ts","webpack://elc-service-vto/./src/internal/constants/Survey.ts","webpack://elc-service-vto/./src/internal/utils/getVtoSurveyStorage.ts","webpack://elc-service-vto/./src/internal/utils/setVtoSurveyStorage.ts","webpack://elc-service-vto/./src/internal/use-cases/SurveyUseCase.ts","webpack://elc-service-vto/./src/internal/controllers/VtoViewController.ts","webpack://elc-service-vto/./src/internal/controllers/VtoCTAButtonViewController.ts","webpack://elc-service-vto/./src/internal/controllers/VtoSkinCareViewController.ts","webpack://elc-service-vto/./node_modules/@estee/elc-service/src/Api.ts","webpack://elc-service-vto/./src/api/QuizApiSdk.ts","webpack://elc-service-vto/./src/api/PersonalizationApiSdk.ts","webpack://elc-service-vto/./src/api/SurveyApiSdk.ts","webpack://elc-service-vto/./src/internal/domain/entities/VtoQuiz.ts","webpack://elc-service-vto/./src/internal/repositories/QuizApiRepository.ts","webpack://elc-service-vto/./src/internal/domain/entities/Personalization.ts","webpack://elc-service-vto/./src/internal/repositories/PersonalizationRepository.ts","webpack://elc-service-vto/./src/internal/domain/entities/UserInfo.ts","webpack://elc-service-vto/./src/internal/repositories/UserInfoRepository.ts","webpack://elc-service-vto/./src/internal/repositories/SurveyRepository.ts","webpack://elc-service-vto/./src/service-setup/diContainer.tsx","webpack://elc-service-vto/./node_modules/@estee/elc-service/src/decorators/Decorators.ts"],"sourcesContent":["export interface IBreakpoints {\n [key: string]: number;\n}\n\nexport const layoutPageContentWidth: number = 1260;\n\nexport const Breakpoints: IBreakpoints = {\n desktop: 768,\n largeScreen: 1024,\n extraLargeScreen: 1200\n};\n\nexport const breakpoint = (brp: string) => (\n code: TemplateStringsArray,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...placeholders: any[]\n) => {\n // interleave the code with the placeholders\n let result = placeholders.reduce((acc, holder, idx) => `${acc}${code[idx]}${holder}`, '');\n\n // add the code literal\n result = `${result}${code[code.length - 1]}`;\n\n return `@media(min-width: ${Breakpoints[brp]}px) {${result}}`;\n};\n","export const IFRAME_MIN_WIDTH = 300;\nexport const IFRAME_MAX_WIDTH = 600;\nexport const TIMEOUT_VALUE = 500;\nexport const IFRAME_EXTRA_PADDING = 30;\nexport const IFRAME_RATIO = 1.22;\nexport const SHADE_SIDEBAR_HEIGHT_RATIO = 0.7;\nexport const COMPARE_BUTTON_HEIGHT = 225;\nexport const SKIN_SMOOTH_STRENGTH = 50;\nexport const PIE_CHART_DEFAULT_VALUE = 1;\nexport const CUSTOM_SLIDES_TO_SHOW = 5;\nexport const CUSTOM_SLIDES_TO_SCROLL = 5;\nexport const VTO_GUID = 'guid';\nexport const NO_SCROLL_CLASS = 'no-scroll';\nexport const VTO_ACTIVE_CLASS = 'vto-active';\nexport const VTO_DISCLOSE_PARAM = 'vto_disclose';\nexport const VTO_HIDE_PRICE_PARAM = 'vto_disprice';\nexport const VTO_OPEN_PARAM = 'vto_open';\nexport const VTO_MATCHES_COOKIE_NAME = 'vtoMatches';\nexport const VTO_PERSONALIZATION_VERIFIED_COOKIE = 'vto.p13n.verified';\nexport const SHADE_SIDEBAR_CONTAINER = 'js-product-shade-info-wrapper';\nexport const LEFT_STICKY_COLUMN = 'js-left-sticky-column';\nexport const LEFT_COLUMN_SECTION = 'js-left-column-section';\nexport const PRODUCT_FULL_SECTION = 'js-product-full';\nexport const PERLGEM_USER_IDENTIFIER_TYPE = 'perlgem_user_id';\nexport const VTO = 'vto';\nexport const VTO_FOUNDATION = 'vtoFoundation';\nexport const VTO_MATCHES = 'vtoMatches';\nexport const API_REQUEST_TIMEOUT = 100;\nexport const DOWNLOAD_BAR_SIZE = 50;\nexport const DOWNLOAD_BAR_TOLERANCE = 0.3;\nexport const DOWNLOAD_BAR_VARIATION = 1;\n\nexport enum VtoEvents {\n CAMERA_CLOSED = 'cameraClosed',\n CAMERA_FAILED = 'cameraFailed',\n CAMERA_OPENED = 'cameraOpened',\n CLOSED = 'closed',\n COMPARE = 'compare',\n COMPARE_DISABLED = 'compareDisabled',\n ENGINE_CLOSED = 'engineClosed',\n KISS_DETECTED = 'kissDetected',\n LOADED = 'loaded',\n LOADING = 'loading',\n OPENED = 'opened',\n PHOTO_LOADED = 'photoLoaded',\n PHOTO_SAVED = 'photoSaved',\n RESET = 'reset',\n SHADE_FINDER_COMPLETED = 'shadeFinderCompleted',\n SHADE_FINDER_CANCELLED = 'shadeFinderCancelled',\n SHADE_FINDER_STARTED = 'shadeFinderStarted',\n SKIN_SHADE_FOUND = 'skinShadeFound',\n SPLIT_FOUR_WAY = 'splitFourWay',\n SPLIT_FOUR_WAY_DISABLED = 'splitFourWayDisabled',\n VIDEO_LOADED = 'videoLoaded',\n ZOOM = 'zoom'\n}\n\nexport enum FoundationShadeTypes {\n COOLER = 'cooler',\n LIGHTER = 'lighter',\n BEST = 'best',\n DARKER = 'darker',\n WARMER = 'warmer'\n}\n\nexport enum FoundationPairShadeTypes {\n CASUAL = 'casualPair',\n BEST = 'bestPair',\n GLAM = 'glamPair'\n}\n\nexport const foundationTabs = Object.freeze({\n allShadesTab: 'allShades',\n pairShadesTab: 'pairShades',\n perfectShadesTab: 'perfectShades'\n});\n\nexport enum VtoButtonTypes {\n ALL_SHADES = 'allShades',\n BEST_SHADES = 'bestShades'\n}\n\nexport enum VtoTypes {\n FOUNDATION = 'Foundation',\n MAKEUP = 'Makeup',\n SKINCARE = 'Skincare'\n}\n\nexport const LOADING_PERCENTAGE_EVENT_TRIGGERED = 10;\n","export const IFRAME_MIN_HEIGHT = 500;\nexport const SKIN_CARE_MODE = 'capture';\nexport const FACE_CONCERN_PARAM = 'face_concern';\nexport const EYE_CONCERN_PARAM = 'eye_concern';\nexport const SKIN_TYPE_PARAM = 'skin_type';\nexport const SKIN_TYPE_VALUE = 'Normal / Combo';\nexport const DEFAULT_LOCALE = 'en_US';\nexport const DRUPAL_API_TOKEN = '0709040f8da71ca45eceb1ab8f2d8c5a';\nexport const DRUPAL_API_FIELDS = '+rendered,+attached';\nexport const SKU_ITEM = 'sku';\nexport const PRODUCT_ITEM = 'product';\nexport const REVISION_TAG_COOKIE = 'ELC_SITE_TAG';\nexport const LOCALE_COOKIE = 'LOCALE';\nexport const SCROLL_TIMEOUT = 100;\nexport const OFFSET_HEIGHT = 50;\nexport const SCROLL_BEHAVIOR_SMOOTH = 'smooth';\nexport const SCROLL_BLOCK_START = 'start';\nexport const EDITORIAL_NODE_KEY = 'skinCareEditorialNode';\nexport const SHOPPABLE_QUERY_PARAM = 'shop';\nexport const NON_SHOPPABLE_QUERY_VALUE = '0';\n\nexport enum VtoSkinCareEvents {\n CAMERA_CLOSED = 'cameraClosed',\n CAMERA_FAILED = 'cameraFailed',\n CAMERA_OPENED = 'cameraOpened',\n CLOSED = 'closed',\n LOADED = 'loaded',\n LOADING = 'loading',\n OPENED = 'opened',\n SKIN_ANALYSIS_STARTED = 'skinAnalysisStarted',\n SKIN_ANALYSIS_FINISHED = 'skinAnalysisFinished',\n SKIN_BACK_TO_DETECTING = 'skinBackToDetecting',\n VIDEO_LOADED = 'videoLoaded'\n}\n\nexport enum FaceConcerns {\n linesAndWrinkles = 'lines_and_wrinkles',\n spot = 'spot',\n texture = 'texture',\n redness = 'redness'\n}\n\nexport enum EyeConcerns {\n wrinkleEyes = 'wrinkle_eyes',\n darkCircle = 'dark_circle'\n}\n\nexport enum OtherConcerns {\n wrinkleForehead = 'wrinkle_forehead',\n wrinkleLowerFace = 'wrinkle_lower_face'\n}\n\nexport enum QuizApiConcerns {\n linesAndWrinkles = 'Lines and Wrinkles',\n spot = 'Dark Spots',\n texture = 'Uneven Texture',\n redness = 'Irritation/Redness',\n wrinkleEyes = 'Fewer Lines/ Wrinkles',\n darkCircle = 'Brighten Dark Circles'\n}\n\nexport const blockPositionMapping: {\n [key: string]: string;\n} = Object.freeze({\n productGrid: 'productGridPosition',\n crosssellNode: 'crosssellNodePosition',\n extraCareNode: 'extraCareNodePosition',\n skinDiagramNode: 'skinDiagramNodePosition',\n skincareRegimenNode: 'skinCareRegimenNodePosition',\n skinTipsNode: 'skinTipsNodePosition',\n skinCareEditorialNode: 'skinCareEditorialNodePosition'\n});\n\nexport const LOADING_PERCENTAGE_EVENT_TRIGGERED = 10;\n","import { ISurveyData } from '~api/SurveyApiSdk';\n\nexport const VTO_SURVEY_DISCLAIMER = 'vto-survey-overlay-disclaimer';\nexport const VTO_SURVEY_QUESTION1_TITLE = 'vto-survey-question1-title';\nexport const VTO_SURVEY_END_MESSAGE = 'vto-survey-end-message';\n// generated the array of numbers from 0 to 10\nexport const SURVEY_BUTTONS_DATA: number[] = [...Array(11).keys()];\nexport const CLOSE_SURVEY_TIMEOUT = 3000;\n\nexport const SURVEY_BUTTONS_WRAPPER = 'vto-survey-buttons-wrapper';\nexport const SURVEY_BUTTON = 'vto-survey-button';\n\nexport const FORM_DATA_FIELD = Object.freeze({\n USER_IDENTIFIER_FIELD: 'entry.1767715272',\n PAGE_FIELD: 'entry.107238290',\n VTO_TYPE_FIELD: 'entry.2017070630',\n NP_FIELD: 'entry.1596679860',\n COMMENT_FIELD: 'entry.1094555031'\n});\n\nexport const GOOGLE_FORMS_URL =\n 'https://docs.google.com/forms/d/e/1FAIpQLScKp12Vt-BAn53_Jkuy6xwTaTobcznksaKrxRFAuAoG2b30pA/formResponse';\n\nexport const MOCK_SURVEY_DATA: ISurveyData = {\n np: '10',\n comment: 'vto is awesome',\n userIdentifier: '1292791192',\n page:\n 'https://e.esteelauder.na.us.vmicu.eng.ncsa9.elcdev.net/product/649/29657/product-catalog/makeup/lips/lipstick/pure-color-envy/sculpting-lipstick',\n vtoType: 'Makeup'\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { observable, action } from 'mobx';\n\nexport class ConfigStore {\n @observable public config: any = {};\n\n constructor(config: any) {\n this.updateConfig(config);\n }\n\n @action\n public updateConfig(config: any) {\n this.config = { ...config };\n }\n}\n","import { BrowserStorage } from '@estee/elc-universal-utils';\nimport { VTO_MATCHES_COOKIE_NAME } from '../constants/Vto';\n\nexport const getVtoMatchCookie = () => {\n return BrowserStorage.getItem(VTO_MATCHES_COOKIE_NAME);\n};\n","import { BrowserStorage } from '@estee/elc-universal-utils';\nimport { VTO_MATCHES_COOKIE_NAME } from '../constants/Vto';\nimport { IVtoMatchCookie } from '../interfaces/IVto';\nimport { getVtoMatchCookie } from './getVtoMatchCookie';\n\ninterface ISetVtoMatchCookie {\n shadeMatches: IVtoMatchCookie;\n shouldOverride: boolean;\n}\n\nexport const setVtoMatchCookie = (params: ISetVtoMatchCookie) => {\n let formerShadeMatches = {};\n\n const { shadeMatches, shouldOverride } = params;\n\n const shadeMatchCookie = getVtoMatchCookie();\n\n if (shadeMatchCookie) {\n try {\n formerShadeMatches = JSON.parse(shadeMatchCookie);\n } catch (e) {\n console.warn(e);\n }\n }\n\n const newShadeMatches = shouldOverride\n ? { ...formerShadeMatches, ...shadeMatches }\n : { ...shadeMatches, ...formerShadeMatches };\n\n BrowserStorage.setItem(VTO_MATCHES_COOKIE_NAME, JSON.stringify(newShadeMatches));\n};\n","import { ELCLogger, TriggerType } from '@estee/elc-logging';\nimport { BrowserStorage } from '@estee/elc-universal-utils';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/VtoService';\nimport { VTO_MATCHES, VTO, VTO_PERSONALIZATION_VERIFIED_COOKIE } from '~constants/Vto';\nimport { Personalization } from '~domain/entities/Personalization';\nimport { IVtoMatchCookie } from '~interfaces/IVto';\nimport { PersonalizationRepository } from '~repositories/PersonalizationRepository';\nimport { UserInfoRepository } from '~repositories/UserInfoRepository';\nimport { setVtoMatchCookie } from '~utils/setVtoMatchCookie';\nimport { getVtoMatchCookie } from '~utils/getVtoMatchCookie';\nimport { IConfig } from '~interfaces/IConfig';\n\ninterface IBestMatchUseCase {\n productId: string;\n}\n\nconst { name: serviceName, version: serviceVersion } = __serviceInfo__;\n\nexport class BestMatchUseCase {\n private personalizationRepository: PersonalizationRepository;\n private userInfoRepository: UserInfoRepository;\n private productId: string;\n private logger: ELCLogger;\n private configStore: IConfig;\n\n constructor(payload: IBestMatchUseCase) {\n this.personalizationRepository = diContainer.get(serviceNames.personalizationRepository);\n this.userInfoRepository = diContainer.get(serviceNames.userInfoRepository);\n this.configStore = diContainer.get(serviceNames.configStore);\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n this.productId = payload.productId;\n }\n\n public execute = async () => {\n if (!this.isSaveMatchEnabled) {\n return null;\n }\n\n const isPersonalizationVerified = this.getPersonalizationVerifiedCookie();\n\n if (!isPersonalizationVerified) {\n await this.storePersonalizedDataToCookie();\n }\n\n const cookie = getVtoMatchCookie();\n\n return cookie && this.getBestMatchSkuId(cookie);\n };\n\n private get isSaveMatchEnabled() {\n const vtoFeature = this.configStore.config?.vtoConfig?.vtoFeature;\n\n return vtoFeature?.foundation?.isSaveMatchEnabled;\n }\n\n private async storePersonalizedDataToCookie() {\n const userMatches = await this.fetchPersonalizedData();\n if (userMatches && Object.keys(userMatches).length > 0) {\n setVtoMatchCookie({ shadeMatches: userMatches, shouldOverride: false });\n }\n }\n\n private getBestMatchSkuId(shadeMatchCookie: string) {\n let shadeMatches: IVtoMatchCookie = {};\n\n try {\n shadeMatches = JSON.parse(shadeMatchCookie);\n } catch (e) {\n console.warn(e);\n }\n\n const shadeMatch = shadeMatches[this.productId];\n\n return shadeMatch && shadeMatch.userSelectedMatch;\n }\n\n private async fetchPersonalizedData() {\n let userId;\n try {\n userId = await this.userInfoRepository.getUserId();\n if (!userId) {\n return;\n }\n\n const data = await this.personalizationRepository.getPersonalizationDataByPerlgemUserId(\n [VTO_MATCHES],\n userId\n );\n\n this.setPersonalizationVerifiedCookie();\n\n if (Array.isArray(data)) {\n return this.getPersonalizedData(data);\n }\n } catch (e) {\n userId && this.setPersonalizationVerifiedCookie();\n\n this.logger.error({\n triggerType: TriggerType.api,\n message: `${e}`\n });\n }\n }\n\n private getPersonalizedData(data: Personalization[]) {\n const personalizedData = data\n .filter((match) => match.tags.includes(VTO))\n\n .sort(\n (a, b) => new Date(a.creationDate).valueOf() - new Date(b.creationDate).valueOf()\n );\n\n return this.getProcessedPersonalizedData(personalizedData);\n }\n\n private getProcessedPersonalizedData(data: Personalization[]) {\n try {\n return data.reduce((acc: IVtoMatchCookie, match) => {\n const userMatches = JSON.parse(match.userPersonalizationData);\n\n // backend wraps matches into zeroth array\n const personalizedData = userMatches?.[VTO_MATCHES]?.[0];\n\n if (personalizedData && personalizedData.userSelectedMatch) {\n const { productId, userSelectedMatch, recommendations } = personalizedData;\n\n acc[productId] = {\n userSelectedMatch,\n recommendations,\n productId\n };\n }\n\n return acc;\n }, {});\n } catch (e) {\n this.logger.error({\n triggerType: TriggerType.runtimeError,\n message: `${e}`\n });\n }\n }\n\n private setPersonalizationVerifiedCookie() {\n BrowserStorage.setItem(VTO_PERSONALIZATION_VERIFIED_COOKIE, '1');\n }\n\n private getPersonalizationVerifiedCookie() {\n return BrowserStorage.getItem(VTO_PERSONALIZATION_VERIFIED_COOKIE);\n }\n}\n","import { BestMatchUseCase } from '../internal/use-cases/BestMatchUseCase';\n\ninterface IBestMatchPayload {\n productId: string;\n}\nexport class ServiceBusController {\n public getBestMatchSkuId = async (payload: IBestMatchPayload) => {\n const bestMatchUseCase = new BestMatchUseCase(payload);\n\n return bestMatchUseCase.execute();\n };\n}\n","import { observable } from 'mobx';\nimport {\n IComponentViewController,\n IViewControllerData,\n ViewControllerLoadedMethod\n} from '@estee/elc-universal-utils';\n\nexport class ViewController implements IComponentViewController {\n public id?: string;\n public dataState?: IViewControllerData;\n public loaded?: ViewControllerLoadedMethod;\n public configMergeStrategy?: Function;\n @observable public isLoading: boolean = true;\n\n public setSSRState = (data?: IViewControllerData) => {\n this.dataState = data;\n };\n\n public setId = (id?: string) => {\n this.id = id && btoa(unescape(encodeURIComponent(id)));\n };\n\n public get data(): IViewControllerData {\n return {};\n }\n}\n","export interface IVtoWindow extends Window {\n MSStream: unknown;\n}\n\ndeclare let window: IVtoWindow;\n\nconst userAgent = navigator.userAgent;\n\nexport const isIOS = () => {\n return /iPad|iPhone/.test(userAgent) && !window.MSStream;\n};\n\nexport const isUserMediaEnabled = () => {\n return !!navigator.mediaDevices?.getUserMedia;\n};\n\nexport const isSafari = () => {\n return (\n /safari/i.test(userAgent) &&\n !/chrome/i.test(userAgent) &&\n !/crios/i.test(userAgent) &&\n !/fxios/i.test(userAgent)\n );\n};\n","import { computed, action, observable } from 'mobx';\nimport { Breakpoints } from '@estee/elc-base-theme';\nimport { ViewController } from '@estee/elc-service';\nimport { emit, events, on, query, serviceQueries } from '@estee/elc-service-bus';\nimport { root } from '@estee/elc-universal-utils';\nimport * as VtoConstants from '~constants/Vto';\nimport * as VtoSkinCareConstants from '~constants/VtoSkinCare';\n\nimport {\n IVtoConfig,\n IProduct,\n IVtoEventListenerResult,\n IVtoFoundationShadeLabels,\n IVtoFoundationPerfectMatches,\n ISku\n} from '~interfaces/IVto';\nimport { IVtoSkinCareHandlerResult, IVtoSkinConcernScores } from '~interfaces/IVtoSkinCare';\nimport { IFeature } from '~constants/Features';\nimport { isIOS, isSafari, isUserMediaEnabled } from '~utils/UserAgent';\n\nexport interface IVtoApiMethods {\n init({}): void;\n open(liveCam: boolean, image: object | null, detectSkin: boolean): void;\n closeEngine(): void;\n close(): void;\n applyMakeupBySku(skuId: string): void;\n addEventListener(\n event: string,\n callback: (result: IVtoEventListenerResult | IVtoSkinConcernScores) => void\n ): number;\n removeEventListener(listenerId: number): void;\n openSkincare(skincareMode: string): void;\n getSkincareRecommendationList({}): void;\n}\n\nexport interface IVtoWindow extends Window {\n ymkAsyncInit(): void;\n YMK: IVtoApiMethods;\n}\n\ntype VtoEventsType = typeof VtoConstants.VtoEvents | typeof VtoSkinCareConstants.VtoSkinCareEvents;\ninterface ICallbackHandlers {\n [key: string]: (result: IVtoEventListenerResult | IVtoSkinCareHandlerResult) => void;\n}\n\ndeclare let window: IVtoWindow;\n\nexport class VtoBaseController extends ViewController {\n @observable public product: IProduct;\n @observable public isVtoOpened: boolean = false;\n @observable public isSupportedBrowserOverlayVisible: boolean = false;\n @observable public isSupportedBrowserOverlayOpen: boolean = true;\n public isVtoFoundationEnabled: boolean;\n public isVtoMakeupEnabled: boolean;\n public vtoFoundationPerfectMatchText: IVtoFoundationShadeLabels;\n public handleShadeSelect: (name: string, eventLabel: string) => void;\n public bodyElementClass: DOMTokenList = document.body.classList;\n public eventListenerIdentifiers: number[] = [];\n public iframeWidth: number;\n public iframeHeight: number;\n public vtoConfig: IVtoConfig;\n public isVtoDisclosed: boolean = false;\n public isVtoPriceHidden: boolean = false;\n public isVtoFoundationMultiIds: boolean;\n public hasShadeSidebarVto: boolean = false;\n public productIdList: string[];\n private previousWindowHeight: number;\n static isFoundationQrCodeOverlayOpen = false;\n\n @computed\n get vtoFeature() {\n return this.vtoConfig && this.vtoConfig.vtoFeature;\n }\n\n @computed\n get vtoFoundationFeature() {\n return this.vtoFeature && this.vtoFeature.foundation;\n }\n\n @computed\n get vtoMakeupFeature() {\n return this.vtoFeature && this.vtoFeature.makeup;\n }\n\n @action\n public setIsOpenedState = (isOpened: boolean) => {\n this.isVtoOpened = isOpened;\n };\n\n @computed\n public get getVtoApiConfig() {\n if (!this.vtoConfig || !this.vtoConfig.features) {\n return;\n }\n\n if (this.isVtoFoundationEnabled) {\n return this.vtoConfig.features.vtoFoundation;\n }\n\n return this.vtoConfig.features.vtoMakeup;\n }\n\n public loadVto = (apiUrl: string, apiKey: string) => {\n if (!!document.querySelector(`script[src=\"${apiUrl}${apiKey}\"]`)) {\n return;\n }\n const script = document.getElementsByTagName('script')[0];\n const vtoScript = document.createElement('script');\n vtoScript.type = 'text/javascript';\n vtoScript.async = true;\n vtoScript.src = `${apiUrl}${apiKey}`;\n if (script !== undefined && script.parentNode !== null) {\n script.parentNode.insertBefore(vtoScript, script);\n }\n };\n\n public getIframeBgColor = () => {\n const vtoMakeupIframeColor = this.vtoConfig.vtoFeature?.makeup?.iframeColor;\n if (this.vtoConfig.vtoFeature?.makeup?.makeupVariant && vtoMakeupIframeColor) {\n return vtoMakeupIframeColor;\n }\n };\n\n public isFourWayLooksEnabled = () => {\n const hasFourWayLooks = this.vtoConfig.vtoFeature?.makeup?.hasFourWayLooks;\n const sppContainer = document.getElementsByClassName('js-spp-content');\n const isVtoMakeupFourWayLooksEnabled = sppContainer[0]?.getAttribute(\n 'data-enable-four-way-looks'\n );\n const isMakeupVariant = this.vtoConfig.vtoFeature?.makeup?.makeupVariant;\n\n return isMakeupVariant && hasFourWayLooks && isVtoMakeupFourWayLooksEnabled === 'true';\n };\n\n public getIframeDimension = () => {\n const imageContainer = this.getImageContainer();\n const imageContainerWidth = (imageContainer as HTMLElement).offsetWidth;\n\n // Reduce extra padding for larger screens\n const imageContainerModifiedWidth =\n window.innerWidth >= Breakpoints.desktop\n ? imageContainerWidth - VtoConstants.IFRAME_EXTRA_PADDING\n : imageContainerWidth;\n\n let iframeWidth = imageContainerModifiedWidth;\n\n // Set max width if the container exceeds max width\n if (imageContainerModifiedWidth > VtoConstants.IFRAME_MAX_WIDTH) {\n iframeWidth = VtoConstants.IFRAME_MAX_WIDTH;\n }\n\n // Set min width if the container width is lesser than the min width\n if (imageContainerModifiedWidth < VtoConstants.IFRAME_MIN_WIDTH) {\n iframeWidth = VtoConstants.IFRAME_MIN_WIDTH;\n }\n\n // Calculate height using VTO ratio\n let iframeHeight = iframeWidth * VtoConstants.IFRAME_RATIO;\n\n if (this.hasShadeSidebarVto) {\n [iframeWidth, iframeHeight] = this.getShadeSidebarVtoDimension(\n iframeWidth,\n iframeHeight\n );\n }\n\n return {\n iframeWidth,\n iframeHeight\n };\n };\n\n private getImageContainer() {\n const desktopSelectorClass = this.hasShadeSidebarVto\n ? VtoConstants.SHADE_SIDEBAR_CONTAINER\n : VtoConstants.LEFT_STICKY_COLUMN;\n\n const desktopSelector =\n document.querySelector(`.${desktopSelectorClass}`) ||\n document.querySelector(`.${VtoConstants.LEFT_COLUMN_SECTION}`);\n\n if (window.innerWidth >= Breakpoints.desktop) {\n return desktopSelector;\n }\n\n return document.querySelector(`.${VtoConstants.PRODUCT_FULL_SECTION}`);\n }\n\n private getShadeSidebarVtoDimension(iframeWidth: number, iframeHeight: number) {\n const {\n SHADE_SIDEBAR_CONTAINER,\n IFRAME_MAX_WIDTH,\n IFRAME_RATIO,\n SHADE_SIDEBAR_HEIGHT_RATIO,\n IFRAME_MIN_WIDTH\n } = VtoConstants;\n\n const shadeSidebarInfo = document.querySelector(`.${SHADE_SIDEBAR_CONTAINER}`);\n\n if (!shadeSidebarInfo) {\n return [iframeWidth, iframeHeight];\n }\n\n const shadeSidebarInfoWidth = (shadeSidebarInfo as HTMLElement).offsetWidth;\n const iframeMaxHeight = IFRAME_MAX_WIDTH * IFRAME_RATIO;\n const heightDifference = this.previousWindowHeight - window.innerHeight;\n const [downloadBarMin, downloadBarMax] = this.downloadBarVariation;\n\n // Calculate shade sidebar overlay height using its ratio\n let shadeSidebarHeight = window.innerHeight * SHADE_SIDEBAR_HEIGHT_RATIO;\n\n // Don't change the height when the download bar appears at the bottom of Chrome browser\n if (heightDifference >= downloadBarMin && heightDifference <= downloadBarMax) {\n shadeSidebarHeight = this.previousWindowHeight * SHADE_SIDEBAR_HEIGHT_RATIO;\n }\n\n this.previousWindowHeight = window.innerHeight;\n\n // Sometimes, mainly in iPad, shadeSidebarHeight might be larger than iframe's max height.\n // In this case, iframeMaxHeight should be taken instead of shadeSidebarHeight\n let shadeSidebarIframeHeight =\n shadeSidebarHeight < iframeMaxHeight ? shadeSidebarHeight : iframeMaxHeight;\n\n // Since the overlay is fixed and non-scrollable, we should give precedence to height over width and\n // so width is being calculated based on height\n let shadeSidebarIframeWidth = shadeSidebarIframeHeight / IFRAME_RATIO;\n\n // The above calculated width should not exceed the shadeSidebarInfo width and should not be\n // lesser than min width\n if (shadeSidebarIframeWidth > shadeSidebarInfoWidth) {\n shadeSidebarIframeWidth = shadeSidebarInfoWidth;\n shadeSidebarIframeHeight = shadeSidebarIframeWidth * IFRAME_RATIO;\n }\n\n if (shadeSidebarIframeWidth < IFRAME_MIN_WIDTH) {\n shadeSidebarIframeWidth = IFRAME_MIN_WIDTH;\n shadeSidebarIframeHeight = shadeSidebarIframeWidth * IFRAME_RATIO;\n }\n\n return [shadeSidebarIframeWidth, shadeSidebarIframeHeight];\n }\n\n private get downloadBarVariation() {\n const { DOWNLOAD_BAR_SIZE, DOWNLOAD_BAR_TOLERANCE, DOWNLOAD_BAR_VARIATION } = VtoConstants;\n\n const downloadBarMinSize =\n DOWNLOAD_BAR_SIZE * (DOWNLOAD_BAR_VARIATION - DOWNLOAD_BAR_TOLERANCE);\n const downloadBarMaxSize =\n DOWNLOAD_BAR_SIZE * (DOWNLOAD_BAR_VARIATION + DOWNLOAD_BAR_TOLERANCE);\n\n return [downloadBarMinSize, downloadBarMaxSize];\n }\n\n public handleVtoResize = (reset: boolean) => {\n const hasLipVto = this.vtoFoundationFeature && this.vtoFoundationFeature.hasLipVto;\n if (hasLipVto) {\n const iframe = document.getElementById('YMK-module-iframe');\n const maxHeight = window.innerHeight;\n const compareOverlayOffset =\n this.vtoFoundationFeature && this.vtoFoundationFeature.compareOverlayOffset;\n\n if (iframe && compareOverlayOffset) {\n iframe.style.height = reset\n ? `${maxHeight}px`\n : `${maxHeight - compareOverlayOffset}px`;\n }\n }\n };\n\n public getVtoParams = () => {\n const compareOverlayOffset =\n this.vtoFoundationFeature && this.vtoFoundationFeature.compareOverlayOffset;\n const bottomPanelOffsetY = compareOverlayOffset || VtoConstants.COMPARE_BUTTON_HEIGHT;\n const isDesktop = window.innerWidth >= Breakpoints.desktop;\n const { iframeWidth, iframeHeight } = this.getIframeDimension();\n const { language } = this.getVtoApiConfig;\n const sppContainer = document.getElementsByClassName('js-spp-content');\n const iframeColor = sppContainer[0]?.getAttribute('data-style-color');\n const styleColor = !!iframeColor && this.getIframeBgColor() ? this.getIframeBgColor() : '';\n const enableFourWay = this.isFourWayLooksEnabled();\n const enableFBSharing = this.vtoConfig.vtoFeature?.makeup?.hasFBSharing;\n const enableTwitterSharing = this.vtoConfig.vtoFeature?.makeup?.hasTwitterSharing;\n const enablePinterestSharing = this.vtoConfig.vtoFeature?.makeup?.hasPinterestSharing;\n const skinSmoothStrength = this?.vtoFoundationFeature?.skinSmoothStrength;\n this.iframeWidth = iframeWidth;\n this.iframeHeight = iframeHeight;\n\n if (this.isVtoFoundationEnabled) {\n return {\n autoOpen: false,\n showCloseBtnOnLauncher: true,\n bottomPanelOffsetY: bottomPanelOffsetY,\n ...(this.isVtoFoundationMultiIds && {\n productIdList: this.productIdList\n }),\n ...(language && { language }),\n ...(typeof skinSmoothStrength === 'number' && skinSmoothStrength >= 0 && { skinSmoothStrength: Math.max(0, Math.min(skinSmoothStrength, 100)) })\n };\n }\n\n return {\n autoOpen: true,\n skinSmoothStrength: VtoConstants.SKIN_SMOOTH_STRENGTH,\n showCloseBtnOnLauncher: !this.isVtoDisclosed,\n width: isDesktop ? iframeWidth : '',\n height: isDesktop ? iframeHeight : '',\n styleColor: styleColor,\n ...(enableFourWay && {\n enableFourWayLooks: enableFourWay\n }),\n ...(!enableFBSharing && { enableFBSharing }),\n ...(!enableTwitterSharing && { enableTwitterSharing }),\n ...(!enablePinterestSharing && { enablePinterestSharing }),\n ...(language && { language })\n };\n };\n\n public filterPerfectMatches = (perfectMatchResults: IVtoFoundationPerfectMatches) => {\n const vtoFoundationShadeValues = Object.values(VtoConstants.FoundationShadeTypes);\n\n return Object.entries(perfectMatchResults).reduce(\n (perfectMatchAccumulator, [label, skuId]) => {\n // VTO sends us the best shade in the name of \"guid\"\n const shadeLabel =\n label === VtoConstants.VTO_GUID\n ? VtoConstants.FoundationShadeTypes.BEST\n : (label as VtoConstants.FoundationShadeTypes);\n if (vtoFoundationShadeValues.indexOf(shadeLabel) > -1) {\n perfectMatchAccumulator[skuId] = this.vtoFoundationPerfectMatchText[shadeLabel];\n }\n\n return perfectMatchAccumulator;\n },\n {} as IVtoFoundationPerfectMatches\n );\n };\n\n public updateShadeEntity = (perfectMatches: IVtoFoundationPerfectMatches) => {\n const perfectMatchSkuIds = Object.keys(perfectMatches);\n this.product.shades.forEach((shade) => {\n if (shade.parentSku && perfectMatchSkuIds.indexOf(shade.parentSku.skuId) > -1) {\n const perfectShadeLabel = perfectMatches[shade.parentSku.skuId];\n shade.changeToPerfect && shade.changeToPerfect(perfectShadeLabel);\n } else {\n shade.resetPerfect && shade.resetPerfect();\n shade.showNameInsideShadeCircle && shade.showNameInsideShadeCircle();\n }\n });\n };\n\n public selectPerfectSku = async (result?: IVtoFoundationPerfectMatches) => {\n // VTO sends us the best shade in the name of \"guid\"\n const skuId = result && result[VtoConstants.VTO_GUID];\n\n if (skuId) {\n const productData = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [skuId] } }\n });\n\n const skuData = productData[0].skus.find((sku) => sku.skuId === skuId);\n\n const { shades } = skuData;\n const eventLabel = `${productData[0].productId} - ${productData[0].skus[0].perlgem.SKU_BASE_ID} - ${productData[0].displayName}`;\n\n if (this.handleShadeSelect) {\n this.handleShadeSelect(shades[0].name, eventLabel);\n }\n }\n };\n\n public selectFirstSku = async (skuId?: string) => {\n if (skuId) {\n const productData = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [skuId] } }\n });\n\n const skuData = productData[0].skus.find((sku) => sku.skuId === skuId);\n\n const { shades } = skuData;\n const eventLabel = `${productData[0].productId} - ${productData[0].skus[0].perlgem.SKU_BASE_ID} - ${productData[0].displayName}`;\n\n if (this.handleShadeSelect) {\n this.handleShadeSelect(shades[0].name, eventLabel);\n }\n }\n };\n\n public resetShadeProps = () => {\n if (this.isVtoMakeupEnabled) {\n return;\n }\n\n this.product.shades.forEach((shade) => shade.resetPerfect && shade.resetPerfect());\n };\n\n public addEventListeners = (vtoEvents: VtoEventsType, callback: ICallbackHandlers) => {\n if (typeof window.YMK !== 'object' || this.eventListenerIdentifiers.length) {\n return;\n }\n Object.values(vtoEvents).forEach((event) => {\n const eventListenerIdentifier = window.YMK.addEventListener(event, (result) =>\n callback[event](result as IVtoEventListenerResult)\n );\n this.eventListenerIdentifiers.push(eventListenerIdentifier);\n });\n };\n\n public removeVtoEventListeners = () => {\n if (!this.eventListenerIdentifiers.length) {\n return;\n }\n\n this.eventListenerIdentifiers.forEach((eventListenerIdentifier) =>\n window.YMK.removeEventListener(eventListenerIdentifier)\n );\n this.eventListenerIdentifiers = [];\n };\n\n public toggleBodyClasses = (hasBodyClasses: boolean) => {\n const isMobile = window.innerWidth < Breakpoints.desktop;\n const bodyClasses = [VtoConstants.NO_SCROLL_CLASS, VtoConstants.VTO_ACTIVE_CLASS];\n isMobile && hasBodyClasses\n ? this.bodyElementClass.add(...bodyClasses)\n : this.bodyElementClass.remove(...bodyClasses);\n };\n\n public checkVtoDisclose = () => {\n const vtoDiscloseParam = this.getQueryParam(VtoConstants.VTO_DISCLOSE_PARAM);\n this.isVtoDisclosed = vtoDiscloseParam !== null;\n };\n\n public checkVtoHidePriceParam = () => {\n const vtoHidePriceParam = this.getQueryParam(VtoConstants.VTO_HIDE_PRICE_PARAM);\n this.isVtoPriceHidden = vtoHidePriceParam !== null;\n };\n\n public getQueryParam = (searchKey: string) => {\n const search = (root.location).search;\n const urlParams = new URLSearchParams(search);\n\n return urlParams.get(searchKey);\n };\n\n get isSupportedBrowserUserAgent() {\n return isIOS() && !isSafari() && !isUserMediaEnabled();\n }\n\n public showSupportedBrowserOverlay = () => {\n this.setIsSupportedBrowserOverlayVisible(true);\n this.openSupportedBrowserOverlay();\n };\n\n public closeSupportedBrowserOverlay = (vtoType: VtoConstants.VtoTypes) => {\n this.setIsSupportedBrowserOverlayOpen(false);\n emit(events.VTO_CLOSED, { vtoType });\n };\n\n private openSupportedBrowserOverlay = () => {\n this.setIsSupportedBrowserOverlayOpen(true);\n };\n\n @action\n public setIsSupportedBrowserOverlayVisible = (isEnabled: boolean) => {\n this.isSupportedBrowserOverlayVisible = isEnabled;\n };\n\n @action\n public setIsSupportedBrowserOverlayOpen = (isOpened: boolean) => {\n this.isSupportedBrowserOverlayOpen = isOpened;\n };\n\n @on(events.VTO_OPENED)\n public openVTO = () => {\n this.setIsOpenedState(true);\n };\n\n @on(events.VTO_CLOSED)\n public closeVTO = () => {\n this.setIsOpenedState(false);\n };\n}\n","import { VtoTypes } from './Vto';\n\nexport const VTO_SURVEY_STORAGE_KEY = 'vto.survey';\nexport const PERLGEM_USER_ID = 'perlgem-user-id';\nexport const SESSION_ID = 'session-id';\n\nexport const surveyTypes = {\n [VtoTypes.FOUNDATION]: 'survey-vto-foundation',\n [VtoTypes.MAKEUP]: 'survey-vto-makeup',\n [VtoTypes.SKINCARE]: 'survey-vto-skincare'\n};\n","import { BrowserStorage } from '@estee/elc-universal-utils';\nimport { VTO_SURVEY_STORAGE_KEY } from '../constants/Survey';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\n\nconst { name: serviceName, version: serviceVersion } = __serviceInfo__;\n\nexport const getVtoSurveyStorage = (vtoType?: string) => {\n const storage = BrowserStorage.getItem(VTO_SURVEY_STORAGE_KEY);\n let surveyStorage;\n const logger = new ELCLogger({ serviceName, serviceVersion });\n\n if (storage) {\n try {\n surveyStorage = JSON.parse(storage);\n\n return vtoType ? surveyStorage[vtoType] : surveyStorage;\n } catch (error) {\n logger.warning({\n triggerType: TriggerType.api,\n payload: { error },\n message: `${error.message}`\n });\n }\n }\n};\n","import { BrowserStorage } from '@estee/elc-universal-utils';\nimport { VTO_SURVEY_STORAGE_KEY } from '../constants/Survey';\nimport { VtoTypes } from '../constants/Vto';\nimport { ISurveyStorage, ISurveyStorageValues } from '../interfaces/ISurvey';\nimport { getVtoSurveyStorage } from './getVtoSurveyStorage';\n\ninterface ISetVtoSurveyStorage {\n vtoType: string;\n data: ISurveyStorageValues;\n}\n\nconst defaultSurveyData = Object.values(VtoTypes).reduce((acc, value) => {\n return {\n ...acc,\n [value]: {\n isP13nApiVerified: false,\n isSurveyTaken: false\n }\n };\n}, {});\n\nexport const setVtoSurveyStorage = ({ vtoType, data }: ISetVtoSurveyStorage) => {\n const storage = getVtoSurveyStorage() || defaultSurveyData;\n\n const newSurveyData: ISurveyStorage = {\n ...storage,\n [vtoType]: {\n ...storage[vtoType],\n ...data\n }\n };\n\n BrowserStorage.setItem(VTO_SURVEY_STORAGE_KEY, JSON.stringify(newSurveyData));\n};\n","import { ELCLogger, TriggerType } from '@estee/elc-logging';\nimport serviceNames from '~setup/VtoService';\nimport { diContainer } from '~setup/diContainer';\nimport { surveyTypes } from '~constants/Survey';\nimport { PersonalizationRepository } from '~repositories/PersonalizationRepository';\nimport { UserInfoRepository } from '~repositories/UserInfoRepository';\nimport { setVtoSurveyStorage } from '~utils/setVtoSurveyStorage';\nimport { getVtoSurveyStorage } from '~utils/getVtoSurveyStorage';\nimport { VtoTypes } from '~constants/Vto';\nimport { Personalization } from '~domain/entities/Personalization';\n\ninterface ISurveyUseCase {\n vtoType: string;\n}\n\nconst { name: serviceName, version: serviceVersion } = __serviceInfo__;\n\nexport class SurveyUseCase {\n private personalizationRepository: PersonalizationRepository;\n private userInfoRepository: UserInfoRepository;\n private logger: ELCLogger;\n private vtoType: VtoTypes;\n\n constructor({ vtoType }: ISurveyUseCase) {\n this.personalizationRepository = diContainer.get(serviceNames.personalizationRepository);\n this.userInfoRepository = diContainer.get(serviceNames.userInfoRepository);\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n this.vtoType = vtoType as VtoTypes;\n }\n\n public execute = async () => {\n const surveyStorage = getVtoSurveyStorage(this.vtoType);\n\n if (surveyStorage?.isSurveyTaken) {\n return;\n }\n\n await this.updateBrowserStorageWithApiData();\n };\n\n private async updateBrowserStorageWithApiData() {\n let userId;\n const vtoType = this.vtoType;\n\n try {\n const userData = await this.userInfoRepository.getUser();\n\n userId = userData.userId || userData.sessionId;\n\n if (!userId) {\n setVtoSurveyStorage({ vtoType, data: { isSurveyTaken: false } });\n\n return;\n }\n\n const surveyType = surveyTypes[vtoType];\n\n const data = (await this.personalizationRepository.getPersonalizationDataByPerlgemUserId(\n [surveyType],\n userId\n )) as Personalization;\n\n const storageData = this.getStorageData(data);\n\n setVtoSurveyStorage(storageData);\n } catch (error) {\n userId && setVtoSurveyStorage({ vtoType, data: { isP13nApiVerified: true } });\n\n this.logger.error({\n triggerType: TriggerType.api,\n payload: { error },\n message: `${error.message}`\n });\n }\n }\n\n private getStorageData(data: Personalization) {\n const vtoType = this.vtoType;\n let storageData = { vtoType, data: { isSurveyTaken: false, isP13nApiVerified: true } };\n\n if (Array.isArray(data)) {\n const surveyData = data.filter((survey) => survey.tags.includes(surveyTypes[vtoType]));\n\n if (surveyData.length > 0) {\n storageData = { vtoType, data: { isSurveyTaken: true, isP13nApiVerified: true } };\n }\n }\n\n return storageData;\n }\n}\n","import * as React from 'react';\nimport { observable, action, computed } from 'mobx';\nimport { diContainer, IServiceInfo } from '~setup/diContainer';\nimport serviceNames from '~setup/VtoService';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\nimport {\n ICrossSellCategory,\n ICrossSellShades,\n IProduct,\n IShade,\n ISku,\n IVtoEventListenerResult,\n IVtoFoundationPairShadeLabels,\n IVtoFoundationPerfectMatches,\n IVtoFoundationSaveMatch,\n IVtoFoundationShadeLabels,\n IVtoServiceConfig\n} from '~interfaces/IVto';\nimport { IVtoTranslations } from '~exported/vto/Vto';\nimport { emit, events, on, query, serviceQueries } from '@estee/elc-service-bus';\nimport { BrowserStorage } from '@estee/elc-universal-utils';\nimport * as VtoConstants from '~constants/Vto';\nimport { VtoBaseController, IVtoWindow } from './VtoBaseController';\nimport { PersonalizationRepository } from '~repositories/PersonalizationRepository';\nimport { UserInfoRepository } from '~repositories/UserInfoRepository';\nimport { setVtoMatchCookie } from '~utils/setVtoMatchCookie';\nimport { getVtoMatchCookie } from '~utils/getVtoMatchCookie';\nimport { SurveyUseCase } from '../use-cases/SurveyUseCase';\nimport { PERLGEM_USER_ID, SESSION_ID, surveyTypes } from '~constants/Survey';\nimport { setVtoSurveyStorage } from '~utils/setVtoSurveyStorage';\nimport { getVtoSurveyStorage } from '~utils/getVtoSurveyStorage';\nimport { ISurveyFields } from '~interfaces/ISurvey';\nimport { CLOSE_SURVEY_TIMEOUT } from '~constants/VtoSurvey';\nimport { SurveyRepository } from '~repositories/SurveyRepository';\nimport { ISurveyData } from '~api/SurveyApiSdk';\n\ndeclare let window: IVtoWindow;\n\nexport interface IVtoInitializeController {\n config: IVtoServiceConfig;\n vtoIframeRef: React.RefObject;\n translations: IVtoTranslations;\n}\n\nexport class VtoViewController extends VtoBaseController {\n @observable public isVtoShadeGridEnabled: boolean = false;\n @observable public isVtoLoaded: boolean = false;\n @observable public isVtoFoundationOverlayOpened: boolean = false;\n @observable public selectedPairSkuId: string;\n @observable public selectedPairShadeName: string = '';\n @observable private selectedSku: ISku;\n @observable public activeTab: string = VtoConstants.foundationTabs.perfectShadesTab;\n @observable public isMatchSaved: boolean = false;\n @observable public isSaveInProgress: boolean = false;\n @observable public isSpinnerEnabled: boolean = true;\n @observable private showProductImageSection: boolean = false;\n @observable public crossSellSkuData: ISku[];\n @observable public isVtoFoundationQrCodeOverlayEnabled: boolean = false;\n @observable public isSurveyVisible: boolean = false;\n @observable public showThankMessage: boolean = false;\n @observable public surveyButtonIndex: number | null;\n @observable public surveyComment: string = '';\n @observable public savedMatch: string = '';\n\n public translations: IVtoTranslations;\n private togglePerfectShades?: (hidden: boolean) => void;\n private vtoReInitTimeout: number;\n private vtoIframeRef: React.RefObject;\n private vtoShadeResult?: IVtoFoundationPerfectMatches;\n private isShadeSidebarVtoOpened: boolean = false;\n private personalizationRepository: PersonalizationRepository;\n private userInfoRepository: UserInfoRepository;\n private payloadEventValueCameraStart: number;\n private payloadEventValueCameraEnd: number;\n private vtoType: string;\n private logger: ELCLogger;\n private surveyRepository: SurveyRepository;\n private isSurveySubmitted: boolean = false;\n private surveyViewed: boolean = false;\n\n constructor(serviceInfo: IServiceInfo) {\n super();\n this.checkVtoDisclose();\n this.personalizationRepository = diContainer.get(serviceNames.personalizationApiSdk);\n this.userInfoRepository = diContainer.get(serviceNames.userInfoRepository);\n this.surveyRepository = diContainer.get(serviceNames.surveyRepository);\n this.logger = new ELCLogger(serviceInfo);\n }\n\n public checkHidePriceOnLoad = () => {\n this.checkVtoHidePriceParam();\n\n if (this.isVtoPriceHidden) {\n emit(events.VTO_PRICE_SUPPRESSED, { vtoType: this.vtoType });\n }\n };\n\n @action\n public initialize = (props: IVtoInitializeController) => {\n const { config, translations, vtoIframeRef } = props;\n const {\n vtoConfig,\n isVtoMakeupEnabled,\n isVtoFoundationEnabled,\n selectedSku,\n productIdList,\n hasShadeSidebarVto,\n togglePerfectShades\n } = config;\n this.vtoConfig = vtoConfig;\n this.isVtoMakeupEnabled = !!isVtoMakeupEnabled;\n this.isVtoFoundationEnabled = !!isVtoFoundationEnabled;\n this.isVtoFoundationMultiIds = !!this.isVtoFoundationMultiIdsEnabled;\n this.selectedSku = selectedSku;\n this.product = selectedSku.parentProduct;\n this.productIdList = productIdList || [this.product.productId];\n this.translations = translations;\n this.vtoIframeRef = vtoIframeRef;\n this.vtoFoundationPerfectMatchText = this.getVtoPerfectMatchText();\n this.hasShadeSidebarVto = hasShadeSidebarVto;\n this.showProductImageSection = !!(\n this.vtoMakeupFeature && this.vtoMakeupFeature.showProductImageSection\n );\n this.vtoType = this.getVtoType();\n\n this.togglePerfectShades = togglePerfectShades;\n\n this.enableProductImage(true);\n\n this.loadCrossSellProducts();\n this.addEventListeners(VtoConstants.VtoEvents, this.handleEventListenerCallbacks);\n this.openShadeSidebarVto();\n };\n\n @computed\n get data() {\n return {\n isVtoShadeGridEnabled: this.isVtoShadeGridEnabled,\n isVtoFoundationOverlayOpened: this.isVtoFoundationOverlayOpened,\n isVtoOpened: this.isVtoOpened,\n isVtoPriceHidden: this.isVtoPriceHidden,\n activeTabs: this.activeTabContent,\n isMatchSaved: this.isMatchSaved,\n isSaveInProgress: this.isSaveInProgress,\n isSpinnerEnabled: this.isSpinnerEnabled,\n isSupportedBrowserOverlayVisible: this.isSupportedBrowserOverlayVisible,\n isSupportedBrowserOverlayOpen: this.isSupportedBrowserOverlayOpen,\n selectedCrossSellShades: this.selectedCrossSellShades,\n selectedCrossSellShade: this.selectedCrossSellShade,\n selectedCrossSellSku: this.selectedCrossSellSku,\n selectedCrossSellProductUrl: this.selectedCrossSellProductUrl,\n selectedCrossSellLargeImages: this.selectedCrossSellLargeImages,\n selectedCrossSellSizeValue: this.selectedCrossSellSizeValue,\n foundationPairText: this.foundationPairText,\n isVtoFoundationQrCodeOverlayEnabled: this.isVtoFoundationQrCodeOverlayEnabled,\n isSurveyVisible: this.isSurveyVisible,\n showThankMessage: this.showThankMessage,\n surveyButtonIndex: this.surveyButtonIndex,\n surveyComment: this.surveyComment,\n savedMatch: this.savedMatch\n };\n }\n\n private getVtoPerfectMatchText = () => {\n return Object.values(VtoConstants.FoundationShadeTypes).reduce((acc, value) => {\n const key = `${value}Label` as keyof IVtoTranslations;\n\n return {\n ...acc,\n [value]: this.translations[key]\n };\n }, {} as IVtoFoundationShadeLabels);\n };\n\n public getVtoType = () => {\n if (this.isVtoMakeupEnabled) {\n return VtoConstants.VtoTypes.MAKEUP;\n }\n\n return VtoConstants.VtoTypes.FOUNDATION;\n };\n\n private handleEventListenerCallbacks: {\n [key in VtoConstants.VtoEvents]: (result: IVtoEventListenerResult) => void;\n } = {\n [VtoConstants.VtoEvents.LOADING]: (percentage) => this.handleVtoLoadingEvent(percentage),\n [VtoConstants.VtoEvents.LOADED]: () => this.handleVtoLoadedEvent(),\n [VtoConstants.VtoEvents.OPENED]: () => this.handleVtoOpenedEvent(),\n [VtoConstants.VtoEvents.CLOSED]: () => this.handleVtoClosedEvent(),\n [VtoConstants.VtoEvents.SKIN_SHADE_FOUND]: (result) => {\n this.handleVtoSkinShadeFoundEvent(result);\n this.handleVtoResize(false);\n },\n [VtoConstants.VtoEvents.CAMERA_CLOSED]: () =>\n emit(events.VTO_CAMERA_CLOSED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.CAMERA_FAILED]: () =>\n emit(events.VTO_CAMERA_FAILED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.CAMERA_OPENED]: () => this.handleCameraOpenedEvent(),\n [VtoConstants.VtoEvents.COMPARE]: () => emit(events.VTO_COMPARE, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.COMPARE_DISABLED]: () =>\n emit(events.VTO_COMPARE_DISABLED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.ENGINE_CLOSED]: () =>\n emit(events.VTO_ENGINE_CLOSED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.KISS_DETECTED]: () =>\n emit(events.VTO_KISS_DETECTED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.PHOTO_LOADED]: () =>\n emit(events.VTO_PHOTO_LOADED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.PHOTO_SAVED]: () =>\n emit(events.VTO_PHOTO_SAVED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.RESET]: () => {\n emit(events.VTO_RESET, { vtoType: this.vtoType });\n this.handleVtoResize(true);\n },\n [VtoConstants.VtoEvents.VIDEO_LOADED]: () =>\n emit(events.VTO_VIDEO_LOADED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.SHADE_FINDER_STARTED]: () =>\n this.handleVtoShadeFinderStartedEvent(),\n [VtoConstants.VtoEvents.SHADE_FINDER_COMPLETED]: () =>\n emit(events.VTO_SHADE_FINDER_COMPLETED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.SHADE_FINDER_CANCELLED]: () =>\n emit(events.VTO_SHADE_FINDER_CANCELLED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.ZOOM]: () => emit(events.VTO_ZOOM, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.SPLIT_FOUR_WAY]: () =>\n emit(events.VTO_SPLIT_FOUR_WAY_ENABLED, { vtoType: this.vtoType }),\n [VtoConstants.VtoEvents.SPLIT_FOUR_WAY_DISABLED]: () =>\n emit(events.VTO_SPLIT_FOUR_WAY_DISABLED, { vtoType: this.vtoType })\n };\n\n private handleCameraOpenedEvent = () => {\n this.payloadEventValueCameraStart = performance.now();\n emit(events.VTO_CAMERA_OPENED, { vtoType: this.vtoType });\n };\n\n private handleVtoOpenedEvent = () => {\n if (this.isVtoFoundationEnabled && this.isVtoFoundationOverlayEnabled) {\n this.closeVtoFoundationOverlay();\n }\n if (this.isVtoMakeupEnabled && !this.showProductImageSection) {\n this.enableProductImage(false);\n }\n this.toggleBodyClasses(true);\n this.setIsOpenedState(true);\n window.addEventListener('resize', this.reInitVto);\n this.enableSpinner(false);\n this.setSurveyStorage();\n };\n\n private handleVtoLoadedEvent = () => {\n this.payloadEventValueCameraEnd = performance.now();\n\n const { skuId } = this.selectedSku;\n\n emit(events.VTO_LOADED, {\n vtoType: this.vtoType,\n eventValue: Math.floor(\n this.payloadEventValueCameraEnd - this.payloadEventValueCameraStart\n )\n });\n\n this.updateVtoLoadedState(true);\n\n if (this.isVtoMakeupEnabled) {\n this.toggleVtoShadeGrid(true);\n window.YMK.applyMakeupBySku(skuId);\n }\n };\n\n private handleVtoLoadingEvent = (percentage: IVtoEventListenerResult) => {\n // @ts-ignore\n if (percentage === VtoConstants.LOADING_PERCENTAGE_EVENT_TRIGGERED) {\n emit(events.VTO_LOADING, { vtoType: this.vtoType });\n }\n };\n\n private handleVtoShadeFinderStartedEvent = () => {\n const isShadeGridEnabled = false;\n emit(events.VTO_SHADE_FINDER_STARTED, { vtoType: this.vtoType });\n this.toggleVtoShadeGrid(isShadeGridEnabled);\n };\n\n private handleVtoSkinShadeFoundEvent = (result: IVtoEventListenerResult) => {\n this.vtoShadeResult = result.readableRecommendations && result.readableRecommendations[0];\n this.setSaveMatch(false);\n emit(events.VTO_SKIN_SHADE_FOUND, { vtoType: this.vtoType });\n this.foundationShadeFilter();\n this.toggleVtoShadeGrid(true);\n if (this.product.perfectShades.length) {\n this.togglePerfectShades && this.togglePerfectShades(true);\n this.selectPerfectSku(this.vtoShadeResult);\n } else {\n const shades = this.product.shades;\n const skuId = shades.length ? shades[0].parentSku?.skuId : '';\n this.activeTab = VtoConstants.foundationTabs.allShadesTab;\n this.togglePerfectShades && this.togglePerfectShades(false);\n skuId && this.selectFirstSku(skuId);\n }\n };\n\n private closeVto = () => {\n emit(events.VTO_CLOSED, { vtoType: this.vtoType });\n this.toggleBodyClasses(false);\n this.enableProductImage(true);\n this.toggleVtoShadeGrid(false);\n this.resetShadeProps();\n this.togglePerfectShades && this.togglePerfectShades(false);\n this.updateVtoLoadedState(false);\n this.setIsOpenedState(false);\n window.removeEventListener('resize', this.reInitVto);\n\n if (this.isVtoDisclosed) {\n emit(events.VTO_OPENED, { vtoType: this.vtoType });\n }\n if (!this.isSurveySubmitted && this.hasSurvey) {\n emit(events.VTO_SURVEY_IGNORED, { vtoType: this.vtoType });\n }\n this.enableSidebarImage(true);\n };\n\n private handleVtoClosedEvent = () => {\n if (this.isSurveyViewable) {\n this.showSurvey();\n\n return;\n }\n\n this.closeVto();\n };\n\n private closeVtoFoundationOverlay = () => {\n this.updateVtoFoundationOverlayState(false);\n };\n\n @action\n public toggleVtoShadeGrid = (isEnabled: boolean) => {\n this.isVtoShadeGridEnabled = isEnabled;\n };\n\n @action\n public updateVtoLoadedState = (isLoaded: boolean) => {\n this.isVtoLoaded = isLoaded;\n };\n\n @action\n public setIsSpinnerEnabled = (isEnabled: boolean) => {\n this.isSpinnerEnabled = isEnabled;\n };\n\n @action\n public setActiveTab = (activeTab: string) => {\n this.activeTab = activeTab;\n };\n\n @action\n public onVtoTabClick = (event: React.MouseEvent) => {\n const {\n foundationTabs: { perfectShadesTab, allShadesTab, pairShadesTab }\n } = VtoConstants;\n const target = event.target;\n this.activeTab = target.dataset.tab || '';\n\n if (this.activeTab === perfectShadesTab && this.togglePerfectShades) {\n this.togglePerfectShades(true);\n this.handleShadesViewed(VtoConstants.VtoButtonTypes.BEST_SHADES);\n } else if (this.activeTab === pairShadesTab) {\n emit(events.VTO_PAIR_SHADE_GRID_OPENED, { vtoType: this.vtoType });\n } else if (this.activeTab === allShadesTab && this.togglePerfectShades) {\n this.togglePerfectShades(false);\n this.handleShadesViewed(VtoConstants.VtoButtonTypes.ALL_SHADES);\n }\n };\n\n @on(events.VTO_PAIR_SHADE_GRID_OPENED)\n public setDefaultCrossSellShade = () => {\n if (this.selectedCrossSellShades) {\n const defaultShade = Object.values(this.selectedCrossSellShades)[0].name;\n this.onCrossSellShadeSelect(defaultShade);\n }\n };\n\n @action\n public setSelectedPairSkuId = (skuId: string) => {\n this.selectedPairSkuId = skuId;\n };\n\n @action\n public setSelectedPairShadeName = (shadeName: string) => {\n this.selectedPairShadeName = shadeName;\n };\n\n @computed\n get activeTabContent() {\n const {\n foundationTabs: { perfectShadesTab, allShadesTab, pairShadesTab }\n } = VtoConstants;\n const perfectShades = this.product.perfectShades || [];\n\n return {\n perfectShades: { active: this.activeTab === perfectShadesTab, disabled: !perfectShades.length },\n pairShades: {\n active: this.activeTab === pairShadesTab,\n disabled: !Object.values(this.selectedCrossSellShades).length\n },\n allShades: { active: this.activeTab === allShadesTab, disabled: false }\n };\n }\n\n @computed\n get isVtoFoundationOverlayEnabled() {\n return this.vtoFoundationFeature && this.vtoFoundationFeature.isOverlayEnabled;\n }\n\n @computed\n get isVtoFoundationMultiIdsEnabled() {\n return this.vtoFoundationFeature && this.vtoFoundationFeature.isMultiIdsEnabled;\n }\n\n get slidesToShow() {\n if (\n this.isVtoFoundationEnabled &&\n this.vtoFoundationFeature &&\n this.vtoFoundationFeature.slidesToShow\n ) {\n return this.vtoFoundationFeature.slidesToShow;\n }\n if (\n this.isVtoMakeupEnabled &&\n this.vtoMakeupFeature &&\n this.vtoMakeupFeature.slidesToShow\n ) {\n return this.vtoMakeupFeature.slidesToShow;\n }\n\n return VtoConstants.CUSTOM_SLIDES_TO_SHOW;\n }\n\n get slidesToScroll() {\n if (\n this.isVtoFoundationEnabled &&\n this.vtoFoundationFeature &&\n this.vtoFoundationFeature.slidesToScroll\n ) {\n return this.vtoFoundationFeature.slidesToScroll;\n }\n if (\n this.isVtoMakeupEnabled &&\n this.vtoMakeupFeature &&\n this.vtoMakeupFeature.slidesToScroll\n ) {\n return this.vtoMakeupFeature.slidesToScroll;\n }\n\n return VtoConstants.CUSTOM_SLIDES_TO_SCROLL;\n }\n\n public sortPerfectLabels = (a: IShade, b: IShade) => {\n const orderedPerfectLabels = [\n this.translations.coolerLabel,\n this.translations.lighterLabel,\n this.translations.bestLabel,\n this.translations.darkerLabel,\n this.translations.warmerLabel\n ];\n\n if (a.perfectShadeLabel && b.perfectShadeLabel && orderedPerfectLabels) {\n const labelA = orderedPerfectLabels.indexOf(a.perfectShadeLabel);\n const labelB = orderedPerfectLabels.indexOf(b.perfectShadeLabel);\n\n if (labelA < labelB) {\n return -1;\n }\n\n if (labelA > labelB) {\n return 1;\n }\n }\n\n return 0;\n };\n\n @computed\n public get selectedCrossSellSku() {\n if (!this.crossSellSkuData) {\n return;\n }\n if (this.selectedPairSkuId) {\n return this.crossSellSkuData.find((sku) => sku.skuId === this.selectedPairSkuId);\n }\n const defaultSkuData = this.crossSellSkuData[0];\n\n return defaultSkuData?.parentProduct.skus.find(\n (sku) => sku.crossSellCategory && sku.crossSellCategory.length > 0\n );\n }\n\n @computed\n public get selectedCrossSellProductUrl() {\n if (this.selectedCrossSellSku) {\n const productUrl = this.selectedCrossSellSku.parentProduct.productUrl;\n const selectedShadeName = this.selectedCrossSellSku.shades[0].name;\n\n return `${productUrl}?shade=${encodeURIComponent(selectedShadeName)}`;\n }\n\n return '';\n }\n\n @computed\n public get selectedCrossSellSizeValue() {\n if (this.selectedCrossSellSku) {\n return this.selectedCrossSellSku.sizes && this.selectedCrossSellSku.sizes[0].value;\n }\n\n return '';\n }\n\n @computed\n public get selectedCrossSellLargeImages() {\n if (this.selectedCrossSellSku) {\n return this.selectedCrossSellSku.media.large.concat(\n this.selectedCrossSellSku.parentProduct.media.large\n );\n }\n\n return [];\n }\n\n @computed\n public get foundationPairText() {\n return Object.values(VtoConstants.FoundationPairShadeTypes).reduce((acc, value) => {\n const key = `${value}Label` as keyof IVtoTranslations;\n\n return {\n ...acc,\n [value]: this.translations[key]\n };\n }, {} as IVtoFoundationPairShadeLabels);\n }\n\n @computed\n public get selectedCrossSellShade() {\n return this.selectedCrossSellSku?.shades.find(\n (shade) => shade.name === this.selectedPairShadeName\n );\n }\n\n @computed\n public get selectedCrossSellShades() {\n const selectedCrossSell = this.selectedSku.crossSellCategory || [];\n const shadeTypes = Object.values(VtoConstants.FoundationPairShadeTypes);\n let shades: ICrossSellShades = {};\n if (this.crossSellSkuData) {\n shades = selectedCrossSell.reduce(\n (acc: ICrossSellShades, value: ICrossSellCategory) => {\n const crossSellSku = this.crossSellSkuData.find(\n (sku) => sku.skuId === value.skuId\n );\n if (crossSellSku) {\n acc[shadeTypes[value.position]] = crossSellSku.shades[0];\n }\n\n return acc;\n },\n {}\n );\n\n return shades;\n }\n\n return shades;\n }\n\n private loadCrossSellProducts = async () => {\n const crossSellSkuIds = [\n ...new Set(\n this.selectedSku.parentProduct.skus.flatMap((sku) =>\n sku.crossSellCategory?.map((category) => category.skuId)\n )\n )\n ].filter((skuId) => skuId) as string[];\n\n if (crossSellSkuIds.length > 0) {\n try {\n const crossSellProductData = (\n await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: crossSellSkuIds } }\n })\n );\n const crossSellProductSkus = crossSellProductData.flatMap(\n (product) => product.skus\n );\n this.crossSellSkuData = crossSellSkuIds\n .map((skuId) => crossSellProductSkus.find((sku) => sku.skuId === skuId))\n .filter((sku) => sku) as ISku[];\n } catch (error) {\n this.logger.error({\n triggerType: TriggerType.runtimeError,\n message: `${error}`\n });\n }\n }\n };\n\n private foundationShadeFilter = () => {\n if (this.vtoShadeResult) {\n const perfectMatches = this.filterPerfectMatches(this.vtoShadeResult);\n this.updateShadeEntity(perfectMatches);\n }\n };\n\n private reInitVto = () => {\n if (this.vtoReInitTimeout) {\n clearTimeout(this.vtoReInitTimeout);\n }\n\n this.vtoReInitTimeout = setTimeout(() => {\n const { iframeWidth } = this.getIframeDimension();\n const vtoIframeRef = this.vtoIframeRef && this.vtoIframeRef.current;\n if (iframeWidth !== this.iframeWidth && vtoIframeRef && vtoIframeRef.hasChildNodes()) {\n window.YMK.closeEngine();\n window.YMK.close();\n emit(events.VTO_OPENED, { vtoType: this.vtoType });\n }\n }, VtoConstants.TIMEOUT_VALUE);\n };\n\n @on(events.VTO_OPENED)\n public initVto = () => {\n if (this.isVtoFoundationSupportedBrowserOverlayEnabled) {\n this.showSupportedBrowserOverlay();\n\n return;\n }\n if (!this.getVtoApiConfig) {\n return;\n }\n if (typeof window.ymkAsyncInit !== 'function') {\n const { apiUrl, apiKey } = this.getVtoApiConfig;\n this.loadVto(apiUrl, apiKey);\n this.declareVtoCallback();\n }\n this.openVto();\n this.enableSidebarImage(false);\n this.enableSpinner(true);\n this.setIsVtoFoundationQrCodeOverlayEnabled(false);\n };\n\n private declareVtoCallback = () => {\n window.ymkAsyncInit = () => {\n if (typeof window.YMK !== 'undefined') {\n const vtoParams = this.getVtoParams();\n window.YMK.init(vtoParams);\n this.openVtoFoundation();\n this.addEventListeners(VtoConstants.VtoEvents, this.handleEventListenerCallbacks);\n }\n };\n };\n\n private openVtoFoundation() {\n if (this.isVtoFoundationEnabled) {\n this.isVtoFoundationOverlayEnabled\n ? this.showVtoFoundationOverlay()\n : window.YMK.open(true, null, true);\n }\n }\n\n private openVto = () => {\n this.toggleBodyClasses(true);\n window.ymkAsyncInit();\n };\n\n private showVtoFoundationOverlay = () => {\n this.updateVtoFoundationOverlayState(true);\n };\n\n private openShadeSidebarVto() {\n if (this.hasShadeSidebarVto && !this.isShadeSidebarVtoOpened) {\n const { VTO_FOUNDATION_QR_CODE_OVERLAY_OPENED, VTO_OPENED } = events;\n\n this.isShadeSidebarVtoOpened = true;\n\n VtoBaseController.isFoundationQrCodeOverlayOpen\n ? emit(VTO_FOUNDATION_QR_CODE_OVERLAY_OPENED, { vtoType: this.vtoType })\n : emit(VTO_OPENED, { vtoType: this.vtoType });\n }\n }\n\n @action\n public updateVtoFoundationOverlayState = (isOverlayOpened: boolean) => {\n this.isVtoFoundationOverlayOpened = isOverlayOpened;\n };\n\n public handleVtoUnmount = () => {\n this.handleVtoClosedEvent();\n this.removeVtoEventListeners();\n };\n\n @action\n public onCrossSellShadeSelect = (shadeName: string) => {\n const crossSellSku = Object.values(this.crossSellSkuData).find((sku) =>\n sku.shades.some((shade) => shade.name === shadeName)\n );\n\n if (crossSellSku) {\n const selectedCrossSellShade = crossSellSku.shades.find(\n (shade) => shade.name === shadeName\n );\n\n if (this.isVtoLoaded && selectedCrossSellShade) {\n this.setSelectedPairSkuId(crossSellSku.skuId);\n this.setSelectedPairShadeName(selectedCrossSellShade.name);\n emit(events.VTO_PAIR_SHADE_SELECTED, { vtoType: this.vtoType });\n window.YMK.applyMakeupBySku(crossSellSku.skuId);\n }\n }\n };\n\n @on(events.PRODUCT_SKU_SELECTED)\n public vtoMakeupApply = (payload: { skuId: string }) => {\n if (this.isVtoLoaded) {\n window.YMK.applyMakeupBySku(payload.skuId);\n }\n };\n\n public handleShadeSelect = (shadeName: string, eventLabel: string) => {\n emit(events.PRODUCT_SHADE_SELECTED, { shadeName });\n emit(events.VTO_SHADE_SELECTED, {\n vtoType: this.getVtoType(),\n eventLabel\n });\n };\n\n public handleShadesViewed = (buttonType: VtoConstants.VtoButtonTypes) => {\n const { VtoButtonTypes } = VtoConstants;\n const eventByButtonType = {\n [VtoButtonTypes.ALL_SHADES]: events.VTO_ALL_SHADES_VIEWED,\n [VtoButtonTypes.BEST_SHADES]: events.VTO_BEST_SHADES_VIEWED\n };\n\n !!eventByButtonType[buttonType] &&\n emit(eventByButtonType[buttonType], { vtoType: this.vtoType });\n };\n\n @on(events.VTO_FOUNDATION_OVERLAY_TOGGLED)\n public vtoFoundationOverlayToggled = (payload: { isOverlayOpened: boolean }) => {\n this.updateVtoFoundationOverlayState(payload.isOverlayOpened);\n emit(events.VTO_CLOSED, { vtoType: this.vtoType });\n this.toggleBodyClasses(false);\n };\n\n @on(events.SHADE_SIDEBAR_CLOSED)\n public shadeSidebarClosed = () => {\n this.hasShadeSidebarVto && this.handleVtoClosedEvent();\n };\n\n @action\n public updateProductData = (sku: ISku) => {\n this.selectedSku = sku;\n this.product = sku.parentProduct;\n };\n\n @action\n public setSaveMatch = (isSaved: boolean) => {\n this.isMatchSaved = isSaved;\n };\n\n @action\n public setIsSaveInProgress = (isInProgress: boolean) => {\n this.isSaveInProgress = isInProgress;\n };\n\n @action\n public resetBestShades = () => {\n this.product.skus.forEach((sku) => {\n sku.shades.forEach((shade) => shade.resetBestShade());\n });\n };\n\n public saveMatches = async () => {\n const recommendations = this.getShadeRecommendations();\n const { productId } = this.product;\n const { skuId } = this.selectedSku;\n\n const shadeMatches = {\n productId,\n userSelectedMatch: skuId,\n recommendations\n };\n\n this.setIsSaveInProgress(true);\n this.resetBestShades();\n this.selectedSku.selectedShade.setBestShade();\n\n setVtoMatchCookie({\n shadeMatches: { [productId]: shadeMatches },\n shouldOverride: true\n });\n\n await this.personalizeVtoMatches(shadeMatches);\n\n this.setSaveMatch(true);\n this.setIsSaveInProgress(false);\n this.savedMatch = this.selectedSku.shades[0].name;\n\n emit(events.VTO_MATCH_SAVED, { vtoType: this.vtoType });\n };\n\n private getShadeRecommendations() {\n if (!this.vtoShadeResult) {\n return null;\n }\n const shadeTypes = VtoConstants.FoundationShadeTypes;\n const shadeTypeValues = Object.values(shadeTypes);\n\n return Object.entries(this.vtoShadeResult).reduce((acc, [type, skuId]) => {\n const matchType =\n type === VtoConstants.VTO_GUID\n ? shadeTypes.BEST\n : (type as VtoConstants.FoundationShadeTypes);\n\n if (shadeTypeValues.indexOf(matchType) > -1) {\n return { ...acc, [matchType]: skuId };\n }\n\n return acc;\n }, {} as IVtoFoundationPerfectMatches);\n }\n\n private async personalizeVtoMatches(shadeMatches: IVtoFoundationSaveMatch) {\n const userId = await this.userInfoRepository.getUserId();\n\n if (!userId) {\n return;\n }\n\n const { VTO_FOUNDATION, PERLGEM_USER_IDENTIFIER_TYPE, VTO_MATCHES, VTO } = VtoConstants;\n\n const data = {\n userPersonalizationData: JSON.stringify({ [VTO_MATCHES]: shadeMatches }),\n tags: [VTO, VTO_FOUNDATION],\n userIdentifier: userId.toString(),\n userIdentifierType: PERLGEM_USER_IDENTIFIER_TYPE\n };\n\n await this.personalizationRepository.createPersonalizationData(data);\n\n emit(events.VTO_MATCH_PERSONALIZED, { vtoType: this.vtoType });\n }\n\n public removeMatches = () => {\n const cookieName = VtoConstants.VTO_MATCHES_COOKIE_NAME;\n const shadeMatchCookie = getVtoMatchCookie();\n if (!shadeMatchCookie) {\n return;\n }\n\n const shadeMatches = JSON.parse(shadeMatchCookie);\n\n shadeMatches[this.product.productId] = {};\n\n BrowserStorage.setItem(cookieName, JSON.stringify(shadeMatches));\n\n this.setSaveMatch(false);\n this.savedMatch = '';\n this.selectedSku.selectedShade.resetBestShade();\n\n emit(events.VTO_MATCH_REMOVED, { vtoType: this.vtoType });\n };\n\n private enableProductImage(isEnabled: boolean) {\n emit(events.PRODUCT_IMAGE_ENABLED, isEnabled);\n }\n\n private enableSpinner(isEnabled: boolean) {\n const isSpinnerEnabled =\n isEnabled && (this.isVtoMakeupEnabled || !this.isVtoFoundationOverlayEnabled);\n\n this.setIsSpinnerEnabled(isSpinnerEnabled);\n }\n\n private enableSidebarImage(isEnabled: boolean) {\n if (this.hasShadeSidebarVto) {\n emit(events.SHADE_SIDEBAR_IMAGE_ENABLED, { isEnabled });\n }\n }\n\n get isVtoFoundationSupportedBrowserOverlayEnabled() {\n return (\n this.isVtoFoundationEnabled &&\n this.vtoFoundationFeature?.isSupportedBrowserMsgEnabled &&\n this.isSupportedBrowserUserAgent\n );\n }\n\n @action\n public setIsVtoFoundationQrCodeOverlayEnabled = (isEnabled: boolean) => {\n this.isVtoFoundationQrCodeOverlayEnabled = isEnabled;\n };\n\n @on(events.VTO_FOUNDATION_QR_CODE_OVERLAY_CLOSED)\n public handleVtoFoundationQrCodeOverlayClose = () => {\n this.setIsVtoFoundationQrCodeOverlayEnabled(false);\n this.handleVtoClosedEvent();\n };\n\n @on(events.VTO_FOUNDATION_QR_CODE_OVERLAY_OPENED)\n public handleQrCodeFoundationOverlay = () => {\n this.setIsVtoFoundationQrCodeOverlayEnabled(true);\n this.setIsOpenedState(true);\n this.enableProductImage(false);\n this.enableSidebarImage(false);\n this.enableSpinner(false);\n };\n\n @action\n public setIsSurveyVisible = (isVisible: boolean) => {\n this.isSurveyVisible = isVisible;\n };\n\n @action\n public closeSurvey = () => {\n this.setIsSurveyVisible(false);\n this.surveyViewed = true;\n this.setThankMessageStatus(false);\n this.surveyButtonIndex = null;\n this.setSurveyComment('');\n this.closeVto();\n };\n\n public submitSurveyData = async ({ rating, comment = '' }: ISurveyFields) => {\n setVtoSurveyStorage({ vtoType: this.vtoType, data: { isSurveyTaken: true } });\n\n const userData = await this.userInfoRepository.getUser();\n const { userId, sessionId } = userData;\n const id = userId || sessionId;\n\n if (!id) {\n return;\n }\n\n const userIdType = userId ? PERLGEM_USER_ID : SESSION_ID;\n const surveyType = surveyTypes[this.vtoType as VtoConstants.VtoTypes];\n const personalizationData = {\n [surveyType]: {\n rating,\n comment,\n userIdType\n }\n };\n\n const data = {\n userPersonalizationData: JSON.stringify(personalizationData),\n tags: [surveyType],\n userIdentifier: id.toString(),\n userIdentifierType: VtoConstants.PERLGEM_USER_IDENTIFIER_TYPE\n };\n\n await this.personalizationRepository.createPersonalizationData(data);\n\n const surveyData: ISurveyData = {\n np: rating?.toString(),\n comment,\n vtoType: this.vtoType,\n userIdentifier: id,\n page: window.location.href\n };\n\n await this.surveyRepository.saveSurveyData(surveyData);\n };\n\n public handleSurveySubmit = ({ rating, comment }: ISurveyFields) => {\n this.setThankMessageStatus(true);\n setTimeout(this.closeSurvey, CLOSE_SURVEY_TIMEOUT);\n this.submitSurveyData({ rating, comment });\n emit(events.VTO_SURVEY_SUBMITTED, { vtoType: this.vtoType });\n this.isSurveySubmitted = true;\n this.setSurveyComment('');\n };\n\n @computed\n get isSurveyViewable() {\n return this.isVtoLoaded && this.hasSurvey && !this.isSurveyTaken;\n }\n\n get hasSurvey() {\n if (this.isVtoMakeupEnabled && !this.disableSurvey) {\n return this.vtoFeature?.makeup?.hasSurvey;\n } else if (this.isVtoFoundationEnabled) {\n return this.vtoFeature?.foundation?.hasSurvey;\n }\n }\n get isSurveyTaken() {\n const surveyStorage = getVtoSurveyStorage(this.vtoType);\n\n if (surveyStorage?.isSurveyTaken || this.surveyViewed) {\n return true;\n }\n }\n\n get disableSurvey() {\n const sppContainer = document.getElementsByClassName('js-spp-content');\n const surveyDisabled = sppContainer[0]?.getAttribute('data-disable-survey');\n if (this.vtoFeature?.makeup?.makeupVariant && surveyDisabled === 'true') {\n return true;\n }\n\n return false;\n }\n\n private showSurvey() {\n this.setIsSurveyVisible(true);\n emit(events.VTO_SURVEY_LOADED, { vtoType: this.vtoType });\n }\n\n private async setSurveyStorage() {\n const surveyUseCase = new SurveyUseCase({ vtoType: this.vtoType });\n\n await surveyUseCase.execute();\n }\n\n @action\n public setThankMessageStatus = (status: boolean) => {\n this.showThankMessage = status;\n };\n\n @action\n public setSurveyButtonIndex = (index: number) => {\n this.surveyButtonIndex = index;\n };\n\n @action\n public setSurveyComment = (surveyComment: string) => {\n this.surveyComment = surveyComment;\n };\n}\n","import { computed } from 'mobx';\nimport { Breakpoints } from '@estee/elc-base-theme';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { VtoBaseController } from './VtoBaseController';\nimport { VtoTypes, VTO_OPEN_PARAM } from '~constants/Vto';\nimport { IVtoCTAButtonServiceConfig } from '~interfaces/IVto';\n\nexport class VtoCTAButtonViewController extends VtoBaseController {\n private vtoButtonConfig: IVtoCTAButtonServiceConfig;\n private vtoType: VtoTypes;\n\n public initialize = (config: IVtoCTAButtonServiceConfig) => {\n this.vtoButtonConfig = config;\n this.vtoType = this.getVtoType();\n\n this.enableVto();\n };\n\n @computed\n get data() {\n return {\n isVtoOpened: this.isVtoOpened\n };\n }\n\n private getVtoType() {\n const { isVtoMakeupEnabled } = this.vtoButtonConfig;\n\n if (isVtoMakeupEnabled) {\n return VtoTypes.MAKEUP;\n }\n\n return VtoTypes.FOUNDATION;\n }\n\n public openVtoOnLoad = () => {\n const { isInsideSidebar, isVtoFoundationEnabled } = this.vtoButtonConfig;\n\n if (isInsideSidebar || !this.checkVtoOpenOnLoad()) {\n return;\n }\n\n const isDesktop = window.innerWidth >= Breakpoints.desktop;\n\n isDesktop && isVtoFoundationEnabled\n ? this.openVtoFoundationQrCodeOverlay()\n : this.initVto();\n };\n\n private checkVtoOpenOnLoad(): boolean {\n return this.getQueryParam(VTO_OPEN_PARAM) !== null;\n }\n\n private openShadeSidebar() {\n if (this.vtoButtonConfig.hasShadeSidebarVto) {\n emit(events.SHADE_SIDEBAR_OPENED);\n emit(events.SHADE_SIDEBAR_IMAGE_ENABLED, { isEnabled: false });\n }\n }\n\n public initVto = () => {\n this.openShadeSidebar();\n emit(events.VTO_OPENED, { vtoType: this.vtoType });\n };\n\n public openVtoFoundationQrCodeOverlay = () => {\n VtoBaseController.isFoundationQrCodeOverlayOpen = true;\n\n this.setIsOpenedState(true);\n this.openShadeSidebar();\n\n emit(events.VTO_FOUNDATION_QR_CODE_OVERLAY_OPENED, { vtoType: this.vtoType });\n };\n\n private enableVto() {\n emit(events.VTO_ENABLED, { vtoType: this.vtoType });\n }\n}\n","import { action, observable, computed } from 'mobx';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { BrowserStorage } from '@estee/elc-universal-utils';\nimport { VtoBaseController, IVtoWindow } from './VtoBaseController';\nimport { IVtoSkinCareConfig, IVtoSkinCareTranslations } from '~exported/vto-skin-care/VtoSkinCare';\nimport { IFeature } from '~constants/Features';\nimport * as VtoSkinCareConstants from '~constants/VtoSkinCare';\nimport { VtoTypes } from '~constants/Vto';\nimport {\n IVtoSkinConcernScores,\n ISkinCareProductList,\n ISite,\n IContentApiParams,\n IProductGridItem,\n IProductBenefitTypes,\n IResultNodeBlocks,\n IVtoSkinCareLoadingEvent,\n IVtoSkinCareHandlerResult\n} from '~interfaces/IVtoSkinCare';\nimport { QuizApiRepository } from '~repositories/QuizApiRepository';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/VtoService';\nimport { IQuizParam } from '~api/QuizApiSdk';\nimport { VtoQuiz } from '~domain/entities/VtoQuiz';\nimport { IMutationObserver, IVtoFlag } from '~interfaces/IVto';\n\ndeclare let window: IVtoWindow;\ndeclare let site: ISite;\n\nexport interface IVtoInitializeSkinCareController {\n config: IVtoSkinCareConfig;\n vtoSkinCareRef: React.RefObject;\n translations: IVtoSkinCareTranslations;\n}\n\nexport class VtoSkinCareViewController extends VtoBaseController {\n @observable public isVtoSkinCareEnabled: boolean = false;\n @observable public isVtoSkinCareCtaEnabled: boolean = true;\n @observable public isVtoSkinCareOpened: boolean = false;\n @observable public isVtoSkinAnalysisFinished: boolean = false;\n @observable public isVtoSkinCareResultInProgress: boolean = false;\n @observable public isVtoSkinCareResultSectionEnabled: boolean = false;\n @observable public skinCareProductList: ISkinCareProductList[] = [];\n @observable public quizApiQuery: IQuizParam;\n @observable public vtoQuizResult: VtoQuiz;\n @observable public isResultCtaFixed: boolean = true;\n @observable public isSkinCareNodeResultEnabled: boolean = false;\n\n public translations: IVtoSkinCareTranslations;\n public productItems: IProductGridItem[] = [];\n public productBenefitTypes: IProductBenefitTypes = {};\n\n public priorityProductItems: IProductGridItem[] = [];\n public priorityProductBenefitTypes: IProductBenefitTypes = {};\n\n public skinCareResultNodeBlocks: IResultNodeBlocks = {};\n\n private quizApiRepository: QuizApiRepository;\n private vtoSkinCareConfig: IFeature;\n private vtoSkinCareFeature?: IVtoFlag;\n private isSkincareSurveyEnabled?: boolean;\n private vtoSkinConcernScores: IVtoSkinConcernScores;\n private vtoSkinCareQuizId: string;\n private isVtoResultEnabled: boolean;\n private editorialNodeId: number;\n private vtoSkinCareProductIds: string[];\n private vtoSkinCareBenefitTypes: string[];\n private finalProductIds: string[];\n private finalBenefitTypes: string[];\n private debounceTimeout: number;\n private vtoSkinCareRef: React.RefObject;\n private skinCareContentResultPromises: Promise[];\n private skinCareContentResultKeys: string[];\n private productGridRef: React.RefObject;\n private isShoppable: boolean = true;\n\n private priorityProductIds: string[];\n private priorityBenefitResult: string[];\n\n @action\n public initialize = (props: IVtoInitializeSkinCareController) => {\n const { config, translations, vtoSkinCareRef } = props;\n const {\n features,\n vtoSkinCareQuizId,\n isVtoResultEnabled,\n skinCareEditorialNodeId,\n vtoFeature\n } = config;\n this.vtoSkinCareConfig = features.vtoSkinCare;\n this.vtoSkinCareFeature = vtoFeature && vtoFeature.skincare;\n this.isSkincareSurveyEnabled =\n vtoFeature && vtoFeature?.skincare && vtoFeature?.skincare?.enableSkincareSurvey;\n this.quizApiRepository = diContainer.get(serviceNames.quizApiRepository);\n this.vtoSkinCareQuizId = vtoSkinCareQuizId;\n this.isVtoResultEnabled = isVtoResultEnabled;\n this.editorialNodeId = skinCareEditorialNodeId;\n this.translations = translations;\n this.vtoSkinCareRef = vtoSkinCareRef;\n\n this.checkShoppableStatus();\n this.updateVtoSkinCareState();\n\n this.enableVto();\n };\n\n @computed\n get data() {\n return {\n isVtoSkinCareCtaEnabled: this.isVtoSkinCareCtaEnabled,\n isVtoSkinCareEnabled: this.isVtoSkinCareEnabled,\n isVtoSkinCareOpened: this.isVtoSkinCareOpened,\n isVtoSkinAnalysisFinished: this.isVtoSkinAnalysisFinished,\n isVtoSkinCareResultInProgress: this.isVtoSkinCareResultInProgress,\n isVtoSkinCareResultSectionEnabled: this.isVtoSkinCareResultSectionEnabled,\n isResultCtaFixed: this.isResultCtaFixed,\n isSkinCareNodeResultEnabled: this.isSkinCareNodeResultEnabled,\n isShoppable: this.isShoppable,\n isSupportedBrowserOverlayVisible: this.isSupportedBrowserOverlayVisible,\n isSupportedBrowserOverlayOpen: this.isSupportedBrowserOverlayOpen\n };\n }\n\n @action\n public updateVtoSkinCareState = () => {\n this.isVtoSkinCareEnabled = !!(\n this.vtoSkinCareConfig &&\n this.vtoSkinCareConfig.enabled &&\n this.vtoSkinCareFeature &&\n this.vtoSkinCareFeature.enabled\n );\n };\n\n public loaded = async () => {\n window.addEventListener('scroll', this.handleScroll);\n };\n\n public initVtoSkinCare = () => {\n if (this.isVtoSkincareSupportedBrowserOverlayEnabled) {\n this.showSupportedBrowserOverlay();\n\n return;\n }\n if (typeof window.ymkAsyncInit !== 'function') {\n const { apiUrl, apiKey } = this.vtoSkinCareConfig;\n this.loadVto(apiUrl, apiKey);\n this.declareVtoSkincareCallback();\n }\n window.ymkAsyncInit();\n this.toggleVtoSkinCareCtaState(false);\n emit(events.VTO_SKIN_CARE_OPENED, { vtoType: VtoTypes.SKINCARE });\n };\n\n @action\n public toggleVtoSkinCareCtaState = (isEnabled: boolean) => {\n this.isVtoSkinCareCtaEnabled = isEnabled;\n };\n\n @action\n public toggleVtoSkinCareOpenedState = (isOpened: boolean) => {\n this.isVtoSkinCareOpened = isOpened;\n };\n\n @action\n public toggleVtoSkinAnalysisState = (isFinished: boolean) => {\n this.isVtoSkinAnalysisFinished = isFinished;\n };\n\n @action\n public toggleVtoSkinResultProgress = (isEnabled: boolean) => {\n this.isVtoSkinCareResultInProgress = isEnabled;\n };\n\n @action\n public toggleSkinCareResultSection = (isEnabled: boolean) => {\n this.isVtoSkinCareResultSectionEnabled = isEnabled;\n };\n\n @action\n public toggleResultCtaFixedPosition = (isFixed: boolean) => {\n this.isResultCtaFixed = isFixed;\n };\n\n @action\n public enableSkinCareNodeResult = () => {\n this.isSkinCareNodeResultEnabled = true;\n };\n\n public vtoSkinCareStartOver = () => {\n window.YMK.close();\n this.toggleSkinCareResultSection(false);\n if (this.isSkincareSurveyEnabled) {\n document.body.classList.remove('hide-questions');\n }\n };\n\n public vtoSkinCareYourAnalysis = () => {\n if (!this.isSkincareSurveyEnabled) {\n return;\n }\n this.toggleSkinCareResultSection(false);\n this.toggleVtoSkinAnalysisState(true);\n document.body.classList.add('hide-questions');\n };\n\n public showVtoSkinCareResult = async () => {\n this.scrollToVtoSkinCare();\n this.toggleVtoSkinResultProgress(true);\n this.processVtoProductResult();\n this.filterVtoSkinConcernScores();\n await this.updateQuizApiResult();\n this.preprocessSkinCareProductResult();\n this.preprocessPriorityProductResult();\n this.toggleSkinCareResultSection(true);\n this.toggleVtoSkinResultProgress(false);\n };\n\n private scrollToVtoSkinCare() {\n const vtoSkinCareRef = this.vtoSkinCareRef;\n const { SCROLL_BEHAVIOR_SMOOTH, SCROLL_BLOCK_START } = VtoSkinCareConstants;\n if (vtoSkinCareRef && vtoSkinCareRef.current) {\n vtoSkinCareRef.current.scrollIntoView({\n behavior: SCROLL_BEHAVIOR_SMOOTH,\n block: SCROLL_BLOCK_START\n });\n }\n }\n\n private declareVtoSkincareCallback() {\n window.ymkAsyncInit = () => {\n if (typeof window.YMK !== 'undefined') {\n const vtoSkinCareParams = this.getVtoSkinCareParams();\n window.YMK.init(vtoSkinCareParams);\n window.YMK.openSkincare(VtoSkinCareConstants.SKIN_CARE_MODE);\n this.addEventListeners(\n VtoSkinCareConstants.VtoSkinCareEvents,\n this.vtoSkinCareHandlers\n );\n }\n };\n }\n\n private getVtoSkinCareParams() {\n const iframeHeight = this.getIframeHeight();\n const { language } = this.vtoSkinCareConfig;\n\n return {\n autoOpen: false,\n showCloseBtnOnLauncher: true,\n height: iframeHeight,\n ...(language && { language })\n };\n }\n\n private getIframeHeight() {\n const { IFRAME_MIN_HEIGHT } = VtoSkinCareConstants;\n const innerHeight = window.innerHeight;\n const stickyHeight = (this.vtoSkinCareFeature && this.vtoSkinCareFeature.stickyHeight) || 0;\n const availableHeight = innerHeight - stickyHeight;\n const iframeHeight =\n availableHeight < IFRAME_MIN_HEIGHT ? IFRAME_MIN_HEIGHT : availableHeight;\n\n return iframeHeight;\n }\n\n private vtoSkinCareHandlers: {\n [key in VtoSkinCareConstants.VtoSkinCareEvents]: (\n result: IVtoSkinCareHandlerResult\n ) => void;\n } = {\n [VtoSkinCareConstants.VtoSkinCareEvents.OPENED]: () => this.handleVtoSkinCareOpenedEvent(),\n [VtoSkinCareConstants.VtoSkinCareEvents.CAMERA_OPENED]: () =>\n emit(events.VTO_SKIN_CARE_CAMERA_OPENED, { vtoType: VtoTypes.SKINCARE }),\n [VtoSkinCareConstants.VtoSkinCareEvents.CAMERA_FAILED]: () =>\n emit(events.VTO_SKIN_CARE_CAMERA_FAILED, { vtoType: VtoTypes.SKINCARE }),\n [VtoSkinCareConstants.VtoSkinCareEvents.CAMERA_CLOSED]: () =>\n emit(events.VTO_SKIN_CARE_CAMERA_CLOSED, { vtoType: VtoTypes.SKINCARE }),\n [VtoSkinCareConstants.VtoSkinCareEvents.LOADING]: (percentage: IVtoSkinCareLoadingEvent) =>\n this.handleVtoSkinCareLoadingEvent(percentage),\n [VtoSkinCareConstants.VtoSkinCareEvents.LOADED]: () =>\n emit(events.VTO_SKIN_CARE_LOADED, { vtoType: VtoTypes.SKINCARE }),\n [VtoSkinCareConstants.VtoSkinCareEvents.VIDEO_LOADED]: () =>\n emit(events.VTO_SKIN_CARE_VIDEO_LOADED, { vtoType: VtoTypes.SKINCARE }),\n [VtoSkinCareConstants.VtoSkinCareEvents.SKIN_ANALYSIS_STARTED]: () =>\n this.handleVtoSkinAnalysisStartedEvent(),\n [VtoSkinCareConstants.VtoSkinCareEvents.SKIN_ANALYSIS_FINISHED]: (\n result: IVtoSkinConcernScores\n ) => this.handleVtoSkinAnalysisFinishedEvent(result),\n [VtoSkinCareConstants.VtoSkinCareEvents.SKIN_BACK_TO_DETECTING]: () =>\n emit(events.VTO_SKIN_BACK_TO_DETECTING, { vtoType: VtoTypes.SKINCARE }),\n [VtoSkinCareConstants.VtoSkinCareEvents.CLOSED]: () => this.handleVtoSkinCareClosedEvent()\n };\n\n private handleVtoSkinCareOpenedEvent() {\n emit(events.VTO_SKIN_CARE_OPENED, { vtoType: VtoTypes.SKINCARE });\n this.toggleVtoSkinCareOpenedState(true);\n }\n\n private handleVtoSkinCareClosedEvent() {\n emit(events.VTO_SKIN_CARE_CLOSED, { vtoType: VtoTypes.SKINCARE });\n this.toggleVtoSkinCareCtaState(true);\n this.toggleVtoSkinCareOpenedState(false);\n this.toggleVtoSkinAnalysisState(false);\n this.removeVtoEventListeners();\n }\n\n private handleVtoSkinCareLoadingEvent = (percentage: IVtoSkinCareLoadingEvent) => {\n if (percentage === VtoSkinCareConstants.LOADING_PERCENTAGE_EVENT_TRIGGERED) {\n emit(events.VTO_SKIN_CARE_LOADING, { vtoType: VtoTypes.SKINCARE });\n }\n };\n\n private handleVtoSkinAnalysisStartedEvent() {\n emit(events.VTO_SKIN_ANALYSIS_STARTED, { vtoType: VtoTypes.SKINCARE });\n this.toggleVtoSkinAnalysisState(false);\n }\n\n private handleVtoSkinAnalysisFinishedEvent(result: IVtoSkinConcernScores) {\n this.vtoSkinConcernScores = result;\n emit(events.VTO_SKIN_ANALYSIS_FINISHED, { vtoType: VtoTypes.SKINCARE });\n this.toggleVtoSkinAnalysisState(true);\n }\n\n private processVtoProductResult() {\n window.YMK.getSkincareRecommendationList((skinCareProductList: ISkinCareProductList[]) => {\n const vtoSkinCareElem = document.getElementsByClassName('js-elc-vto-skin-care')[0];\n this.vtoSkinCareProductIds = [];\n this.vtoSkinCareBenefitTypes = [];\n\n this.priorityProductIds = [];\n this.priorityBenefitResult = [];\n\n skinCareProductList.forEach((product) => {\n if (product.isPriority) {\n this.priorityProductIds.push(product.productId);\n this.priorityBenefitResult.push(product.category);\n } else {\n this.vtoSkinCareProductIds.push(product.productId);\n this.vtoSkinCareBenefitTypes.push(product.category);\n }\n });\n if (this.isSkincareSurveyEnabled) {\n vtoSkinCareElem?.setAttribute(\n 'data-vto-prod-results',\n JSON.stringify(skinCareProductList)\n );\n } else {\n vtoSkinCareElem?.setAttribute(\n 'data-result-products',\n JSON.stringify(this.vtoSkinCareProductIds)\n );\n }\n });\n }\n\n // Refer https://confluence.esteeonline.com/display/GSBA/EL+YouCam+Skincare+VTO for this logic\n private filterVtoSkinConcernScores() {\n const vtoSkinConcernScores = { ...this.vtoSkinConcernScores };\n const { FaceConcerns } = VtoSkinCareConstants;\n\n vtoSkinConcernScores[\n FaceConcerns.linesAndWrinkles\n ] = this.getForeheadAndLowerFaceWrinkleAvg(vtoSkinConcernScores);\n\n const sortedSkinConcernScores = Object.entries(vtoSkinConcernScores).sort(function (a, b) {\n return b[1] - a[1];\n });\n\n const queryParams = this.getQueryParams(sortedSkinConcernScores);\n if (this.isSkincareSurveyEnabled) {\n const vtoSkinCareElem = document.getElementsByClassName('js-elc-vto-skin-care')[0];\n vtoSkinCareElem.setAttribute(\n 'data-vto-skinconcern',\n JSON.stringify(sortedSkinConcernScores)\n );\n }\n\n this.quizApiQuery = { queryParams: queryParams };\n }\n\n private getForeheadAndLowerFaceWrinkleAvg = (vtoSkinConcernScores: IVtoSkinConcernScores) => {\n const { OtherConcerns } = VtoSkinCareConstants;\n\n return (\n (vtoSkinConcernScores[OtherConcerns.wrinkleForehead] +\n vtoSkinConcernScores[OtherConcerns.wrinkleLowerFace]) /\n 2\n );\n };\n\n private getQueryParams(skinConcernScores: [string, number][]) {\n const {\n FACE_CONCERN_PARAM,\n EYE_CONCERN_PARAM,\n SKIN_TYPE_PARAM,\n SKIN_TYPE_VALUE,\n QuizApiConcerns\n } = VtoSkinCareConstants;\n\n return skinConcernScores.reduce(\n (acc, [skinConcern, score]) => {\n if (this.existsAndFaceArrayIsLessThanTwo(skinConcern, acc[FACE_CONCERN_PARAM])) {\n const faceConcernKey = this.getFaceConcernKey(skinConcern);\n\n acc[FACE_CONCERN_PARAM].push(\n QuizApiConcerns[faceConcernKey as keyof typeof QuizApiConcerns]\n );\n\n return acc;\n }\n\n if (\n this.existsAndEyeConcernArrayIsLessThanOne(skinConcern, acc[EYE_CONCERN_PARAM])\n ) {\n const eyeConcernKey = this.getEyeConcernKey(skinConcern);\n\n acc[EYE_CONCERN_PARAM].push(\n QuizApiConcerns[eyeConcernKey as keyof typeof QuizApiConcerns]\n );\n\n return acc;\n }\n\n return acc;\n },\n {\n [FACE_CONCERN_PARAM]: Array(),\n [EYE_CONCERN_PARAM]: Array(),\n [SKIN_TYPE_PARAM]: SKIN_TYPE_VALUE\n }\n );\n }\n\n private existsAndFaceArrayIsLessThanTwo = (skinConcern: string, FaceArray: string[]) => {\n const faceConcernValues = Object.values(VtoSkinCareConstants.FaceConcerns);\n\n return (\n faceConcernValues.indexOf(skinConcern as VtoSkinCareConstants.FaceConcerns) !== -1 &&\n FaceArray.length < 2\n );\n };\n\n private getFaceConcernKey = (skinConcern: string) => {\n const { FaceConcerns } = VtoSkinCareConstants;\n const faceConcernKeys = Object.keys(FaceConcerns);\n\n return faceConcernKeys.find(\n (key) => FaceConcerns[key as keyof typeof FaceConcerns] === skinConcern\n );\n };\n\n private existsAndEyeConcernArrayIsLessThanOne = (skinConcern: string, EyeArray: string[]) => {\n const eyeConcernValues = Object.values(VtoSkinCareConstants.EyeConcerns);\n\n return (\n eyeConcernValues.indexOf(skinConcern as VtoSkinCareConstants.EyeConcerns) !== -1 &&\n EyeArray.length < 1\n );\n };\n\n private getEyeConcernKey = (skinConcern: string) => {\n const { EyeConcerns } = VtoSkinCareConstants;\n const eyeConcernKeys = Object.keys(EyeConcerns);\n\n return eyeConcernKeys.find(\n (key) => EyeConcerns[key as keyof typeof EyeConcerns] === skinConcern\n );\n };\n\n private async updateQuizApiResult() {\n const vtoQuizResult: VtoQuiz[] = await this.quizApiRepository.getQuizApiResult(\n this.quizApiQuery,\n this.vtoSkinCareQuizId\n );\n this.vtoQuizResult = {} as VtoQuiz;\n if (vtoQuizResult.length === 0) {\n return;\n }\n this.vtoQuizResult = { ...vtoQuizResult[0] };\n }\n\n private preprocessSkinCareProductResult() {\n this.updateProductSource();\n this.productItems = this.getProductItems(this.finalProductIds);\n this.productBenefitTypes = this.getBenefitTypes(\n this.finalBenefitTypes,\n this.finalProductIds\n );\n }\n\n private preprocessPriorityProductResult() {\n this.priorityProductItems = this.getProductItems(this.priorityProductIds);\n this.priorityProductBenefitTypes = this.getBenefitTypes(\n this.priorityBenefitResult,\n this.priorityProductIds\n );\n }\n\n private updateProductSource() {\n this.finalProductIds = this.isVtoResultEnabled\n ? this.vtoSkinCareProductIds\n : this.vtoQuizResult.productIds\n ? this.vtoQuizResult.productIds.split(',')\n : [];\n this.finalBenefitTypes = this.isVtoResultEnabled\n ? this.vtoSkinCareBenefitTypes\n : this.vtoQuizResult.productBenefitTypes\n ? this.vtoQuizResult.productBenefitTypes.split(',')\n : [];\n }\n\n private async preprocessSkinCareNodeResult() {\n this.skinCareContentResultPromises = [];\n this.skinCareContentResultKeys = [];\n this.pushResultNodesToPromise();\n this.pushEditorialNodeToPromise();\n const data = await Promise.all(this.skinCareContentResultPromises);\n this.handleSkinCareContentResults(data);\n }\n\n private pushResultNodesToPromise() {\n Object.entries(this.vtoQuizResult).forEach(([key, value]) => {\n if (typeof value === 'number' && !this.skinCareResultNodeBlocks[key]) {\n this.skinCareContentResultPromises.push(this.getNodeContent(value));\n this.skinCareContentResultKeys.push(key);\n }\n });\n }\n\n private pushEditorialNodeToPromise() {\n const { EDITORIAL_NODE_KEY } = VtoSkinCareConstants;\n if (this.editorialNodeId && !this.skinCareResultNodeBlocks[EDITORIAL_NODE_KEY]) {\n this.skinCareContentResultPromises.push(this.getNodeContent(this.editorialNodeId));\n this.skinCareContentResultKeys.push(EDITORIAL_NODE_KEY);\n }\n }\n\n private handleSkinCareContentResults(data: string[]) {\n this.skinCareContentResultKeys.forEach((skinCareContentResultKey, index) => {\n this.skinCareResultNodeBlocks[skinCareContentResultKey] = data[index];\n });\n this.enableSkinCareNodeResult();\n }\n\n private async getNodeContent(value: number) {\n if (typeof site.elcContentApi === 'undefined') {\n return '';\n }\n const {\n DEFAULT_LOCALE,\n DRUPAL_API_TOKEN,\n DRUPAL_API_FIELDS,\n REVISION_TAG_COOKIE,\n LOCALE_COOKIE\n } = VtoSkinCareConstants;\n const params: IContentApiParams = {\n revision_tag: BrowserStorage.getCookie(REVISION_TAG_COOKIE) || '',\n locale: BrowserStorage.getCookie(LOCALE_COOKIE) || DEFAULT_LOCALE,\n node: value,\n key: DRUPAL_API_TOKEN,\n field: DRUPAL_API_FIELDS\n };\n const data = await site.elcContentApi.getData(params, true);\n\n return data.rendered;\n }\n\n private getProductItems(productIds: string[]) {\n const { SKU_ITEM, PRODUCT_ITEM } = VtoSkinCareConstants;\n const productType =\n this.isVtoResultEnabled && !this.isSkincareSurveyEnabled ? SKU_ITEM : PRODUCT_ITEM;\n\n return productIds.reduce((acc: IProductGridItem[], item: string) => {\n acc.push({ type: productType, params: { id: item } });\n\n return acc;\n }, []);\n }\n\n private getBenefitTypes(benefitTypes: string[], productIds: string[]) {\n return benefitTypes.reduce((acc, value, index) => {\n const benefitTypeValue = value\n .replace(/ |_/gi, '')\n .toLowerCase() as keyof IVtoSkinCareTranslations;\n const translations = this.translations;\n const translationKey = Object.keys(translations).find(\n (key) => key.toLowerCase().indexOf(benefitTypeValue) !== -1\n ) as keyof IVtoSkinCareTranslations;\n\n const newBenefitTypeValue =\n typeof translationKey !== 'undefined'\n ? translations[translationKey]\n : benefitTypeValue;\n\n return { ...acc, [productIds[index]]: newBenefitTypeValue };\n }, {} as IProductBenefitTypes);\n }\n\n private handleScroll = () => {\n this.debounce(this.handleSeeResultButtonOnScroll, VtoSkinCareConstants.SCROLL_TIMEOUT);\n };\n\n private debounce(callback: () => void, timeoutValue: number) {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n this.debounceTimeout = setTimeout(callback, timeoutValue);\n }\n\n private handleSeeResultButtonOnScroll = () => {\n const vtoSkinCareRef = this.vtoSkinCareRef && this.vtoSkinCareRef.current;\n if (!vtoSkinCareRef) {\n return;\n }\n const offset =\n vtoSkinCareRef.getBoundingClientRect().bottom + VtoSkinCareConstants.OFFSET_HEIGHT;\n const isFixed = offset > screen.height;\n this.toggleResultCtaFixedPosition(isFixed);\n };\n\n public handleUnmount() {\n window.removeEventListener('scroll', this.handleScroll);\n }\n\n public vtoSkinCareNodesLoaded = () => {\n emit(events.VTO_SKIN_CARE_RESULT_LOADED, { vtoType: VtoTypes.SKINCARE });\n };\n\n public vtoSkincareProductGridLoaded = (productGridRef: React.RefObject) => {\n this.productGridRef = productGridRef;\n this.observeProductGrid();\n emit(events.VTO_SKIN_CARE_PRODUCTS_LOADED, {\n isShoppable: this.isShoppable,\n vtoType: VtoTypes.SKINCARE\n });\n };\n\n private observeProductGrid() {\n const productGridContainer = this.productGridRef.current;\n if (productGridContainer === null) {\n return;\n }\n const mutationObserver: IMutationObserver = new MutationObserver(this.onProductGridLoaded);\n const config = {\n childList: true,\n subtree: true\n };\n\n mutationObserver.observe(productGridContainer, config);\n }\n\n private onProductGridLoaded = (\n mutationList: MutationRecord[],\n mutationObserver: IMutationObserver\n ) => {\n mutationList.forEach((mutation) => {\n if (mutation.type === 'childList') {\n this.preprocessSkinCareNodeResult();\n mutationObserver.disconnect();\n }\n });\n };\n\n private checkShoppableStatus() {\n const shoppableQueryParam = this.getQueryParam(VtoSkinCareConstants.SHOPPABLE_QUERY_PARAM);\n\n if (\n shoppableQueryParam &&\n shoppableQueryParam === VtoSkinCareConstants.NON_SHOPPABLE_QUERY_VALUE\n ) {\n this.isShoppable = false;\n }\n }\n\n @computed\n get isVtoSkincareSupportedBrowserOverlayEnabled() {\n return (\n this.isVtoSkinCareEnabled &&\n this.vtoSkinCareFeature?.isSupportedBrowserMsgEnabled &&\n this.isSupportedBrowserUserAgent\n );\n }\n\n private enableVto() {\n if (this.isVtoSkinCareEnabled) {\n emit(events.VTO_ENABLED, { vtoType: VtoTypes.SKINCARE });\n }\n }\n}\n","import { HeaderType, HeaderObject, root } from '@estee/elc-universal-utils';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\n\nexport const AUTHORIZATION_HEADER_NAME = 'AuthorizationToken';\nexport const BUSINESS_UNIT_HEADER_NAME = 'Business-Unit';\n\nexport interface IError {\n status: number;\n}\nexport interface IDataMapperOperations {\n [key: string]: Function | undefined;\n request?(request: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n response?(response: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n}\nexport interface IDataMappings {\n [key: string]: IDataMapperOperations;\n}\nexport interface IResponse {\n data: T;\n reponseHeaders: Headers | {};\n}\nexport interface IPayload {\n url: string;\n body?: {};\n options?: {};\n headers?: {};\n returnAsPlainText?: boolean;\n}\nexport interface IGetPayload {\n url: string;\n options?: {};\n headers?: {};\n params?: {};\n}\nexport interface IRequestOptions {\n debounceInterval?: number;\n bypassCache?: boolean;\n}\nexport interface IHttpTransport {\n addGlobalHeaders(header: HeaderObject): void;\n removeGlobalHeader(headerName: string): void;\n delete(payload: string | IPayload): Promise>;\n post(payload: IPayload): Promise>;\n patch(payload: IPayload): Promise>;\n put(payload: IPayload): Promise>;\n get(payload: string | IGetPayload, IRequestOptions?: IRequestOptions): Promise>;\n}\nexport interface IDataMapper {\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapRequest(name: string, request: Object): {};\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapResponse(name: string, response: Object): {};\n dataMappings?: IDataMappings;\n}\n\nexport interface IConfig {\n cartId?: string;\n httpTransport: IHttpTransport;\n dataMapper?: IDataMapper;\n businessUnitId?: string;\n drupalDomain?: string;\n}\n\nexport class Api {\n protected bearerToken: string;\n protected httpTransport: IHttpTransport;\n protected businessUnitId: string | undefined;\n private logger: ELCLogger;\n\n constructor(configStore: IConfig, serviceName: string, serviceVersion: string) {\n this.httpTransport = configStore.httpTransport;\n this.businessUnitId = configStore.businessUnitId;\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n }\n\n public addHeader(header: HeaderObject) {\n this.httpTransport.addGlobalHeaders(header);\n }\n\n public removeHeader(headerName: HeaderType) {\n this.httpTransport.removeGlobalHeader(headerName);\n }\n\n public setBearerToken(bearerToken: string) {\n if (bearerToken) {\n this.addHeader({\n [AUTHORIZATION_HEADER_NAME]: `${bearerToken}`\n });\n } else {\n this.removeHeader(AUTHORIZATION_HEADER_NAME);\n }\n }\n protected delete = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.delete(payload);\n } catch (e) {\n this.handleError(e, 'delete', payload);\n }\n\n return response;\n };\n\n protected get = async (\n payload: IGetPayload | string,\n { debounceInterval = 200, bypassCache = false }: IRequestOptions = {}\n ) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.get(payload, {\n debounceInterval,\n bypassCache\n });\n } catch (e) {\n this.handleError(e, 'get', payload);\n }\n\n return response;\n };\n\n protected patch = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.patch(payload);\n } catch (e) {\n this.handleError(e, 'patch', payload);\n }\n\n return response;\n };\n\n protected post = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n try {\n response = await this.httpTransport.post(payload);\n } catch (e) {\n this.handleError(e, 'post', payload);\n }\n\n return response;\n };\n protected put = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.put(payload);\n } catch (e) {\n this.handleError(e, 'put', payload);\n }\n\n return response;\n };\n\n private handleError = (e: Error, requestType: string, originalPayload: IPayload | string) => {\n this.logger.error({\n triggerType: TriggerType.api,\n message: `${e}`,\n payload: {\n context: {\n subdomain: root.site && root.site.client && root.site.client.subdomain,\n originalPayload,\n requestType\n },\n error: e\n }\n });\n };\n}\n","import { Api, IConfig } from '@estee/elc-service';\nimport { query, serviceQueries } from '@estee/elc-service-bus';\n\nexport interface IQuizResult {\n data: IVtoQuizData;\n}\n\nexport interface IVtoQuizData {\n quizId: string;\n results: IQuizResultData[];\n}\n\nexport interface IQuizResultData {\n product_benefit_type: string;\n product_id: string;\n crosssell_content_1: number;\n extra_care: number;\n skin_diagrams: number;\n skincare_regimen: number;\n tips: number;\n}\n\nexport interface IQuizParam {\n queryParams: {\n face_concern: string[];\n eye_concern: string[];\n skin_type: string;\n };\n}\n\nexport class QuizApiSdk extends Api {\n private apiBasePath: string;\n\n constructor(configStore: IConfig, serviceName: string, serviceVersion: string) {\n super(configStore, serviceName, serviceVersion);\n this.apiBasePath = 'stardust-foundation-quiz-v1';\n }\n\n public async getQuizDataByQuizId(param: IQuizParam, quizId: string): Promise {\n const url = `/${this.apiBasePath}/quiz/${quizId}/query`;\n const token = { AuthorizationToken: await query(serviceQueries.GET_GUEST_AUTH_TOKEN) };\n const response: IQuizResult = await this.post({\n url: url,\n headers: token,\n body: param\n });\n\n return response.data;\n }\n}\n","import { Api } from '@estee/elc-service';\n\nexport interface IPersonalizationData {\n id: string;\n userPersonalizationData: string;\n tags: string[];\n userIdentifier: string;\n userIdentifierType: string;\n creationDate: string;\n}\n\nexport interface IPersonalizationRequestData {\n userPersonalizationData: string;\n tags: string[];\n userIdentifier: string;\n userIdentifierType: string;\n}\n\ninterface IPersonalizationResponse {\n data: IPersonalizationData;\n}\n\nexport interface IPersonalizationGetDataResponse {\n data: IPersonalizationData[];\n}\n\nexport class PersonalizationApiSdk extends Api {\n private apiBasePath: string = 'stardust-foundation-user-personalization-v0';\n\n public async createPersonalizationData(\n data: IPersonalizationRequestData\n ): Promise {\n const url = `/${this.apiBasePath}/userPersonalizationData/`;\n\n const response: IPersonalizationResponse = await this.post({\n url,\n body: data\n });\n\n return response.data;\n }\n\n public async getPersonalizationDataByPerlgemUserId(\n fields: string[],\n perlgemId: string\n ): Promise {\n const url = `/${this.apiBasePath}/userPersonalizationData/perlgem_user_id/${perlgemId}`;\n\n const response: IPersonalizationGetDataResponse = await this.post({\n url,\n body: { fields }\n });\n\n return response.data;\n }\n\n public async deletePersonalizationDataByPerlgemUserId(perlgemId: string) {\n const url = `/${this.apiBasePath}/userPersonalizationData/perlgem_user_id/${perlgemId}`;\n\n const response = await this.delete({ url });\n\n return response.data;\n }\n}\n","import { Api } from '@estee/elc-service';\nimport { FORM_DATA_FIELD, GOOGLE_FORMS_URL } from '~constants/VtoSurvey';\n\nexport interface ISurveyData {\n np: string;\n comment: string;\n userIdentifier: string;\n page: string;\n vtoType: string;\n}\n\nexport class SurveyApiSdk extends Api {\n public saveSurveyData = async (surveyData: ISurveyData): Promise => {\n const url = GOOGLE_FORMS_URL;\n\n await this.post({\n url,\n headers: {\n 'Content-Type': 'application/json'\n },\n options: {\n mode: 'no-cors'\n },\n body: this.getSurveyData(surveyData)\n });\n };\n\n private getSurveyData = (surveyData: ISurveyData) => {\n const dataToPost = new FormData();\n\n dataToPost.append(FORM_DATA_FIELD.USER_IDENTIFIER_FIELD, surveyData.userIdentifier);\n dataToPost.append(FORM_DATA_FIELD.PAGE_FIELD, surveyData.page);\n dataToPost.append(FORM_DATA_FIELD.VTO_TYPE_FIELD, surveyData.vtoType);\n dataToPost.append(FORM_DATA_FIELD.NP_FIELD, surveyData.np);\n dataToPost.append(FORM_DATA_FIELD.COMMENT_FIELD, surveyData.comment);\n\n return dataToPost;\n };\n}\n","import { IQuizResultData } from '../../../api/QuizApiSdk';\r\n\r\nexport class VtoQuiz {\r\n public productBenefitTypes: string;\r\n public productIds: string;\r\n public crosssellNode: number;\r\n public extraCareNode: number;\r\n public skinDiagramNode: number;\r\n public skincareRegimenNode: number;\r\n public skinTipsNode: number;\r\n\r\n public static fromJson(data: IQuizResultData): VtoQuiz {\r\n const vtoQuiz = new VtoQuiz();\r\n vtoQuiz.productBenefitTypes = data.product_benefit_type;\r\n vtoQuiz.productIds = data.product_id;\r\n vtoQuiz.crosssellNode = Number(data.crosssell_content_1);\r\n vtoQuiz.extraCareNode = Number(data.extra_care);\r\n vtoQuiz.skinDiagramNode = Number(data.skin_diagrams);\r\n vtoQuiz.skincareRegimenNode = Number(data.skincare_regimen);\r\n vtoQuiz.skinTipsNode = Number(data.tips);\r\n\r\n return vtoQuiz;\r\n }\r\n}\r\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/VtoService';\nimport { QuizApiSdk, IQuizParam, IQuizResultData } from '~api/QuizApiSdk';\nimport { VtoQuiz } from '~domain/entities/VtoQuiz';\n\nexport interface IQuizApiResult {\n [key: string]: VtoQuiz[];\n}\n\nexport class QuizApiRepository {\n private quizApiSdk: QuizApiSdk;\n private quizApiResult: IQuizApiResult = {};\n\n constructor() {\n this.quizApiSdk = diContainer.get(serviceNames.quizApiSdk);\n }\n\n public async getQuizApiResult(param: IQuizParam, vtoQuizApiId: string) {\n const paramString = this.getStringifyParam(param);\n const resultKey = Object.keys(this.quizApiResult).find((key) => key === paramString);\n if (!resultKey) {\n await this.loadQuizApiData(param, vtoQuizApiId);\n }\n\n return this.quizApiResult[paramString];\n }\n\n private async loadQuizApiData(param: IQuizParam, vtoQuizApiId: string) {\n const data = await this.quizApiSdk.getQuizDataByQuizId(param, vtoQuizApiId);\n this.setQuizApiResult(data.results, param);\n }\n\n private setQuizApiResult(data: IQuizResultData[], param: IQuizParam) {\n const paramString = this.getStringifyParam(param);\n this.quizApiResult[paramString] = data.map((result) => VtoQuiz.fromJson(result));\n }\n\n private getStringifyParam(param: IQuizParam) {\n return JSON.stringify(param);\n }\n}\n","import { IPersonalizationData } from '../../../api/PersonalizationApiSdk';\n\nexport class Personalization {\n public id: string;\n public userPersonalizationData: string;\n public tags: string[];\n public userId: string;\n public userType: string;\n public creationDate: string;\n\n public static fromJson(data: IPersonalizationData): Personalization {\n const personalization = new Personalization();\n personalization.id = data.id;\n personalization.userPersonalizationData = data.userPersonalizationData;\n personalization.tags = data.tags;\n personalization.userId = data.userIdentifier;\n personalization.userType = data.userIdentifierType;\n personalization.creationDate = data.creationDate;\n\n return personalization;\n }\n}\n","import {\n IPersonalizationRequestData,\n PersonalizationApiSdk\n} from '../../api/PersonalizationApiSdk';\nimport { API_REQUEST_TIMEOUT } from '../constants/Vto';\nimport { Personalization } from '../domain/entities/Personalization';\n\ninterface IPersonalizedData {\n [key: string]: Personalization[];\n}\n\nexport interface IPromiseStack {\n key: string;\n resolve(personalizedData: Personalization[]): void;\n reject(error?: Error): void;\n}\nexport interface IApiQueue {\n fields: string[];\n perlgemId: string;\n}\n\nexport class PersonalizationRepository {\n private personalizationApiSdk: PersonalizationApiSdk;\n private personalizedData: IPersonalizedData = {};\n private promiseStack: IPromiseStack[] = [];\n private apiQueue: { [key: string]: IApiQueue } = {};\n private timeout: number;\n\n constructor(personalizationApiSdk: PersonalizationApiSdk) {\n this.personalizationApiSdk = personalizationApiSdk;\n }\n\n public async createPersonalizationData(requestData: IPersonalizationRequestData) {\n const data = await this.personalizationApiSdk.createPersonalizationData(requestData);\n\n return Personalization.fromJson(data);\n }\n\n public async getPersonalizationDataByPerlgemUserId(fields: string[], perlgemId: string) {\n const key = [...fields].sort().toString().concat(perlgemId);\n\n if (this.personalizedData[key]) {\n return this.personalizedData[key];\n }\n\n if (!this.apiQueue[key]) {\n this.apiQueue[key] = { fields, perlgemId };\n\n // Prevent multi parallel duplicate API calls\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(this.getPersonalizedData, API_REQUEST_TIMEOUT);\n }\n\n return new Promise((resolve, reject) => {\n this.promiseStack.push({ key, resolve, reject });\n });\n }\n\n public async deletePersonalizationDataByPerlgemUserId(perlgemId: string) {\n const response = await this.personalizationApiSdk.deletePersonalizationDataByPerlgemUserId(\n perlgemId\n );\n\n return response;\n }\n\n private getPersonalizedData = async () => {\n const apiQueue = Object.entries(this.apiQueue);\n\n for (const [index, api] of apiQueue) {\n const { fields, perlgemId } = api;\n\n const data = await this.personalizationApiSdk.getPersonalizationDataByPerlgemUserId(\n fields,\n perlgemId\n );\n\n if (Array.isArray(data)) {\n this.personalizedData[index] = data.map((match) => Personalization.fromJson(match));\n }\n }\n\n this.resolvePromise();\n };\n\n private resolvePromise() {\n this.promiseStack.forEach((promise) => {\n const personalizedData = this.personalizedData[promise.key];\n personalizedData\n ? promise.resolve(personalizedData)\n : promise.reject(new Error('No personalized data'));\n });\n\n this.promiseStack = [];\n this.apiQueue = {};\n }\n}\n","import { IUserInfoResponse } from '../../repositories/UserInfoRepository';\n\nexport class UserInfo {\n public isSignedIn: boolean;\n public id: string;\n public sessionId?: string;\n\n public static fromJson(data: IUserInfoResponse): UserInfo {\n const user = new UserInfo();\n user.isSignedIn = data.signed_in;\n user.id = data.user_id;\n user.sessionId = data.session_id;\n\n return user;\n }\n\n get userId() {\n return this.isSignedIn && this.id;\n }\n}\n","import { query, serviceQueries } from '@estee/elc-service-bus';\nimport { UserInfo } from '../domain/entities/UserInfo';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\nimport { API_REQUEST_TIMEOUT } from '../constants/Vto';\n\nexport interface IUserInfoResponse {\n signed_in: boolean;\n user_id: string;\n session_id?: string;\n}\n\nexport interface IPromiseStack {\n resolve(value: UserInfo): void;\n reject(error?: Error): void;\n}\n\nexport class UserInfoRepository {\n private userInfo: UserInfo;\n private logger: ELCLogger;\n private timeout: number;\n private promiseStack: IPromiseStack[] = [];\n private isRequestInProgress: boolean = false;\n\n constructor(serviceName: string, serviceVersion: string) {\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n }\n\n public async getUser(): Promise {\n if (this.userInfo) {\n return this.userInfo;\n }\n\n return this.getUserDetails();\n }\n\n public getUserId = async () => {\n const user = await this.getUser();\n\n if (user && user.isSignedIn) {\n return user.id;\n }\n };\n\n private async getUserDetails(): Promise {\n // Prevent multi parallel duplicate API calls\n if (!this.isRequestInProgress) {\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(this.queryUserDetails, API_REQUEST_TIMEOUT);\n }\n\n return new Promise((resolve, reject) => {\n this.promiseStack.push({ resolve, reject });\n });\n }\n\n private queryUserDetails = async () => {\n try {\n this.isRequestInProgress = true;\n\n const data = await query(serviceQueries.GET_USER_DETAILS);\n\n this.isRequestInProgress = false;\n\n this.userInfo = UserInfo.fromJson((data as unknown) as IUserInfoResponse);\n\n this.handlePromise();\n } catch (e) {\n this.isRequestInProgress = false;\n this.handlePromise();\n\n this.logger.error({\n triggerType: TriggerType.runtimeError,\n message: `${e}`\n });\n }\n };\n\n private handlePromise() {\n this.promiseStack.forEach((promise) => {\n this.userInfo\n ? promise.resolve(this.userInfo)\n : promise.reject(new Error('No user info'));\n });\n\n this.promiseStack = [];\n }\n}\n","import { ELCLogger, TriggerType } from '@estee/elc-logging';\nimport { ISurveyData, SurveyApiSdk } from '~api/SurveyApiSdk';\n\nexport class SurveyRepository {\n private logger: ELCLogger;\n private surveyApiSdk: SurveyApiSdk;\n\n constructor(serviceName: string, serviceVersion: string, surveyApiSdk: SurveyApiSdk) {\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n this.surveyApiSdk = surveyApiSdk;\n }\n\n public saveSurveyData = async (surveyData: ISurveyData) => {\n try {\n await this.surveyApiSdk.saveSurveyData(surveyData);\n } catch (error) {\n this.logger.error({\n triggerType: TriggerType.runtimeError,\n message: `${error}`\n });\n }\n };\n}\n","//tslint:disable:export-name\nimport { Container } from 'hypo-container';\nimport { ConfigStore } from './ConfigStore';\nimport { ServiceBusController } from './ServiceBusController';\nimport { VtoViewController } from '~controllers/VtoViewController';\nimport { VtoCTAButtonViewController } from '~controllers/VtoCTAButtonViewController';\nimport { VtoSkinCareViewController } from '~controllers/VtoSkinCareViewController';\nimport { getDecorators } from '@estee/elc-service';\nimport { QuizApiSdk } from '~api/QuizApiSdk';\nimport { PersonalizationApiSdk } from '~api/PersonalizationApiSdk';\nimport { SurveyApiSdk } from '~api/SurveyApiSdk';\nimport { QuizApiRepository } from '~repositories/QuizApiRepository';\nimport { IAppConfig, root } from '@estee/elc-universal-utils';\nimport { PersonalizationRepository } from '~repositories/PersonalizationRepository';\nimport { UserInfoRepository } from '~repositories/UserInfoRepository';\nimport { SurveyRepository } from '~repositories/SurveyRepository';\nimport serviceNames, { VtoService } from '~setup/VtoService';\n\nexport const diContainer = new Container();\n\nexport interface IServiceInfo {\n serviceName: string;\n serviceVersion: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const setConfig = (configJSON: IAppConfig) => {\n diContainer.config = configJSON;\n};\n\nconst { name: serviceName, version } = __serviceInfo__;\n\ndiContainer\n .register(\n serviceNames.configStore,\n diContainer.factory((c) => new ConfigStore(c.config))\n )\n .register(serviceNames.vtoService, (c) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new VtoService((config: any) => {\n setConfig(config);\n\n return c.get(serviceNames.serviceBusController);\n });\n })\n .register(serviceNames.serviceBusController, () => new ServiceBusController())\n .register(serviceNames.vtoViewController, (c) => {\n const serviceInfo: IServiceInfo = {\n serviceName,\n serviceVersion: version\n };\n\n return new VtoViewController(serviceInfo);\n })\n .register(serviceNames.vtoCTAButtonViewController, (c) => new VtoCTAButtonViewController())\n .register(serviceNames.vtoSkinCareViewController, (c) => new VtoSkinCareViewController())\n .register(serviceNames.httpTransport, (c) => {\n return root.HttpTransport;\n })\n .register(serviceNames.quizApiSdk, (c) => {\n return new QuizApiSdk(\n { httpTransport: c.get(serviceNames.httpTransport) },\n serviceName,\n version\n );\n })\n .register(serviceNames.personalizationApiSdk, (c) => {\n return new PersonalizationApiSdk(\n { httpTransport: c.get(serviceNames.httpTransport) },\n serviceName,\n version\n );\n })\n .register(serviceNames.quizApiRepository, (c) => {\n return new QuizApiRepository();\n })\n .register(serviceNames.personalizationRepository, (c) => {\n return new PersonalizationRepository(c.get(serviceNames.personalizationApiSdk));\n })\n .register(serviceNames.userInfoRepository, (c) => new UserInfoRepository(serviceName, version))\n .register(serviceNames.surveyApiSdk, (c) => {\n return new SurveyApiSdk(\n { httpTransport: c.get(serviceNames.httpTransport) },\n serviceName,\n version\n );\n })\n .register(\n serviceNames.surveyRepository,\n (c) => new SurveyRepository(serviceName, version, c.get(serviceNames.surveyApiSdk))\n );\n\nconst { lazyInject } = getDecorators(diContainer);\n\nexport { lazyInject };\n","import { Container } from 'hypo-container';\nexport const getDecorators = (container: Container) => ({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n lazyInject: (name?: string) => (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n target: any,\n key: string,\n descriptor?: PropertyDescriptor\n ) => {\n const resourceName = name || key;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sbGetter = function (this: any) {\n const resource = container.get(resourceName);\n if (!resource) {\n throw new Error(`The requested ${resourceName} does not exists`);\n }\n\n return resource;\n };\n let propertyDescriptor = descriptor || {};\n if (!descriptor) {\n propertyDescriptor = {\n get: sbGetter\n };\n Object.defineProperty(target, key, propertyDescriptor);\n } else {\n propertyDescriptor.get = sbGetter;\n }\n }\n});\n"],"names":["Breakpoints","desktop","largeScreen","extraLargeScreen","breakpoint","brp","code","placeholders","result","reduce","acc","holder","idx","length","IFRAME_MIN_WIDTH","IFRAME_MAX_WIDTH","TIMEOUT_VALUE","IFRAME_EXTRA_PADDING","IFRAME_RATIO","SHADE_SIDEBAR_HEIGHT_RATIO","COMPARE_BUTTON_HEIGHT","SKIN_SMOOTH_STRENGTH","PIE_CHART_DEFAULT_VALUE","CUSTOM_SLIDES_TO_SHOW","CUSTOM_SLIDES_TO_SCROLL","VTO_GUID","NO_SCROLL_CLASS","VTO_ACTIVE_CLASS","VTO_DISCLOSE_PARAM","VTO_HIDE_PRICE_PARAM","VTO_OPEN_PARAM","VTO_MATCHES_COOKIE_NAME","VTO_PERSONALIZATION_VERIFIED_COOKIE","SHADE_SIDEBAR_CONTAINER","LEFT_STICKY_COLUMN","LEFT_COLUMN_SECTION","PRODUCT_FULL_SECTION","PERLGEM_USER_IDENTIFIER_TYPE","VTO","VTO_FOUNDATION","VTO_MATCHES","API_REQUEST_TIMEOUT","DOWNLOAD_BAR_SIZE","DOWNLOAD_BAR_TOLERANCE","DOWNLOAD_BAR_VARIATION","VtoEvents","FoundationShadeTypes","FoundationPairShadeTypes","foundationTabs","Object","freeze","allShadesTab","pairShadesTab","perfectShadesTab","VtoButtonTypes","VtoTypes","LOADING_PERCENTAGE_EVENT_TRIGGERED","IFRAME_MIN_HEIGHT","SKIN_CARE_MODE","FACE_CONCERN_PARAM","EYE_CONCERN_PARAM","SKIN_TYPE_PARAM","SKIN_TYPE_VALUE","DEFAULT_LOCALE","DRUPAL_API_TOKEN","DRUPAL_API_FIELDS","SKU_ITEM","PRODUCT_ITEM","REVISION_TAG_COOKIE","LOCALE_COOKIE","SCROLL_TIMEOUT","OFFSET_HEIGHT","SCROLL_BEHAVIOR_SMOOTH","SCROLL_BLOCK_START","EDITORIAL_NODE_KEY","SHOPPABLE_QUERY_PARAM","NON_SHOPPABLE_QUERY_VALUE","VtoSkinCareEvents","FaceConcerns","EyeConcerns","OtherConcerns","QuizApiConcerns","blockPositionMapping","productGrid","crosssellNode","extraCareNode","skinDiagramNode","skincareRegimenNode","skinTipsNode","skinCareEditorialNode","VTO_SURVEY_DISCLAIMER","VTO_SURVEY_QUESTION1_TITLE","VTO_SURVEY_END_MESSAGE","SURVEY_BUTTONS_DATA","Array","keys","CLOSE_SURVEY_TIMEOUT","SURVEY_BUTTONS_WRAPPER","SURVEY_BUTTON","FORM_DATA_FIELD","USER_IDENTIFIER_FIELD","PAGE_FIELD","VTO_TYPE_FIELD","NP_FIELD","COMMENT_FIELD","GOOGLE_FORMS_URL","ConfigStore","constructor","config","this","updateConfig","getVtoMatchCookie","setVtoMatchCookie","params","formerShadeMatches","shadeMatches","shouldOverride","shadeMatchCookie","JSON","parse","e","console","warn","newShadeMatches","stringify","name","serviceName","version","serviceVersion","BestMatchUseCase","payload","execute","isSaveMatchEnabled","getPersonalizationVerifiedCookie","storePersonalizedDataToCookie","cookie","getBestMatchSkuId","personalizationRepository","diContainer","get","userInfoRepository","configStore","logger","ELCLogger","productId","vtoFeature","vtoConfig","foundation","userMatches","fetchPersonalizedData","shadeMatch","userSelectedMatch","userId","getUserId","data","getPersonalizationDataByPerlgemUserId","setPersonalizationVerifiedCookie","isArray","getPersonalizedData","error","triggerType","TriggerType","message","personalizedData","filter","match","tags","includes","sort","a","b","Date","creationDate","valueOf","getProcessedPersonalizedData","userPersonalizationData","recommendations","ServiceBusController","ViewController","isLoading","setSSRState","dataState","setId","id","btoa","unescape","encodeURIComponent","userAgent","navigator","VtoBaseController","isVtoOpened","isSupportedBrowserOverlayVisible","isSupportedBrowserOverlayOpen","bodyElementClass","document","body","classList","eventListenerIdentifiers","isVtoDisclosed","isVtoPriceHidden","hasShadeSidebarVto","setIsOpenedState","isOpened","loadVto","apiUrl","apiKey","querySelector","script","getElementsByTagName","vtoScript","createElement","type","async","src","parentNode","insertBefore","getIframeBgColor","vtoMakeupIframeColor","makeup","iframeColor","makeupVariant","isFourWayLooksEnabled","hasFourWayLooks","isVtoMakeupFourWayLooksEnabled","getElementsByClassName","getAttribute","getIframeDimension","imageContainerWidth","getImageContainer","offsetWidth","imageContainerModifiedWidth","window","innerWidth","Vto","iframeWidth","iframeHeight","getShadeSidebarVtoDimension","handleVtoResize","reset","vtoFoundationFeature","hasLipVto","iframe","getElementById","maxHeight","innerHeight","compareOverlayOffset","style","height","getVtoParams","bottomPanelOffsetY","isDesktop","language","getVtoApiConfig","styleColor","enableFourWay","enableFBSharing","hasFBSharing","enableTwitterSharing","hasTwitterSharing","enablePinterestSharing","hasPinterestSharing","skinSmoothStrength","isVtoFoundationEnabled","autoOpen","showCloseBtnOnLauncher","isVtoFoundationMultiIds","productIdList","Math","max","min","width","enableFourWayLooks","filterPerfectMatches","perfectMatchResults","vtoFoundationShadeValues","values","entries","perfectMatchAccumulator","label","skuId","shadeLabel","indexOf","vtoFoundationPerfectMatchText","updateShadeEntity","perfectMatches","perfectMatchSkuIds","product","shades","forEach","shade","parentSku","perfectShadeLabel","changeToPerfect","resetPerfect","showNameInsideShadeCircle","selectPerfectSku","productData","query","serviceQueries","filterBy","skus","skuIds","skuData","find","sku","eventLabel","perlgem","SKU_BASE_ID","displayName","handleShadeSelect","selectFirstSku","resetShadeProps","isVtoMakeupEnabled","addEventListeners","vtoEvents","callback","YMK","event","eventListenerIdentifier","addEventListener","push","removeVtoEventListeners","removeEventListener","toggleBodyClasses","hasBodyClasses","isMobile","bodyClasses","add","remove","checkVtoDisclose","vtoDiscloseParam","getQueryParam","checkVtoHidePriceParam","vtoHidePriceParam","searchKey","search","URLSearchParams","showSupportedBrowserOverlay","setIsSupportedBrowserOverlayVisible","openSupportedBrowserOverlay","closeSupportedBrowserOverlay","vtoType","setIsSupportedBrowserOverlayOpen","emit","events","isEnabled","openVTO","closeVTO","vtoMakeupFeature","features","vtoFoundation","vtoMakeup","desktopSelectorClass","desktopSelector","shadeSidebarInfo","shadeSidebarInfoWidth","iframeMaxHeight","heightDifference","previousWindowHeight","downloadBarMin","downloadBarMax","downloadBarVariation","shadeSidebarHeight","shadeSidebarIframeHeight","shadeSidebarIframeWidth","isSupportedBrowserUserAgent","test","MSStream","mediaDevices","getUserMedia","isFoundationQrCodeOverlayOpen","on","VTO_SURVEY_STORAGE_KEY","surveyTypes","getVtoSurveyStorage","storage","surveyStorage","warning","defaultSurveyData","value","isP13nApiVerified","isSurveyTaken","setVtoSurveyStorage","newSurveyData","SurveyUseCase","updateBrowserStorageWithApiData","userData","getUser","sessionId","surveyType","storageData","getStorageData","survey","VtoViewController","serviceInfo","super","isVtoShadeGridEnabled","isVtoLoaded","isVtoFoundationOverlayOpened","selectedPairShadeName","activeTab","isMatchSaved","isSaveInProgress","isSpinnerEnabled","showProductImageSection","isVtoFoundationQrCodeOverlayEnabled","isSurveyVisible","showThankMessage","surveyComment","savedMatch","isShadeSidebarVtoOpened","isSurveySubmitted","surveyViewed","checkHidePriceOnLoad","initialize","props","translations","vtoIframeRef","selectedSku","togglePerfectShades","isVtoFoundationMultiIdsEnabled","parentProduct","getVtoPerfectMatchText","getVtoType","enableProductImage","loadCrossSellProducts","handleEventListenerCallbacks","openShadeSidebarVto","key","percentage","handleVtoLoadingEvent","handleVtoLoadedEvent","handleVtoOpenedEvent","handleVtoClosedEvent","handleVtoSkinShadeFoundEvent","handleCameraOpenedEvent","handleVtoShadeFinderStartedEvent","payloadEventValueCameraStart","performance","now","isVtoFoundationOverlayEnabled","closeVtoFoundationOverlay","reInitVto","enableSpinner","setSurveyStorage","payloadEventValueCameraEnd","eventValue","floor","updateVtoLoadedState","toggleVtoShadeGrid","applyMakeupBySku","vtoShadeResult","readableRecommendations","setSaveMatch","foundationShadeFilter","perfectShades","closeVto","hasSurvey","enableSidebarImage","isSurveyViewable","showSurvey","updateVtoFoundationOverlayState","isLoaded","setIsSpinnerEnabled","setActiveTab","onVtoTabClick","target","dataset","tab","handleShadesViewed","setDefaultCrossSellShade","selectedCrossSellShades","defaultShade","onCrossSellShadeSelect","setSelectedPairSkuId","selectedPairSkuId","setSelectedPairShadeName","shadeName","sortPerfectLabels","orderedPerfectLabels","coolerLabel","lighterLabel","bestLabel","darkerLabel","warmerLabel","labelA","labelB","crossSellSkuIds","Set","flatMap","crossSellCategory","map","category","crossSellProductSkus","crossSellSkuData","vtoReInitTimeout","clearTimeout","setTimeout","current","hasChildNodes","closeEngine","close","initVto","isVtoFoundationSupportedBrowserOverlayEnabled","ymkAsyncInit","declareVtoCallback","openVto","setIsVtoFoundationQrCodeOverlayEnabled","vtoParams","init","openVtoFoundation","showVtoFoundationOverlay","isOverlayOpened","handleVtoUnmount","crossSellSku","some","selectedCrossSellShade","vtoMakeupApply","buttonType","eventByButtonType","ALL_SHADES","BEST_SHADES","vtoFoundationOverlayToggled","shadeSidebarClosed","updateProductData","isSaved","setIsSaveInProgress","isInProgress","resetBestShades","resetBestShade","saveMatches","getShadeRecommendations","selectedShade","setBestShade","personalizeVtoMatches","removeMatches","cookieName","handleVtoFoundationQrCodeOverlayClose","handleQrCodeFoundationOverlay","setIsSurveyVisible","isVisible","closeSurvey","setThankMessageStatus","surveyButtonIndex","setSurveyComment","submitSurveyData","rating","comment","userIdType","personalizationData","userIdentifier","toString","userIdentifierType","createPersonalizationData","surveyData","np","page","location","href","surveyRepository","saveSurveyData","handleSurveySubmit","status","setSurveyButtonIndex","index","activeTabs","activeTabContent","selectedCrossSellSku","selectedCrossSellProductUrl","selectedCrossSellLargeImages","selectedCrossSellSizeValue","foundationPairText","active","disabled","pairShades","allShades","isOverlayEnabled","isMultiIdsEnabled","slidesToShow","slidesToScroll","defaultSkuData","productUrl","selectedShadeName","sizes","media","large","concat","selectedCrossSell","shadeTypes","position","open","VTO_FOUNDATION_QR_CODE_OVERLAY_OPENED","VTO_OPENED","shadeTypeValues","matchType","BEST","isSupportedBrowserMsgEnabled","disableSurvey","surveyDisabled","surveyUseCase","VtoCTAButtonViewController","vtoButtonConfig","enableVto","openVtoOnLoad","isInsideSidebar","checkVtoOpenOnLoad","openVtoFoundationQrCodeOverlay","openShadeSidebar","VtoSkinCareViewController","isVtoSkinCareEnabled","isVtoSkinCareCtaEnabled","isVtoSkinCareOpened","isVtoSkinAnalysisFinished","isVtoSkinCareResultInProgress","isVtoSkinCareResultSectionEnabled","skinCareProductList","isResultCtaFixed","isSkinCareNodeResultEnabled","productItems","productBenefitTypes","priorityProductItems","priorityProductBenefitTypes","skinCareResultNodeBlocks","isShoppable","vtoSkinCareRef","vtoSkinCareQuizId","isVtoResultEnabled","skinCareEditorialNodeId","vtoSkinCareConfig","vtoSkinCare","vtoSkinCareFeature","skincare","isSkincareSurveyEnabled","enableSkincareSurvey","quizApiRepository","editorialNodeId","checkShoppableStatus","updateVtoSkinCareState","enabled","loaded","handleScroll","initVtoSkinCare","isVtoSkincareSupportedBrowserOverlayEnabled","declareVtoSkincareCallback","toggleVtoSkinCareCtaState","toggleVtoSkinCareOpenedState","toggleVtoSkinAnalysisState","isFinished","toggleVtoSkinResultProgress","toggleSkinCareResultSection","toggleResultCtaFixedPosition","isFixed","enableSkinCareNodeResult","vtoSkinCareStartOver","vtoSkinCareYourAnalysis","showVtoSkinCareResult","scrollToVtoSkinCare","processVtoProductResult","filterVtoSkinConcernScores","updateQuizApiResult","preprocessSkinCareProductResult","preprocessPriorityProductResult","vtoSkinCareHandlers","VtoSkinCare","handleVtoSkinCareOpenedEvent","handleVtoSkinCareLoadingEvent","handleVtoSkinAnalysisStartedEvent","handleVtoSkinAnalysisFinishedEvent","handleVtoSkinCareClosedEvent","getForeheadAndLowerFaceWrinkleAvg","vtoSkinConcernScores","wrinkleForehead","wrinkleLowerFace","existsAndFaceArrayIsLessThanTwo","skinConcern","FaceArray","getFaceConcernKey","existsAndEyeConcernArrayIsLessThanOne","EyeArray","getEyeConcernKey","debounce","handleSeeResultButtonOnScroll","getBoundingClientRect","bottom","screen","vtoSkinCareNodesLoaded","vtoSkincareProductGridLoaded","productGridRef","observeProductGrid","onProductGridLoaded","mutationList","mutationObserver","mutation","preprocessSkinCareNodeResult","disconnect","scrollIntoView","behavior","block","vtoSkinCareParams","getVtoSkinCareParams","openSkincare","getIframeHeight","availableHeight","stickyHeight","getSkincareRecommendationList","vtoSkinCareElem","vtoSkinCareProductIds","vtoSkinCareBenefitTypes","priorityProductIds","priorityBenefitResult","isPriority","setAttribute","linesAndWrinkles","sortedSkinConcernScores","queryParams","getQueryParams","quizApiQuery","skinConcernScores","score","faceConcernKey","eyeConcernKey","vtoQuizResult","getQuizApiResult","updateProductSource","getProductItems","finalProductIds","getBenefitTypes","finalBenefitTypes","productIds","split","skinCareContentResultPromises","skinCareContentResultKeys","pushResultNodesToPromise","pushEditorialNodeToPromise","Promise","all","handleSkinCareContentResults","getNodeContent","skinCareContentResultKey","site","elcContentApi","revision_tag","locale","node","field","getData","rendered","productType","item","benefitTypes","benefitTypeValue","replace","toLowerCase","translationKey","newBenefitTypeValue","timeoutValue","debounceTimeout","handleUnmount","productGridContainer","MutationObserver","observe","childList","subtree","shoppableQueryParam","AUTHORIZATION_HEADER_NAME","Api","delete","response","reponseHeaders","httpTransport","handleError","debounceInterval","bypassCache","patch","post","put","requestType","originalPayload","context","subdomain","businessUnitId","addHeader","header","addGlobalHeaders","removeHeader","headerName","removeGlobalHeader","setBearerToken","bearerToken","QuizApiSdk","apiBasePath","getQuizDataByQuizId","param","quizId","url","token","AuthorizationToken","headers","PersonalizationApiSdk","fields","perlgemId","deletePersonalizationDataByPerlgemUserId","SurveyApiSdk","options","mode","getSurveyData","dataToPost","FormData","append","VtoQuiz","fromJson","vtoQuiz","product_benefit_type","product_id","Number","crosssell_content_1","extra_care","skin_diagrams","skincare_regimen","tips","QuizApiRepository","quizApiResult","quizApiSdk","vtoQuizApiId","paramString","getStringifyParam","loadQuizApiData","setQuizApiResult","results","Personalization","personalization","userType","PersonalizationRepository","personalizationApiSdk","promiseStack","apiQueue","api","resolvePromise","requestData","timeout","resolve","reject","promise","Error","UserInfo","user","isSignedIn","signed_in","user_id","session_id","UserInfoRepository","isRequestInProgress","queryUserDetails","userInfo","handlePromise","getUserDetails","SurveyRepository","surveyApiSdk","Container","setConfig","configJSON","register","factory","c","VtoService","lazyInject","container","descriptor","resourceName","sbGetter","resource","propertyDescriptor","defineProperty"],"sourceRoot":""}