{"version":3,"file":"diContainer.9931f50758e47c9f177d.bundle.js","mappings":"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","sources":["webpack://elc-service-analytics/./src/internal/AnalyticsDriver.ts","webpack://elc-service-analytics/./src/internal/EventSubmitter.ts","webpack://elc-service-analytics/./src/internal/repositories/EventRepository.ts","webpack://elc-service-analytics/./src/utils/dataAggregator.ts","webpack://elc-service-analytics/./src/internal/DataAggregator.ts","webpack://elc-service-analytics/./src/internal/domain/entities/Event.ts","webpack://elc-service-analytics/./src/internal/use-cases/AccountPageLandedUseCase.ts","webpack://elc-service-analytics/./src/constants/Views.ts","webpack://elc-service-analytics/./src/internal/use-cases/AccountLoyaltyPointsInfoUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AccountNonLoyaltyEnrollmentLinkUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AccountNonLoyaltyEnrollmentSignupUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/CartLandingPageViewedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/CartLoggedInUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ProductImpressionsUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ProductViewedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/CreateAccountAttemptUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/CreateAccountFailUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ItemAddedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ManualOfferCodeAppliedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/MppFilteredUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/OrderConfirmationPageLandedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/PaymentMethodCompletedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/PaymentPageViewedUseCase.ts","webpack://elc-service-analytics/./src/constants/UseCasesConstants.ts","webpack://elc-service-analytics/./src/internal/use-cases/ProductClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/QuickViewUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/RemoveItemUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SampleAddedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SearchAddressSubmittedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ShippingAddressFilledUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ShippingOptionSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ShippingPageViewedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/StoreLocationSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/StoreLocatorClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/StoreMarkerClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/StoreTownSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SubscribedForEmailsUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/TransactionFailedUseCase.ts","webpack://elc-service-analytics/./src/constants/SkuEngraving.ts","webpack://elc-service-analytics/./src/internal/use-cases/TransactionSuccededUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AnalyticsLoadedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SkuEngravingUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/GridFilteredUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/GridSortedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ShadeGroupSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ShadeChangeViewedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/LiveChatInterfaceClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ProductComparisonViewedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SocialShareIconTriggeredUseCase.ts","webpack://elc-service-analytics/./src/constants/ActionType.ts","webpack://elc-service-analytics/./src/internal/use-cases/StoreBookVirtualAppointmentClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SkuPickerInteractionUseCase.ts","webpack://elc-service-analytics/./src/constants/Account.ts","webpack://elc-service-analytics/./src/internal/use-cases/AccountSidebarOverlayOpenedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AccountSidebarMenuOptionClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AccountSidebarShowcaseClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentVirtualSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentServiceSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentDateTimeSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentEditClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentStartedOverUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentArtistSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentStepLoadedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentProcessCompletedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentAddedToCalendarUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentAccountButtonClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentCallStoreClickedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SearchProductsQueriedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SearchTermSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/VTOActionUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ProductNotifyMeTriggeredUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/ProductNotifyMeRequestCompletedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/RatingsReviewsUseCase.ts","webpack://elc-service-analytics/./src/constants/RatingsReviews.ts","webpack://elc-service-analytics/./src/constants/SmartGift.ts","webpack://elc-service-analytics/./src/constants/Vto.ts","webpack://elc-service-analytics/./src/internal/use-cases/SmartGiftUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/OfferViewed.ts","webpack://elc-service-analytics/./src/internal/use-cases/OfferClicked.ts","webpack://elc-service-analytics/./src/internal/use-cases/OffersTabClicked.ts","webpack://elc-service-analytics/./src/internal/use-cases/CartOverlayClosed.ts","webpack://elc-service-analytics/./src/internal/use-cases/CartOverlayOpened.ts","webpack://elc-service-analytics/./src/constants/Loyalty.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentLocationSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/PageViewUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/LoyaltyPointsUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/LoyaltyBenefitsUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/LoyaltyRewardsUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/SearchFiltersSelectedUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentReviewWidgetClickUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentReviewPaginationUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/AppointmentReviewWidgetFiltersUseCase.ts","webpack://elc-service-analytics/./src/internal/use-cases/StoreDeliveryMethodsUseCase.ts","webpack://elc-service-analytics/./src/service-setup/ServiceBusController.ts","webpack://elc-service-analytics/./src/constants/Routes.ts","webpack://elc-service-analytics/./src/service-setup/ConfigStore.ts","webpack://elc-service-analytics/./src/service-setup/diContainer.ts","webpack://elc-service-analytics/./node_modules/@estee/elc-service/src/decorators/Decorators.ts"],"sourcesContent":["import { root, IUtag, IUtagData } from '@estee/elc-universal-utils';\nimport { action, observable } from 'mobx';\n\nexport class AnalyticsDriver {\n @observable isLoaded = false;\n\n get utagData(): IUtagData {\n return root.utag_data;\n }\n\n get client(): IUtag {\n return root.utag;\n }\n\n public trackEvent = (data: IUtagData, cb?: Function) => {\n this.client.link(data, cb);\n };\n\n public pageTrack = (data: IUtagData, cb?: Function) => {\n this.client.view({ ...this.utagData, ...data }, cb);\n };\n\n @action\n public enable = () => {\n this.isLoaded = true;\n };\n}\n","import { AnalyticsDriver } from './AnalyticsDriver';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { observable, autorun } from 'mobx';\nimport { Event } from '~entities/Event';\nimport { IUtagData, BrowserStorage } from '@estee/elc-universal-utils';\n\nexport class EventSubmitter {\n @observable private analyticsDriver: AnalyticsDriver;\n @observable private eventRepository: EventRepository;\n\n constructor(analyticsDriver: AnalyticsDriver, eventRepository: EventRepository) {\n this.analyticsDriver = analyticsDriver;\n this.eventRepository = eventRepository;\n autorun(() => {\n this.trackEvents(this.eventRepository.hasEventsToSubmit, this.analyticsDriver.isLoaded);\n });\n }\n\n public updateUtagData = (payload: IUtagData, extend: boolean = false) => {\n Object.keys(payload).forEach((key) => {\n if (extend && typeof payload[key] === 'object') {\n const utagData = this.analyticsDriver.utagData[key] || [];\n const payloadData = payload[key] || [];\n this.analyticsDriver.utagData[key] = utagData.concat(payloadData);\n } else {\n this.analyticsDriver.utagData[key] = payload[key];\n }\n });\n\n if (!!this.analyticsDriver.utagData.product_impression_id) {\n this.analyticsDriver.utagData.product_impression_position = ((\n this.analyticsDriver.utagData.product_impression_id\n )).map((pos, i) => i + 1);\n }\n };\n\n private isQACookieSet = () => BrowserStorage.getCookie('analyticsQA') === 'enabled';\n\n private logEvent = (payload: IUtagData) => {\n if (!this.isQACookieSet()) {\n return;\n }\n const tealiumEvents = sessionStorage.getItem('tealiumEvents');\n if (!tealiumEvents) {\n sessionStorage.setItem('tealiumEvents', JSON.stringify([payload]));\n } else {\n const tealiumEventsFromSessionStorage = JSON.parse(tealiumEvents);\n tealiumEventsFromSessionStorage.push(payload);\n sessionStorage.setItem(\n 'tealiumEvents',\n JSON.stringify(tealiumEventsFromSessionStorage)\n );\n }\n };\n\n private transformPayload = (payload: IUtagData) => JSON.parse(JSON.stringify(payload));\n\n public trackEvents = (hasEventsToSubmit: boolean, analyticsDriverLoaded: boolean) => {\n if (hasEventsToSubmit && analyticsDriverLoaded) {\n this.eventRepository.completeEvents.forEach((event) => {\n if (event.type === 'view' && this.eventRepository.hasIncompleteDataEvents) {\n return true;\n }\n if (event.type === 'link' && this.eventRepository.hasIncompleteViewEvents) {\n return true;\n }\n void this.sendEvent(event, this.logEvent);\n this.eventRepository.removeEventFromQueue(event.id);\n });\n }\n };\n\n public sendEvent = async (event: Event, cb: Function) => {\n const payload = this.transformPayload({\n ...event.payload\n });\n\n if (event.type === 'link') {\n this.analyticsDriver.trackEvent(payload);\n } else if (event.type === 'data') {\n this.updateUtagData(this.transformPayload(event.payload), true);\n } else if (event.type === 'view') {\n this.updateUtagData(this.transformPayload(event.payload));\n this.analyticsDriver.pageTrack(payload);\n }\n\n cb(payload);\n };\n}\n","import { Event } from '~entities/Event';\nimport { IUtagData } from '@estee/elc-universal-utils';\nimport { computed, action, observable } from 'mobx';\n\nexport class EventRepository {\n @observable public events: Event[] = [];\n private idCounter: number = 1000;\n\n @action\n public generateId = () => {\n this.idCounter = this.idCounter + 1;\n\n return `event-${this.idCounter}-${Math.floor(Math.random() * 10000)}`;\n };\n\n @action\n public prependEventToQueue = (event: Event) => {\n this.events.unshift(event);\n };\n\n @action\n public addEventToQueue = (event: Event) => {\n this.events.push(event);\n };\n\n @action\n public removeEventFromQueue = (id: string) => {\n this.events = this.events.filter((event) => event.id !== id);\n };\n\n public markEventAsComplete = (id: string, missingInfos: IUtagData) => {\n const index = this.events.findIndex((e) => e.id === id);\n const markedEvent = this.events[index];\n if (!markedEvent) {\n return;\n }\n markedEvent.addPayload(missingInfos);\n };\n\n @computed\n public get completeEvents() {\n return this.events.filter((event) => event.isComplete);\n }\n\n @computed\n public get incompleteEvents() {\n return this.events.filter((event) => !event.isComplete);\n }\n\n @computed\n public get incompleteViewEvents() {\n return this.events.filter((event) => !event.isComplete && event.type === 'view');\n }\n\n @computed\n public get incompleteLinkEvents() {\n return this.events.filter((event) => !event.isComplete && event.type === 'link');\n }\n\n @computed\n public get incompleteDataEvents() {\n return this.events.filter((event) => !event.isComplete && event.type === 'data');\n }\n\n @computed\n public get hasEventsToSubmit() {\n return this.completeEvents.length > 0;\n }\n\n @computed\n public get hasIncompleteEvents() {\n return this.incompleteEvents.length > 0;\n }\n\n @computed\n public get hasIncompleteViewEvents() {\n return this.incompleteViewEvents.length > 0;\n }\n\n @computed\n public get hasIncompleteLinkEvents() {\n return this.incompleteLinkEvents.length > 0;\n }\n\n @computed\n public get hasIncompleteDataEvents() {\n return this.incompleteDataEvents.length > 0;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const isTagId = (tags: string[]) => {\n return !isNaN(Number(tags[0]));\n};\n\nconst getProductSkuMap = (product: any) => (skuData: any, sku: any) => {\n const { skus, ...productDetails } = product;\n const newSku = { ...productDetails, ...sku };\n\n return { ...skuData, [sku.skuId]: newSku };\n};\n\nexport const mapProductSkusById = (data: any, product: any) => {\n const skusData = product.skus.reduce(getProductSkuMap(product), {});\n\n return { ...data, ...skusData };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { query, serviceQueries } from '@estee/elc-service-bus';\nimport { $mobx, reaction } from 'mobx';\nimport { root } from '@estee/elc-universal-utils';\nimport { isTagId, mapProductSkusById } from '../utils/dataAggregator';\n\nimport {\n IProductImpressions,\n IProductViewed,\n IProduct,\n ICartProducts\n} from '~interfaces/IAnalytics';\n\nexport class DataAggregator {\n private eventRepository: EventRepository;\n\n constructor(eventRepository: EventRepository) {\n this.eventRepository = eventRepository;\n reaction(() => this.eventRepository.incompleteEvents, this.saturateIncompleteEvents);\n }\n\n public saturateIncompleteEvents = (incompleteEvents: Event[]) => {\n incompleteEvents.forEach((event) => {\n if (!event.isExecuting) {\n event.markEventAsExecuting();\n this.checkForMissingInformation(event);\n }\n });\n };\n\n public checkForMissingInformation = async (event: Event) => {\n const collectionsResults = await Promise.all(\n Object.keys(event.data).map((collection) => {\n if (collection === 'cartProduct' && event.data.cartProduct) {\n return this.getCartProductInfo(event.data.cartProduct);\n } else if (collection === 'cartProducts' && event.data.cartProducts) {\n return this.getCartProductsInfo(event.data.cartProducts);\n } else if (collection === 'product' && event.data.product) {\n return this.getProductInfo(event.data.product);\n } else if (collection === 'productImpressions' && event.data.productImpressions) {\n return this.getProductImpresionsInfo(event.data.productImpressions);\n } else if (collection === 'productShort' && event.data.productShort) {\n return this.getShortProductInfo(event.data.productShort);\n }\n })\n );\n\n const collectionsInfo = collectionsResults.reduce(\n (collectionInfoPayload, currentCollection) => {\n return { ...collectionInfoPayload, ...currentCollection };\n },\n {}\n );\n\n this.eventRepository.markEventAsComplete(event.id, {\n ...collectionsInfo\n });\n };\n\n // TODO: determine an easier way to map product data to the data layer format - maybe see how this is done in search DataMappings\n // eslint-disable-next-line complexity\n public getProductInfo = async (productViewedPayload: IProductViewed) => {\n const { skuId, productId, product } = productViewedPayload;\n\n let productInfo;\n let skuInfo;\n\n if (skuId) {\n const data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [skuId] } }\n });\n const skuIdMap = data.reduce(mapProductSkusById, {});\n productInfo = skuIdMap[skuId];\n skuInfo = skuIdMap[skuId];\n } else {\n let data: { skus: any[] }[] = [];\n if (productId) {\n data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { productIds: [productId] }\n }) || [];\n } else if (product) {\n data = [product];\n }\n\n if (data.length) {\n productInfo = data[0];\n skuInfo = data[0].skus[0];\n }\n }\n\n if (!productInfo) {\n return {};\n }\n\n const productInfoPayload: any = {\n product_base_id: [productInfo.productId],\n product_category: productInfo.defaultCategory ? [productInfo.defaultCategory.id] : [],\n product_id: [`PROD${productInfo.productId.toString()}`],\n product_name: [productInfo.displayName.toString()],\n product_price: skuInfo?.prices?.length\n ? [\n (\n skuInfo.prices[0].includeTax?.price ||\n skuInfo.prices[0].price ||\n ''\n ).toString()\n ]\n : [],\n product_product_code: [skuInfo.productCode || skuInfo.skuId],\n product_shade: skuInfo?.shades?.length ? [skuInfo.shades[0].name] : [],\n product_short_desc: [productInfo.shortDescription.toString()],\n product_size: skuInfo?.sizes?.length\n ? [skuInfo.sizes[0].label || skuInfo.sizes[0].value]\n : [],\n product_sku: [`SKU${skuInfo.perlgem?.SKU_BASE_ID.toString()}`],\n product_sku_large_image_url: skuInfo?.media?.large?.length\n ? [skuInfo.media.large[0].src]\n : [],\n product_sku_small_image_url: skuInfo?.media?.small?.length\n ? [skuInfo.media.small[0].src]\n : [],\n product_url: [productInfo.productUrl || productInfo.url]\n };\n\n return productInfoPayload;\n };\n\n // TODO: this needs to return product data specific to a customer cart interaction, ie add to bag\n public getCartProductInfo = async (cartProductPayload: IProduct) => {\n // TODO: I moved this from the above getProductInfo function\n /*if (event.name === events.ITEM_ADDED || event.name === events.REMOVE_ITEM) {\n productInfoPayload.event_label = `${productInfo.displayName.toString()} - PROD${productInfo.productId.toString()}`;\n }*/\n\n return {};\n };\n\n // TODO: determine an easier way to map product data to the data layer format - maybe see how this is done in search DataMappings\n // TODO: this should be if an event needs the entire cart\n public getCartProductsInfo = async (cartProductsPayload: ICartProducts) => {\n const skus = cartProductsPayload.skuIds;\n if (!root.ServiceRegistry['elc-service-cart']) {\n return;\n }\n let productsInfo: any = {};\n let skuIds: string[];\n\n if (skus) {\n skuIds = skus;\n } else {\n skuIds = await query(serviceQueries.CART_SKUS_IDS);\n }\n\n const cartProducts = skuIds.length\n ? await query(serviceQueries.GET_PRODUCT_DATA, { filterBy: { skus: { skuIds } } })\n : [];\n const skuIdMap = cartProducts.reduce(mapProductSkusById, {});\n\n const cartItems: any = Object.keys(skuIdMap)\n .filter((sku) => skuIds.indexOf(sku) !== -1)\n .reduce((acc, next) => ({ ...acc, [next]: skuIdMap[next] }), {});\n\n const isCartEmpty = Object.keys(cartItems).length === 0;\n\n if (!isCartEmpty) {\n productsInfo = {\n cart_product_category: [],\n cart_product_id: [],\n cart_product_name: [],\n cart_product_price: [],\n cart_product_shade: [],\n cart_product_size: [],\n cart_product_sku: [],\n cart_product_url: [],\n cart_product_is_preorder: [],\n cart_product_quantity: [],\n cart_product_discount_amount: []\n };\n\n const cart = await query(serviceQueries.GET_CART, {});\n\n const cartItemsQuantity = Object.assign(\n {},\n ...cart.cartItems.map((sku: any) => ({ [sku.skuId]: sku.quantity }))\n );\n const cartItemsDiscounts = Object.assign(\n {},\n ...cart.cartItems.map((sku: any) => ({\n [sku.skuId]: sku.discountsPercent\n ? ((sku.appliedPriceWithoutTax * sku.discountsPercent) / 100).toFixed(2)\n : 0\n }))\n );\n\n Object.keys(cartItems).forEach((key) => {\n const sku = cartItems[key];\n productsInfo.cart_product_category.push(\n sku.defaultCategory ? sku.defaultCategory.id : ''\n );\n productsInfo.cart_product_id.push(`PROD${sku.product_id.toString()}`);\n productsInfo.cart_product_name.push(sku.display_name.toString());\n productsInfo.cart_product_price.push(sku.prices.map((price: any) => price.price));\n productsInfo.cart_product_shade.push(sku.shades.map((shade: any) => shade.name));\n productsInfo.cart_product_size.push(sku.sizes.map((size: any) => size.label));\n productsInfo.cart_product_sku.push(`SKU${sku.perlgem.SKU_BASE_ID.toString()}`);\n productsInfo.cart_product_url.push(sku.url);\n productsInfo.cart_product_is_preorder.push(sku.product_date ? 1 : 0);\n productsInfo.cart_product_quantity.push(cartItemsQuantity[key]);\n productsInfo.cart_product_discount_amount.push(cartItemsDiscounts[key]);\n });\n }\n\n return productsInfo;\n };\n\n // TODO: determine an easier way to map product data to the data layer format - maybe see how this is done in search DataMappings\n public getShortProductInfo = async (productPayload: IProductViewed) => {\n const { skuId, productId, product } = productPayload;\n\n let productInfo;\n let skuInfo;\n\n if (skuId) {\n const data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [skuId] } }\n });\n const skuIdMap = data.reduce(mapProductSkusById, {});\n productInfo = skuIdMap[skuId];\n skuInfo = skuIdMap[skuId];\n } else {\n let data: { skus: any[] }[] = [];\n if (productId) {\n data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { productIds: [productId] }\n }) || [];\n } else if (product) {\n data = [product];\n }\n\n if (data.length) {\n productInfo = data[0];\n skuInfo = data[0].skus[0];\n }\n }\n\n if (!productInfo) {\n return {};\n }\n\n return this.populateProductInfo(productInfo, skuInfo, product);\n };\n\n public populateProductInfo = async (productInfo: any, skuInfo: any, product: any) => {\n const shortDescription = (\n productInfo?.short_description ||\n product?.shortDescription ||\n ''\n ).toString();\n const productIdString = (\n productInfo?.product_id ||\n productInfo?.productId ||\n ''\n ).toString();\n const displayName = (\n productInfo?.display_name ||\n productInfo?.displayName ||\n ''\n ).toString();\n const skuBaseId = skuInfo?.perlgem?.SKU_BASE_ID?.toString() ?? '';\n\n const productShortInfoPayload = {\n product_base_id: [productInfo.product_id || productInfo.productId],\n product_id: [`PROD${productIdString}`],\n product_price: skuInfo?.prices?.length\n ? [\n (\n skuInfo.prices[0].includeTax?.price ||\n skuInfo.prices[0].price ||\n ''\n ).toString()\n ]\n : [],\n product_name: [displayName],\n product_product_code: [skuInfo.productCode || skuInfo.skuId],\n product_shade: skuInfo?.shades?.length ? [skuInfo.shades[0].name] : [],\n product_short_desc: [shortDescription],\n product_size: skuInfo?.sizes?.length\n ? [skuInfo.sizes[0].label || skuInfo.sizes[0].value]\n : [],\n product_sku: [`SKU${skuBaseId}`]\n };\n\n return productShortInfoPayload;\n };\n\n public getProductImpresionsInfo = async (productImpressionsPayload: IProductImpressions) => {\n let filteredItemsList: any;\n\n if (!productImpressionsPayload.products) {\n const skuIds = productImpressionsPayload.skuIds || [];\n const productIds = productImpressionsPayload.productIds || [];\n const productTags = productImpressionsPayload.productTags || [];\n\n if (!skuIds.length && !productIds.length && !productTags.length) {\n return {};\n }\n\n const skuIdList = skuIds.slice(0);\n const productIdList = productIds.slice(0);\n const productTagsList = productTags.slice(0);\n\n const tagList = isTagId(productTagsList)\n ? { ids: productTags.slice(0) }\n : { keys: productTags.slice(0) };\n\n const skuList = skuIdList.length ? await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: skuIdList } }\n }) : [];\n\n const skuIdMap = skuList.reduce(mapProductSkusById, {});\n\n const productList =\n productIdList.length || productTagsList.length\n ? await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: {\n productIds: productIdList,\n tags: { ...tagList, includeInnerHits: true }\n },\n sortBy: {\n tags: { productDisplayOrder: 'ASCENDING' }\n }\n })\n : [];\n\n filteredItemsList = Object.keys(skuIdMap)\n .filter((key) => skuIds.includes(key))\n .map((key) => skuIdMap[key])\n .concat(productList);\n } else {\n filteredItemsList = productImpressionsPayload.products;\n }\n\n if (filteredItemsList.length === 0) {\n return {};\n }\n\n const impressionsInfo: any = {\n product_impression_base_id: [],\n product_impression_id: [],\n product_impression_name: [],\n product_impression_position: [],\n product_impression_shade: [],\n product_impression_size: [],\n product_impression_price: [],\n product_impression_sku_large_image_url: [],\n product_impression_sku_small_image_url: [],\n product_impression_url: [],\n product_impression_short_desc: [],\n product_impression_sku: [],\n product_impression_product_code: [],\n product_impression_category: [],\n product_impression_list: [],\n product_impression_was_price: []\n };\n\n /*\n // need to determine source for these\n product_impression_brand: [],\n product_impression_was_price: []\n */\n\n Object.keys(filteredItemsList).forEach((key, index) => {\n const item = filteredItemsList[key];\n\n let product;\n let sku;\n\n if (typeof item[$mobx] === 'object') {\n //product request\n product = item;\n sku = item.skus[0];\n } else {\n //sku request\n product = item;\n sku = item;\n }\n\n if (typeof sku === 'undefined') {\n return;\n }\n\n impressionsInfo.product_impression_base_id.push(Number(product.productId));\n impressionsInfo.product_impression_id.push(`PROD${product.productId.toString()}`);\n impressionsInfo.product_impression_name.push(product.displayName.toString());\n impressionsInfo.product_impression_position.push(index + 1);\n impressionsInfo.product_impression_shade.push(\n sku.shades?.length ? sku.shades[0].name : ''\n );\n impressionsInfo.product_impression_size.push(\n sku.sizes?.length ? sku.sizes[0].value : ''\n );\n impressionsInfo.product_impression_price.push(\n sku.prices && sku.prices.length\n ? (sku.prices[0].includeTax?.price || sku.prices[0].price || '').toString()\n : ''\n );\n impressionsInfo.product_impression_sku_large_image_url.push(\n sku.media?.large?.length ? sku.media.large[0].src : ''\n );\n impressionsInfo.product_impression_sku_small_image_url.push(\n sku.media?.small?.length ? sku.media.small[0].src : ''\n );\n impressionsInfo.product_impression_url.push(product.productUrl);\n impressionsInfo.product_impression_short_desc.push(product.shortDescription);\n impressionsInfo.product_impression_category.push(\n product.defaultCategory ? product.defaultCategory.id : ''\n );\n impressionsInfo.product_impression_sku.push(`SKU${sku.perlgem?.SKU_BASE_ID}`);\n impressionsInfo.product_impression_product_code.push(sku.skuId);\n impressionsInfo.product_impression_list.push(\n productImpressionsPayload.listOverride || root.location.pathname\n );\n impressionsInfo.product_impression_was_price.push(\n sku.prices[0].originalPrice?.toString()\n );\n\n // need to confirm where to get this data\n //impressionsInfo.product_impression_brand.push('');\n });\n\n return {\n ...impressionsInfo\n };\n };\n}\n","import { observable, action } from 'mobx';\nimport { IEvent, IEventType, IEventData } from '~interfaces/IAnalytics';\nimport { IUtagData } from '@estee/elc-universal-utils';\n\nexport class Event {\n @observable public isComplete: boolean = false;\n @observable public isExecuting: boolean = false;\n @observable public name: string;\n @observable public payload: IUtagData;\n @observable public type: IEventType;\n @observable public id: string;\n @observable public data: IEventData;\n\n constructor(event: IEvent) {\n this.id = event.id;\n this.name = event.name;\n this.type = event.type;\n this.data = event.data || {};\n this.payload = event.payload || {};\n }\n\n @action\n private markEventAsCompleted = () => {\n this.isComplete = true;\n this.isExecuting = false;\n };\n\n @action\n public markEventAsExecuting = () => {\n this.isExecuting = true;\n };\n\n @action\n public addPayload = (missingInfo: IUtagData) => {\n this.payload = { ...this.payload, ...missingInfo };\n this.markEventAsCompleted();\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport * as views from '../../constants/Views';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class AccountPageLandedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: views.ACCOUNT_VIEW,\n type: 'data'\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","export const SPP_VIEW = 'spp.page.landed';\nexport const ACCOUNT_VIEW = 'account.page.landed';\nexport const PAYMENT_VIEW = 'payment.page.viewed';\nexport const CART_VIEW = 'cart.landing.page.viewed';\nexport const SHIPPING_VIEW = 'shipping.page.viewed';\nexport const ORDER_CONFIRMATION_VIEW = 'order.confirmation.viewed';\nexport const HOME_PAGE_LOADED = 'home.page.loaded';\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/AnalyticsService';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { IAccountSidebarBaseData } from '~interfaces/IAnalytics';\n\nexport class AccountLoyaltyPointsInfoUseCase {\n private eventRepository: EventRepository;\n private accountLoyaltyPointsInfoData: IAccountSidebarBaseData;\n\n constructor(accountLoyaltyPointsInfoData: IAccountSidebarBaseData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.accountLoyaltyPointsInfoData = accountLoyaltyPointsInfoData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.accountLoyaltyPointsInfoData.eventAction,\n type: 'link',\n payload: this.getAccountLoyaltyPointsInfoPayload()\n });\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getAccountLoyaltyPointsInfoPayload() {\n const { eventAction, label } = this.accountLoyaltyPointsInfoData;\n\n return {\n event_name: 'my account page',\n event_category: 'my account page',\n event_action: eventAction,\n event_label: label,\n site_type: 'event_based'\n };\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/AnalyticsService';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { IAccountSidebarBaseData } from '~interfaces/IAnalytics';\n\nexport class AccountNonLoyaltyEnrollmentLinkUseCase {\n private eventRepository: EventRepository;\n private accountNonLoyaltyEnrollmentData: IAccountSidebarBaseData;\n\n constructor(accountNonLoyaltyEnrollmentData: IAccountSidebarBaseData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.accountNonLoyaltyEnrollmentData = accountNonLoyaltyEnrollmentData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.accountNonLoyaltyEnrollmentData.eventAction,\n type: 'link',\n payload: this.getAccountNonLoyaltyEnrollmentSignupPayload()\n });\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getAccountNonLoyaltyEnrollmentSignupPayload() {\n const { eventAction, label } = this.accountNonLoyaltyEnrollmentData;\n\n return {\n event_name: 'my account page',\n event_category: 'my account page',\n event_action: eventAction,\n event_label: label,\n site_type: 'event_based',\n promo_pos: ['account'],\n promo_creative: ['overlay/signup'],\n promo_name: ['account sign up overlay'],\n promo_id: ['account-overlay/signup-account sign up overlay']\n };\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/AnalyticsService';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { IAccountSidebarBaseData } from '~interfaces/IAnalytics';\n\nexport class AccountNonLoyaltyEnrollmentSignupUseCase {\n private eventRepository: EventRepository;\n private accountNonLoyaltyEnrollmentData: IAccountSidebarBaseData;\n\n constructor(accountNonLoyaltyEnrollmentData: IAccountSidebarBaseData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.accountNonLoyaltyEnrollmentData = accountNonLoyaltyEnrollmentData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.accountNonLoyaltyEnrollmentData.eventAction,\n type: 'link',\n payload: this.getAccountNonLoyaltyEnrollmentSignupPayload()\n });\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getAccountNonLoyaltyEnrollmentSignupPayload() {\n const { eventAction } = this.accountNonLoyaltyEnrollmentData;\n\n return {\n site_type: 'event_based',\n event_name: 'my account page',\n event_category: 'my account page',\n event_action: eventAction,\n event_label: 'banner display | [‘account sign up overlay’]',\n imp_promo_pos: ['module'],\n imp_promo_creative: ['overlay/signup'],\n imp_promo_name: ['account sign up overlay'],\n imp_promo_id: ['module-overlay/signup-account sign up overlay']\n };\n }\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport * as views from '../../constants/Views';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { query, serviceQueries } from '@estee/elc-service-bus';\n\nexport class CartLandingPageViewedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const skuIds = await query(serviceQueries.RECOMMENDED_PRODUCTS_SKUID_LIST);\n const cartLandingPageViewedPayload = {\n active_checkout_panel: 'checkout'\n };\n\n const productImpressionsPayload = {\n skuIds: skuIds,\n listOverride: '/cart'\n };\n\n const newEvent = new Event({\n name: views.CART_VIEW,\n payload: cartLandingPageViewedPayload,\n type: 'data',\n id: this.eventRepository.generateId(),\n data: {\n // TODO: figure out what to do with these values\n /*requiredData: [\n 'cart_total_value',\n 'cart_total_items',\n 'order_promo_code'\n ],*/\n\n productImpressions: productImpressionsPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class CartLoggedInUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const cartLoggedInPayload = {\n event_name: 'login_success',\n event_category: 'checkout',\n event_action: 'login success'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.CART_LOGGED_IN,\n type: 'link',\n payload: cartLoggedInPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IProductImpressions } from '~interfaces/IAnalytics';\n\nexport class ProductImpressionsUseCase {\n private eventRepository: EventRepository;\n private productImpressionsPayload: IProductImpressions;\n\n constructor(productImpressionsPayload: IProductImpressions) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.productImpressionsPayload = productImpressionsPayload;\n }\n\n public execute = async () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.ANALYTICS_PRODUCTS_VIEWED,\n type: 'link',\n payload: {\n event_name: 'product_impression',\n event_category: 'ecommerce',\n event_action: 'view_item_list',\n event_label: 'view_item_list',\n event_noninteraction: true\n },\n data: {\n productImpressions: this.productImpressionsPayload\n }\n });\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IProductViewed } from '~interfaces/IAnalytics';\n\nexport class ProductViewedUseCase {\n private eventRepository: EventRepository;\n private productViewedPayload: IProductViewed;\n\n constructor(productViewedPayload: IProductViewed) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.productViewedPayload = productViewedPayload;\n }\n\n public execute = () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.ANALYTICS_PRODUCT_VIEWED,\n type: 'link',\n payload: {\n event_name: 'product_detail',\n event_category: 'ecommerce',\n event_action: 'spp',\n event_label: 'view_item',\n event_noninteraction: true,\n enh_action: 'detail'\n },\n data: {\n product: this.productViewedPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class CreateAccountAttemptUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const createAccountAttemptPayload = {\n event_name: 'create_account_attempt',\n event_category: 'account',\n event_action: 'create account attempt'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.CREATE_ACCOUNT_ATTEMPT,\n type: 'link',\n payload: createAccountAttemptPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class CreateAccountFailUseCase {\n private eventRepository: EventRepository;\n private error: string;\n\n constructor(error: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.error = error;\n }\n\n public execute = () => {\n const createAccountFailPayload = {\n event_name: 'create_account_fail',\n event_category: 'account',\n event_action: 'create account fail',\n event_label: `standard - ${this.error}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.CREATE_ACCOUNT_FAIL,\n type: 'link',\n payload: createAccountFailPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class ItemAddedUseCase {\n private eventRepository: EventRepository;\n private skuId: string;\n\n constructor(skuId: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.skuId = skuId;\n }\n\n public execute = () => {\n const itemAddedPayload = {\n event_name: 'add',\n event_category: 'ecommerce',\n event_action: 'add to bag',\n enh_action: 'add',\n Add_to_Bag_Module: 'Add_to_Bag_Module'\n };\n\n const cartProductPayload = {\n skuId: this.skuId\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.ITEM_ADDED,\n type: 'link',\n payload: itemAddedPayload,\n data: {\n cartProduct: cartProductPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events, query, serviceQueries } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class ManualOfferCodeAppliedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n // TODO: can we pass this in instead of querying for it?\n const manualOffer = await query(serviceQueries.GET_MANUAL_OFFER);\n const offerStatus = manualOffer.message && Object.keys(manualOffer.message)[0];\n const isOfferFailed = offerStatus === 'error';\n\n const offerCodePayload = {\n event_name: isOfferFailed ? 'offers_fail' : 'offers_success',\n event_category: 'offers',\n event_action: isOfferFailed ? 'fail' : 'success',\n event_label: isOfferFailed\n ? `${manualOffer.offerCode} - ${manualOffer.message.error}`\n : `${manualOffer.offerCode}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: isOfferFailed ? events.OFFER_CODE_FAILED : events.OFFER_CODE_SUCCEDED,\n type: 'link',\n payload: offerCodePayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events, query, serviceQueries } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport interface IAnalyticsFilters {\n category: string;\n option: string;\n}\n\nexport enum FILTER_METHODS {\n filter = 'filter',\n sort = 'sort'\n}\n\nexport class MppFilteredUseCase {\n private eventRepository: EventRepository;\n private method: string;\n\n constructor(method: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.method = method;\n }\n\n public execute = async () => {\n let event_label: string = '';\n\n // TODO: can we pass the filters in instead of querying for them?\n if (this.method === FILTER_METHODS.filter) {\n const filters = <{ category: string; option: string }[]>(\n await query(serviceQueries.GET_SELECTED_FILTERS, {})\n );\n filters.forEach((filter: IAnalyticsFilters) => {\n event_label += `${filter.category} - ${filter.option} | `;\n });\n } else {\n const filters = await query(serviceQueries.GET_SORTBY_VALUE, {});\n event_label += `${this.method} - ${filters.replace(/_/g, '').replace('sort', '')} `;\n }\n\n const filterMppPayload = {\n event_name: 'filters_and_sort_selection',\n event_category: 'filter & sort selection',\n event_action: this.method,\n event_label: event_label.slice(0, -3)\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.MPP_FILTERED,\n type: 'link',\n payload: filterMppPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport * as views from '../../constants/Views';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport interface IOrderDetail {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport class OrderConfirmationPageLandedUseCase {\n private eventRepository: EventRepository;\n private payload: IOrderDetail;\n\n constructor(payload: IOrderDetail) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.payload = payload;\n }\n\n public execute = async () => {\n const pageDetails = {\n category_id: 'checkout',\n category_name: 'checkout',\n page_name: 'checkout | confirm',\n page_type: 'order',\n page_site_area: 'checkout',\n page_template: 'checkout'\n };\n\n const { order } = this.payload || {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const skus = order?.items?.map((item: any) => item.skuId);\n\n const orderConfirmationPayload = {\n order_currency_code: order?.currency?.isoCode,\n order_discount_amount: order?.totals?.totalDiscounts,\n order_grand_total: order?.totals?.totalWithTax,\n order_id: order?.id,\n order_merchandise_total: order?.totals?.subTotalWithTax,\n order_payment_type: this.payload?.paymentMethods?.[0],\n order_shipping_amount: order?.shippingInfo?.[0].priceWithTax,\n order_subtotal: order?.totals?.subTotalWithTax,\n order_tax_amount: order?.totals?.tax,\n order_total_product_units: order?.items?.length,\n order_type: order?.orderType,\n orders_compare: '',\n orders_total: order?.totals?.subTotalWithTax\n };\n\n const cartProductsPayload = {\n skuIds: skus\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: views.ORDER_CONFIRMATION_VIEW,\n type: 'view',\n payload: { ...pageDetails, ...orderConfirmationPayload },\n data: {\n cartProducts: cartProductsPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { serviceCommands } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class PaymentMethodCompletedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const paymentMethodCompletedPayload = {\n event_name: 'payment',\n event_category: 'ecommerce',\n event_action: 'checkout',\n event_label: 'Payment'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: serviceCommands.ORDER_CREATE,\n type: 'link',\n payload: paymentMethodCompletedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport * as views from '../../constants/Views';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class PaymentPageViewedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const paymentPageViewedPayload = {\n active_checkout_panel: 'checkout'\n };\n\n // TODO: this is probably going to need to be a view type\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: views.PAYMENT_VIEW,\n type: 'data',\n payload: paymentPageViewedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","export const PRODUCT_CLICKED = 'product_click';\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events, serviceQueries, query } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { PRODUCT_CLICKED } from '../../constants/UseCasesConstants';\nimport { root } from '@estee/elc-universal-utils';\nimport { mapProductSkusById } from '../../utils/dataAggregator';\nimport { ISkuData } from './ProductNotifyMeTriggeredUseCase';\n\nexport interface IProductClickedPayload {\n [key: string]: string | string[] | number[];\n}\n\nexport class ProductClickedUseCase {\n private eventRepository: EventRepository;\n private skuId: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private product: any;\n private pageType: string;\n private positionIndex: number;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(skudId: string, pageType: string = '', positionIndex: number, product?: any) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.skuId = skudId;\n this.pageType = pageType;\n this.positionIndex = positionIndex;\n this.product = product;\n }\n\n public execute = async () => {\n let productInfo = this.product;\n if (!productInfo) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [this.skuId] } }\n });\n const skuIdMap: ISkuData = data.reduce(mapProductSkusById, {});\n productInfo = skuIdMap[this.skuId];\n }\n\n // TODO: figure out a way to get productInfo from DataAggregator\n const productClickedPayload: IProductClickedPayload = {\n event_name: PRODUCT_CLICKED,\n event_category: 'ecommerce',\n event_action: 'product click',\n enh_action: PRODUCT_CLICKED,\n event_noninteraction: 'FALSE',\n event_label: `${productInfo.displayName} - PROD${productInfo.productId}`,\n product_position: [this.positionIndex],\n product_list: [root.location.pathname],\n product_id: [`PROD${productInfo.productId.toString()}`]\n };\n\n if (!!this.pageType) {\n productClickedPayload.page_name = `${this.pageType} | ${productInfo.displayName}`;\n }\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.PRODUCT_CLICKED,\n type: 'link',\n payload: productClickedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events, query, serviceQueries } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { mapProductSkusById } from '../../utils/dataAggregator';\nimport { ISkuData } from './ProductNotifyMeTriggeredUseCase';\n\nexport class QuickViewUseCase {\n private eventRepository: EventRepository;\n private skuId: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private product: any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(skuId: string, product?: any) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.skuId = skuId;\n this.product = product;\n }\n\n public execute = async () => {\n let productInfo = this.product;\n if (!productInfo) {\n // TODO: we shouldn't need to call this twice\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [this.skuId] } }\n });\n const skuIdMap: ISkuData = data.reduce(mapProductSkusById, {});\n\n productInfo = skuIdMap[this.skuId];\n }\n // TODO: figure out a way to deal with productInfo here so that it can be done in DataAggregator\n const quickViewPayload = {\n enh_action: 'detail',\n event_action: 'product detail view - quickview',\n event_category: 'ecommerce',\n event_label: `PROD${productInfo.product_id || productInfo.productId}`,\n event_name: 'quickview',\n event_noninteraction: 'FALSE',\n page_name: `QV | ${productInfo.display_name || productInfo.displayName}`,\n product_product_code: `${productInfo.productCode || productInfo.skuId}`\n };\n\n const productShortPayload = {\n product: this.product,\n skuId: this.skuId\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.QUICK_VIEW_TRIGGERED,\n type: 'link',\n payload: quickViewPayload,\n data: {\n productShort: productShortPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class RemoveItemUseCase {\n private eventRepository: EventRepository;\n private skuId: string;\n\n constructor(skuId: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.skuId = skuId;\n }\n\n public execute = () => {\n const removeItemPayload = {\n event_name: 'remove',\n event_category: 'ecommerce',\n event_action: 'remove from bag',\n enh_action: 'remove'\n };\n\n const cartProductPayload = {\n skuId: this.skuId\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.REMOVE_ITEM,\n type: 'link',\n payload: removeItemPayload,\n data: {\n cartProduct: cartProductPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class SampleAddedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const sampleAddedPayload = {\n event_name: 'samples',\n event_category: 'samples',\n event_action: 'sample added',\n active_checkout_panel: 'cart'\n };\n\n // TODO: we need to pass in skuId of the sample added\n const cartProductPayload = {\n skuId: ''\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SAMPLE_ADDED,\n type: 'link',\n payload: sampleAddedPayload,\n data: {\n cartProduct: cartProductPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class SearchAddressSubmittedUseCase {\n private eventRepository: EventRepository;\n private address: string;\n\n constructor(address: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.address = address;\n }\n\n public execute = async () => {\n const searchAddressSubmittedPayload = {\n event_name: 'search address submitted',\n event_action: 'search address submitted',\n event_label: `${this.address}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SEARCH_ADDRESS_SUBMITTED,\n type: 'link',\n payload: searchAddressSubmittedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { root } from '@estee/elc-universal-utils';\nimport { ConfigStore } from '~setup/ConfigStore';\n\nexport class ShippingAddressFilledUseCase {\n private eventRepository: EventRepository;\n private configStore: ConfigStore;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.configStore = diContainer.get(serviceNames.configStore);\n }\n\n private getLocation = () => {\n const pathName = root.location.pathname;\n if (pathName.indexOf(this.configStore.config.routes.checkout) !== -1) {\n return 'checkout';\n } else if (pathName.indexOf(this.configStore.config.routes.settings) !== -1) {\n return 'account';\n } else {\n return '';\n }\n };\n\n public execute = () => {\n const shippingAddressFilled = {\n event_name: 'shipping_address',\n event_category: 'ecommerce',\n event_action: 'checkout',\n event_label: this.getLocation()\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SHIPPING_ADDRESS_FILLED,\n type: 'link',\n payload: shippingAddressFilled\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class ShippingOptionSelectedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const shippingOptionSelectedPayload = {\n event_name: 'shipping_options',\n event_category: 'ecommerce',\n event_action: 'checkout',\n event_label: 'Shipping Options'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SHIPPING_OPTION_SELECTED,\n type: 'link',\n payload: shippingOptionSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport * as views from '../../constants/Views';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class ShippingPageViewedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const shippingPageViewed = {\n active_checkout_panel: 'checkout'\n };\n\n // TODO: figure out if this should be type \"view\"\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: views.SHIPPING_VIEW,\n type: 'data',\n payload: shippingPageViewed\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class StoreLocationSelectedUseCase {\n private eventRepository: EventRepository;\n private storeId: string;\n\n constructor(storeId: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.storeId = storeId;\n }\n\n public execute = async () => {\n const storeLocationSelectedPayload = {\n event_name: 'store location selected',\n event_action: 'store location selected',\n event_label: `store Id - $${this.storeId}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.STORE_LOCATION_SELECTED,\n type: 'link',\n payload: storeLocationSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class StoreLocatorClickedUseCase {\n private eventRepository: EventRepository;\n private storeId: string;\n private storeName: string;\n private eventLabel: string;\n\n constructor(storeId: string, storeName: string, eventLabel: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.storeId = storeId;\n this.storeName = storeName;\n this.eventLabel = eventLabel;\n }\n\n public execute = async () => {\n const storeLocatorClickedPayload = {\n event_name: `${this.eventLabel}`,\n event_action: `${this.eventLabel}`,\n event_label: `${this.storeName} -${this.storeId}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.eventLabel,\n type: 'link',\n payload: storeLocatorClickedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { events } from '@estee/elc-service-bus';\n\nexport class StoreMarkerClickedUseCase {\n private eventRepository: EventRepository;\n private storeId: string;\n\n constructor(storeId: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.storeId = storeId;\n }\n\n public execute = async () => {\n const storeMarkerClickedPayload = {\n event_action: `${events.STORE_MARKER_CLICKED}`,\n event_label: `${this.storeId}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.STORE_MARKER_CLICKED,\n type: 'link',\n payload: storeMarkerClickedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class StoreTownSelectedUseCase {\n private eventRepository: EventRepository;\n private town: string;\n\n constructor(town: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.town = town;\n }\n\n public execute = async () => {\n const storeTownSelectedPayload = {\n event_name: 'store town selected',\n event_action: 'store town selected',\n event_label: `${this.town}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.STORE_LOCATION_SELECTED,\n type: 'link',\n payload: storeTownSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class SubscribedForEmailsUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const subscribedForEmailsPayload = {\n event_name: 'signup',\n event_category: 'signup',\n event_action: 'email'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SUBSCRIBED_FOR_EMAILS,\n type: 'link',\n payload: subscribedForEmailsPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events, query, serviceQueries } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IOrderQueryData } from '~setup/ServiceBusController';\n\nexport class TransactionFailedUseCase {\n private eventRepository: EventRepository;\n private orderQueryData: IOrderQueryData;\n private error: string;\n\n constructor(orderQueryData: IOrderQueryData, error?: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.orderQueryData = orderQueryData;\n this.error = error || '';\n }\n\n public execute = async () => {\n // TODO: can retrieval of this order data be moved to DataAggregator? Or can it be passed in?\n const totalCountOfOrders = await query(serviceQueries.TOTAL_COUNT_OF_ORDERS);\n const orderQuery = await query(serviceQueries.GET_ORDER_DATA, this.orderQueryData);\n\n const { order } = orderQuery;\n const event_label = 'event_label';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const event_info: any = {\n event_name: 'transaction_fail',\n event_category: 'ecommerce',\n event_action: 'transaction fail'\n };\n\n if (this.error) {\n event_info[event_label] = this.error;\n }\n\n const transactionFailedPayload = {\n order_currency_code: order.currency.isoCode,\n order_discount_amount: order.totals.totalDiscounts,\n order_grand_total: order.totals.totalWithTax,\n order_id: order.id,\n order_merchandise_total: order.totals.subTotalWithTax,\n order_payment_type: this.orderQueryData.paymentType,\n order_shipping_amount: order.shippingInfo[0].priceWithTax,\n order_subtotal: order.totals.subTotalWithTax,\n order_tax_amount: order.totals.tax,\n order_total_product_units: order.items.length,\n order_type: order.orderType,\n orders_compare: '',\n orders_count: totalCountOfOrders,\n orders_total: order.totals.subTotalWithTax,\n ...event_info\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.TRANSACTION_FAILED,\n type: 'link',\n payload: transactionFailedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","export enum SkuEngraving {\n EVENT_NAME = 'engraving',\n EVENT_CATEGORY = 'engraving',\n EVENT_ACTION = 'overlay',\n EVENT_LABEL = '1st page loaded',\n EVENT_NONINTERACTION = 'FALSE'\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events, query, serviceQueries } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IOrderQueryData } from '~setup/ServiceBusController';\n\nexport class TransactionSuccededUseCase {\n private eventRepository: EventRepository;\n private orderQueryData: IOrderQueryData;\n\n constructor(orderQueryData: IOrderQueryData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.orderQueryData = orderQueryData;\n }\n\n public execute = async () => {\n // TODO: can retrieval of this order data be moved to DataAggregator? Or can it be passed in?\n const totalCountOfOrders = await query(serviceQueries.TOTAL_COUNT_OF_ORDERS);\n const orderQuery = await query(serviceQueries.GET_ORDER_DATA, this.orderQueryData);\n\n const { order } = orderQuery;\n\n const event_info = {\n event_name: 'transaction',\n event_category: 'ecommerce',\n event_action: 'transaction',\n event_label: `${order.orderNumber}`\n };\n\n const transactionSuccededPayload = {\n ...event_info,\n order_currency_code: order.currency.isoCode,\n order_discount_amount: order.totals.totalDiscounts,\n order_grand_total: order.totals.totalWithTax,\n order_id: order.id,\n order_merchandise_total: order.totals.subTotalWithTax,\n order_payment_type: this.orderQueryData.paymentType,\n order_shipping_amount: order.shippingInfo[0].priceWithTax,\n order_subtotal: order.totals.subTotalWithTax,\n order_tax_amount: order.totals.tax,\n order_total_product_units: order.items.length,\n order_type: order.orderType,\n orders_compare: '',\n orders_count: totalCountOfOrders,\n orders_total: order.totals.subTotalWithTax\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.TRANSACTION_SUCCEDED,\n type: 'link',\n payload: transactionSuccededPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { AnalyticsDriver } from '../AnalyticsDriver';\n\nexport class AnalyticsLoadedUseCase {\n private analyticsDriver: AnalyticsDriver;\n\n constructor() {\n this.analyticsDriver = diContainer.get(serviceNames.analyticsDriver);\n }\n\n public execute = () => {\n if (!this.analyticsDriver.isLoaded) {\n // TODO: load user data into data layer\n // TODO: load cart data into data layer\n this.analyticsDriver.enable();\n }\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { SkuEngraving } from '../../constants/SkuEngraving';\nimport { IEngravingData } from '~interfaces/IAnalytics';\n\nexport class SkuEngravingUseCase {\n private eventRepository: EventRepository;\n private engravingData: IEngravingData;\n\n constructor(engravingData: IEngravingData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.engravingData = engravingData;\n }\n\n private getEngravingEvent = () => {\n const {\n EVENT_ACTION,\n EVENT_CATEGORY,\n EVENT_LABEL,\n EVENT_NAME,\n EVENT_NONINTERACTION\n } = SkuEngraving;\n\n return {\n event_action: EVENT_ACTION,\n event_category: EVENT_CATEGORY,\n event_label: EVENT_LABEL,\n event_name: EVENT_NAME,\n event_noninteraction: EVENT_NONINTERACTION\n };\n };\n\n public execute = async () => {\n // TODO: this data is being passed in - do we need productShort still? Can we just use this data?\n //const { skuId, skuBaseId, size, price, name } = this.engravingData;\n const { skuId, skuBaseId } = this.engravingData;\n\n const engravingPayload = {\n ...this.getEngravingEvent(),\n enh_action: 'detail',\n page_name: `Engraving | ${skuId} | SKU${skuBaseId}`\n };\n\n const productShortPayload = {\n skuId: skuId\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SKU_ENGRAVING_TRIGGERED,\n type: 'link',\n payload: engravingPayload,\n data: {\n productShort: productShortPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport interface IAnalyticsFilters {\n category: string;\n option: string;\n}\n\nexport enum GRID_ACTIONS {\n filter = 'filter',\n sort = 'sort'\n}\n\nexport const EVENT_NAME = 'filters_and_sort_selection';\nexport const EVENT_CATEGORY = 'filter & sort selection';\n\nexport class GridFilteredUseCase {\n private eventRepository: EventRepository;\n private appliedFilters: IAnalyticsFilters[];\n\n constructor(appliedFilters: IAnalyticsFilters[]) {\n this.appliedFilters = appliedFilters;\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n let eventLabel: string = '';\n\n eventLabel = this.appliedFilters.reduce(\n (previousValue: string, filter: IAnalyticsFilters) => {\n return `${previousValue} ${filter.category} - ${filter.option} | `;\n },\n ''\n );\n\n const filterGridPayload = {\n event_name: EVENT_NAME,\n event_category: EVENT_CATEGORY,\n event_action: GRID_ACTIONS.filter,\n event_label: eventLabel.slice(0, -3)\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.GRID_FILTERED,\n type: 'link',\n payload: filterGridPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { GRID_ACTIONS, EVENT_NAME, EVENT_CATEGORY } from './GridFilteredUseCase';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class GridSortedUseCase {\n private eventRepository: EventRepository;\n private appliedSort: string;\n\n constructor(appliedSort: string) {\n this.appliedSort = appliedSort;\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const eventLabel = `${GRID_ACTIONS.sort} - ${this.appliedSort\n .replace(/_/g, '')\n .replace('sort', '')}`;\n\n const sortGridPayload = {\n event_name: EVENT_NAME,\n event_category: EVENT_CATEGORY,\n event_action: GRID_ACTIONS.sort,\n event_label: eventLabel\n };\n\n const sortEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.GRID_SORTED,\n type: 'link',\n payload: sortGridPayload\n });\n\n this.eventRepository.addEventToQueue(sortEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class ShadeGroupSelectedUseCase {\n private eventRepository: EventRepository;\n private shadeGroupKey: string;\n private eventName: string;\n private eventAction: string;\n\n constructor(shadeGroupKey: string, eventName: string, eventAction: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.shadeGroupKey = shadeGroupKey;\n this.eventName = eventName;\n this.eventAction = eventAction;\n }\n\n public execute = () => {\n const payload = {\n event_name: this.eventName,\n event_category: 'filter & sort selection ',\n event_action: this.eventAction,\n event_label: this.shadeGroupKey\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.PRODUCT_SHADE_GROUP_SELECTED,\n type: 'link',\n payload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '../repositories/EventRepository';\nimport serviceNames from '../../service-setup/AnalyticsService';\nimport { diContainer } from '../../service-setup/diContainer';\nimport { Event } from '../domain/entities/Event';\nimport { events } from '@estee/elc-service-bus';\nimport { IProductViewed } from '../interfaces/IAnalytics';\n\nexport class ShadeChangeViewedUseCase {\n private eventRepository: EventRepository;\n private shadeChangeActionPayload: IProductViewed;\n constructor(shadeChangeActionPayload: IProductViewed) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.shadeChangeActionPayload = shadeChangeActionPayload;\n }\n\n public execute = () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.PRODUCT_SKU_SELECTED,\n type: 'link',\n payload: {\n event_name: 'product_detail_shade_size',\n enh_action: 'detail',\n event_category: 'ecommerce',\n event_action: 'spp',\n event_noninteraction: true,\n event_label: 'shade size switch'\n },\n data: {\n product: this.shadeChangeActionPayload\n }\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IGenericAnalyticsData } from '~interfaces/IAnalytics';\n\nexport class LiveChatInterfaceClickedUseCase {\n private eventRepository: EventRepository;\n private liveChatData: IGenericAnalyticsData;\n\n constructor(liveChatData: IGenericAnalyticsData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.liveChatData = liveChatData;\n }\n\n public execute = () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.LIVE_CHAT_INTERFACE_CLICKED,\n type: 'link',\n payload: this.getLiveChatPayload()\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n\n private getLiveChatPayload() {\n const { eventLabel } = this.liveChatData;\n\n return {\n event_name: 'liveperson chat interface open',\n event_category: 'live chat interaction ',\n event_action: 'user initiated chat',\n event_label: eventLabel\n };\n }\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class ProductComparisonViewedUseCase {\n private eventRepository: EventRepository;\n private productIds: string[];\n\n constructor(productIds: string[]) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.productIds = productIds;\n }\n\n public execute = () => {\n const eventLabel = this.productIds.join('|');\n const payload = {\n event_name: 'comparison view',\n event_category: 'product comparison',\n event_action: 'comparison',\n event_label: eventLabel,\n event_noninteraction: 'true'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.PRODUCT_COMPARISON_VIEWED,\n type: 'view',\n payload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IGenericAnalyticsData } from '~interfaces/IAnalytics';\n\nexport class SocialShareIconTriggeredUseCase {\n private eventRepository: EventRepository;\n private socialShareData: IGenericAnalyticsData;\n\n constructor(socialShareData: IGenericAnalyticsData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.socialShareData = socialShareData;\n }\n\n public execute = () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SOCIAL_SHARE_ICON_TRIGGERED,\n type: 'link',\n payload: this.getSocialSharePayload()\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n\n private getSocialSharePayload() {\n const { eventLabel } = this.socialShareData;\n\n return {\n event_name: 'social share',\n event_category: 'social',\n event_action: 'share',\n event_label: eventLabel\n };\n }\n}\n","export enum ActionType {\n OPEN = 'open',\n CLOSE = 'close'\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class StoreBookVirtualAppointmentClickedUseCase {\n private eventRepostiory: EventRepository;\n private isVirtual: boolean;\n private eventLabel: string;\n\n constructor(isVirtual: boolean, eventLabel: string) {\n this.eventRepostiory = diContainer.get(serviceNames.eventRepository);\n this.isVirtual = isVirtual;\n this.eventLabel = eventLabel;\n }\n\n public execute = async () => {\n const storeLocatorBookVirtualAppointmentClickedPayload = {\n event_name: this.eventLabel,\n event_action: this.eventLabel,\n event_label: this.isVirtual\n };\n\n const newEvent = new Event({\n id: this.eventRepostiory.generateId(),\n name: this.eventLabel,\n type: 'link',\n payload: storeLocatorBookVirtualAppointmentClickedPayload\n });\n\n this.eventRepostiory.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { ActionType } from '../../constants/ActionType';\n\nexport class SkuPickerInteractionUseCase {\n private eventRepository: EventRepository;\n private productId: string;\n private action: string;\n\n constructor(productId: string, action: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.productId = productId;\n this.action = action;\n }\n\n public execute = () => {\n const eventName =\n this.action === ActionType.OPEN ? events.SKU_PICKER_OPENED : events.SKU_PICKER_CLOSED;\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: eventName,\n type: 'link',\n payload: this.getSkuPickerPayload()\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n\n private getSkuPickerPayload() {\n return {\n event_name: `sku picker ${this.action}`,\n event_category: 'sku picker',\n event_action: `${this.action}`,\n event_label: `PROD${this.productId}`\n };\n }\n}\n","export enum AccountEventAction {\n ACCOUNT_SIDEBAR_MENU_CLICKED = 'navigation click',\n ACCOUNT_SIDEBAR_LOYALTY_CLICKED = 'cta click',\n ACCOUNT_SIDEBAR_SHOWCASE_CLICKED = 'promotion click',\n ACCOUNT_LOYALTY_POINTS_INFO_LINK_CLICKED = 'cta click',\n ACCOUNT_NONLOYALTY_ENROLLMENT_LINK_CLICKED = 'click',\n ACCOUNT_NONLOYALTY_ENROLLMENT_SIGNUP_CLICKED = 'sign up overlay display'\n}\n","import { events } from '@estee/elc-service-bus';\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class AccountSidebarOverlayOpenedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const payload = {\n event_name: 'my account page',\n event_category: 'my account page',\n event_action: 'account overlay',\n event_label: 'open',\n site_type: 'event_based'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.ACCOUNT_SIDEBAR_OVERLAY_OPENED,\n type: 'link',\n payload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { IAccountSidebarBaseData } from '~interfaces/IAnalytics';\n\nexport class AccountSidebarMenuOptionClickedUseCase {\n private eventRepository: EventRepository;\n private accountSidebarData: IAccountSidebarBaseData;\n\n constructor(accountSidebarData: IAccountSidebarBaseData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.accountSidebarData = accountSidebarData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.accountSidebarData.eventAction,\n type: 'link',\n payload: this.getAccountSidebarPayload()\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getAccountSidebarPayload() {\n const { eventAction, label } = this.accountSidebarData;\n\n return {\n event_name: 'my account page',\n event_category: 'my account page',\n event_action: eventAction,\n event_label: label\n };\n }\n}\n","import serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { IAccountSidebarShowcaseData } from '~interfaces/IAnalytics';\n\nexport class AccountSidebarShowcaseClickedUseCase {\n private eventRepository: EventRepository;\n private accountSidebarData: IAccountSidebarShowcaseData;\n\n constructor(accountSidebarData: IAccountSidebarShowcaseData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.accountSidebarData = accountSidebarData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.accountSidebarData.eventAction,\n type: 'link',\n payload: this.getAccountSidebarPayload()\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getAccountSidebarPayload() {\n const { key, item_title, eventAction } = this.accountSidebarData;\n\n return {\n event_name: 'content_module_click',\n enh_action: 'promo_click',\n event_category: 'ecommerce',\n event_action: eventAction,\n event_label: `banner click | [${item_title}]`,\n promo_pos: ['module'],\n promo_creative: [`${key}`],\n promo_name: [`${item_title}`],\n promo_id: [`module-${key}-${item_title}`]\n };\n }\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentVirtualSelectedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const appointmentVirtualSelectedPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'location selected',\n event_label: 'virtual consultation'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_VIRTUAL_SELECTED,\n type: 'link',\n payload: appointmentVirtualSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentServiceSelectedUseCase {\n private eventRepository: EventRepository;\n private serviceName: string[];\n\n constructor(serviceName: string[]) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.serviceName = serviceName;\n }\n\n public execute = async () => {\n const appointmentServiceSelectedPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'service selected',\n event_label: this.serviceName\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_SERVICE_SELECTED,\n type: 'link',\n payload: appointmentServiceSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentDateTimeSelectedUseCase {\n private eventRepository: EventRepository;\n private dateTime: string;\n\n constructor(dateTime: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.dateTime = dateTime;\n }\n\n public execute = async () => {\n const appointmentDateTimeSelectedPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'date and time selected',\n event_label: this.dateTime\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_DATE_TIME_SELECTED,\n type: 'link',\n payload: appointmentDateTimeSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentEditClickedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const appointmentEditPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'review',\n event_label: 'edit'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_EDIT_CLICKED,\n type: 'link',\n payload: appointmentEditPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentStartedOverUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const appointmentStartedOverPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'review',\n event_label: 'cancel and start over'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_STARTED_OVER,\n type: 'link',\n payload: appointmentStartedOverPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentArtistSelectedUseCase {\n private eventRepository: EventRepository;\n private artistName: string;\n\n constructor(artistName: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.artistName = artistName;\n }\n\n public execute = async () => {\n const appointmentArtistSelectedPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'artist selected',\n event_label: this.artistName\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_ARTIST_SELECTED,\n type: 'link',\n payload: appointmentArtistSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentStepLoadedUseCase {\n private eventRepository: EventRepository;\n private step: string;\n\n constructor(step: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.step = step;\n }\n\n public execute = async () => {\n const appointmentStepPayload = {\n page_url: `/book-appointment/step${this.step}`,\n page_name: `Book Appointment - Step ${this.step}`,\n location: `${location.origin}/book-appointment/step${this.step}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_STEP_LOADED,\n type: 'view',\n payload: appointmentStepPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentProcessCompletedUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const appointmentProcessCompletedPayload = {\n page_url: '/book-appointment/complete',\n page_name: 'Book Appointment - Complete',\n location: `${window.location.origin}/book-appointment/complete`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APOOINTMENT_PROCESS_COMPLETED,\n type: 'view',\n payload: appointmentProcessCompletedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentAddedToCalendarUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = async () => {\n const appointmentAddedToCalendarPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'completion page interaction',\n event_label: 'save to calendar'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_ADDED_TO_CALENDAR,\n type: 'link',\n payload: appointmentAddedToCalendarPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentAccountButtonClickedUseCase {\n private accountButtonLabel: string;\n private eventRepository: EventRepository;\n\n constructor(accountButtonLabel: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.accountButtonLabel = accountButtonLabel;\n }\n\n public async execute() {\n const appointmentAccountButtonClickedPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'completion page interaction',\n event_label: this.accountButtonLabel\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_ACCOUNT_BUTTON_CLICKED,\n type: 'link',\n payload: appointmentAccountButtonClickedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n}\n","import { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentCallStoreClickedUseCase {\n private storeName: string;\n private eventRepository: EventRepository;\n\n constructor(storeName: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.storeName = storeName;\n }\n\n public async execute() {\n const payload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'tout to call store',\n event_label: this.storeName\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_CALL_STORE_CLICKED,\n type: 'link',\n payload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { events } from '@estee/elc-service-bus';\n\nexport interface ISearchProductsQueried {\n searchTerm: string;\n searchType?: string;\n productIds?: string[];\n sourceId?: string;\n}\nexport class SearchProductsQueriedUseCase {\n private eventRepository: EventRepository;\n private searchTerm: string;\n private searchType: string;\n private productIds: string[];\n private sourceId: string;\n\n constructor(payload: ISearchProductsQueried) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.searchTerm = payload.searchTerm;\n this.searchType = payload.searchType || 'standard';\n this.productIds = payload.productIds || [];\n this.sourceId = payload.sourceId || '';\n }\n\n public execute = async () => {\n let location = `?search=${this.searchTerm}&searchtype=${this.searchType}`;\n\n if (this.searchType === 'predictive') {\n location = `/searchresultsoverlay${location}`;\n } else {\n location = `/search${location}`;\n }\n\n const productImpressionsPayload = {\n productIds: this.productIds,\n listOverride: location\n };\n\n const searchProductsQueriedPayload = {\n location: location,\n search_keyword: this.searchTerm,\n search_type: this.searchType,\n search_results: this.productIds.length.toString(),\n site_search_results_found: this.productIds.length ? 'yes' : 'no',\n Number_of_On_Site_Searches: '1',\n attraqt_responseId: this.sourceId\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SEARCH_PRODUCTS_QUERIED,\n type: 'view',\n payload: searchProductsQueriedPayload,\n data: {\n productImpressions: productImpressionsPayload\n }\n });\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { events } from '@estee/elc-service-bus';\n\nexport interface ISearchTermSelected {\n searchTerm: string;\n}\n\nexport class SearchTermSelectedUseCase {\n private eventRepository: EventRepository;\n private searchTerm: string;\n\n constructor(payload: ISearchTermSelected) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.searchTerm = payload.searchTerm;\n }\n\n public execute = async () => {\n const searchTermSelectedPayload = {\n event_name: 'onsite_search',\n event_category: 'onsite search',\n event_action: 'predictive text click',\n event_label: this.searchTerm\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SEARCH_TERM_SELECTED,\n type: 'link',\n payload: searchTermSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport interface IVtoAction {\n event: string;\n vtoType: string;\n eventValue?: number;\n vtoItemId?: string;\n vtoLookIndex?: number;\n vtoLookId?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vtoBrowGoals?: any[];\n vtoBrowShape?: string;\n vtoBrowSkuId?: string;\n vtoBrowLength?: string;\n vtoBrowThickness?: string;\n vtoBrowOpacity?: number;\n}\n\nexport class VTOActionUseCase {\n private eventRepository: EventRepository;\n private event: string;\n private vtoType: string;\n private eventValue?: number;\n private vtoItemId?: string;\n private vtoLookIndex?: number;\n private vtoLookId?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private vtoBrowGoals?: any[];\n private vtoBrowShape?: string;\n private vtoBrowSkuId?: string;\n private vtoBrowLength?: string;\n private vtoBrowThickness?: string;\n private vtoBrowOpacity?: number;\n\n constructor(vtoAction: IVtoAction) {\n const {\n event,\n vtoType = '',\n eventValue = 0,\n vtoItemId = '',\n vtoLookIndex = 0,\n vtoLookId = '',\n vtoBrowGoals = [],\n vtoBrowShape = '',\n vtoBrowSkuId = '',\n vtoBrowLength = '',\n vtoBrowThickness = '',\n vtoBrowOpacity = 0\n } = vtoAction;\n\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.event = event;\n this.vtoType = vtoType;\n this.eventValue = eventValue;\n this.vtoItemId = vtoItemId;\n this.vtoLookIndex = vtoLookIndex;\n this.vtoLookId = vtoLookId;\n this.vtoBrowGoals = vtoBrowGoals;\n this.vtoBrowShape = vtoBrowShape;\n this.vtoBrowSkuId = vtoBrowSkuId;\n this.vtoBrowLength = vtoBrowLength;\n this.vtoBrowThickness = vtoBrowThickness;\n this.vtoBrowOpacity = vtoBrowOpacity;\n }\n\n public execute = () => {\n const vtoActionPayload = {\n event_name: 'vto',\n event_category: 'vto',\n event_action: this.event,\n event_label: 'event',\n ...(this.eventValue && { event_value: this.eventValue }),\n modiface_evar: `YouCam | ${this.event} | event`,\n vendor: 'youcam',\n vto_type: this.vtoType,\n ...(this.vtoItemId && { vto_item_id: this.vtoItemId }),\n ...(this.vtoLookIndex && { vto_look_index: this.vtoLookIndex }),\n ...(this.vtoLookId && { vto_look_id: this.vtoLookId }),\n ...(this.vtoBrowGoals?.length && { vto_brow_goals: this.vtoBrowGoals }),\n ...(this.vtoBrowShape && { vto_brow_shape: this.vtoBrowShape }),\n ...(this.vtoBrowSkuId && { vto_brow_sku_id: this.vtoBrowSkuId }),\n ...(this.vtoBrowLength && { vto_brow_length: this.vtoBrowLength }),\n ...(this.vtoBrowThickness && { vto_brow_thickness: this.vtoBrowThickness }),\n ...(this.vtoBrowOpacity && { vto_brow_opacity: this.vtoBrowOpacity })\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.event,\n type: 'link',\n payload: vtoActionPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events, serviceQueries, query } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { mapProductSkusById } from '../../utils/dataAggregator';\n\ninterface IProductInfo {\n display_name: string;\n product_id: string;\n upc: string;\n skuId: string;\n}\n\nexport interface ISkuData {\n [key: string]: IProductInfo;\n}\n\nexport const EVENT_NAME = 'notify_me';\nexport const EVENT_CATEGORY = 'ecommerce';\nexport const EVENT_ACTION = 'notify me - request';\n\nexport class ProductNotifyMeTriggeredUseCase {\n private eventRepository: EventRepository;\n private skuId: string;\n\n constructor(skudId: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.skuId = skudId;\n }\n\n public execute = async () => {\n // TODO: can this data be passed in instead of querying it?\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [this.skuId] } }\n });\n const skuIdMap: ISkuData = data.reduce(mapProductSkusById, {});\n const productInfo = skuIdMap[this.skuId];\n\n const productNotifyMeTriggeredPayload = {\n event_name: EVENT_NAME,\n event_action: EVENT_ACTION,\n event_category: EVENT_CATEGORY,\n event_label: `${productInfo.display_name} - PROD${productInfo.product_id}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.PRODUCT_NOTIFY_ME_TRIGGERED,\n type: 'link',\n payload: productNotifyMeTriggeredPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { serviceQueries, query } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { ISkuData } from './ProductNotifyMeTriggeredUseCase';\nimport { mapProductSkusById } from '../../utils/dataAggregator';\n\nexport const EVENT_NAME = 'notify_me';\nexport const EVENT_CATEGORY = 'ecommerce';\n\nexport class ProductNotifyMeRequestCompletedUseCase {\n private eventRepository: EventRepository;\n private skuId: string;\n private event: string;\n private eventAction: string;\n\n constructor(skudId: string, event: string, eventAction: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.skuId = skudId;\n this.event = event;\n this.eventAction = eventAction;\n }\n\n public execute = async () => {\n // TODO: are we requesting this data here just to get the name and id? if so, can't we pass it that data in?\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { skus: { skuIds: [this.skuId] } }\n });\n const skuIdMap: ISkuData = data.reduce(mapProductSkusById, {});\n const productInfo = skuIdMap[this.skuId];\n\n const productNotifyMeRequestCompletedPayload = {\n event_name: EVENT_NAME,\n event_action: this.eventAction,\n event_category: EVENT_CATEGORY,\n event_label: `${productInfo.display_name} - PROD${productInfo.product_id}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.event,\n type: 'link',\n payload: productNotifyMeRequestCompletedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IReviewsData } from '~interfaces/IAnalytics';\n\nexport class RatingsReviewsUseCase {\n private eventRepository: EventRepository;\n private event: string;\n private reviewsData: IReviewsData;\n\n constructor(event: string, reviewsData: IReviewsData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.reviewsData = reviewsData;\n this.event = event;\n }\n\n public execute = () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.event,\n type: 'link',\n payload: this.getRatingsReviewsPayload()\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n\n private getRatingsReviewsPayload() {\n const { id, name, reviewCategory, selectedValue, eventAction } = this.reviewsData;\n\n return {\n event_name: 'read_write_review',\n event_category: reviewCategory,\n event_action: selectedValue ? `${eventAction} - ${selectedValue}` : eventAction,\n event_label: `${name} - ${id}`\n };\n }\n}\n","export enum ReviewsEventAction {\r\n READ_REVIEW = 'review - read',\r\n WRITE_REVIEW = 'review - write - start',\r\n HELPFUL_YES = 'review - helpful - thumbs up',\r\n HELPFUL_NO = 'review - helpful - thumbs down',\r\n FLAG_REVIEW = 'review - helpful - flag this review',\r\n REVIEWS_FILTER = 'review - filter',\r\n REVIEWS_SEARCH = 'review - search',\r\n ASK_AND_ANSWER = 'ask answer - read',\r\n ASK_AND_ANSWER_SUBMIT = 'ask answer - ask a question - end',\r\n ASK_AND_ANSWER_SEARCH = 'ask answer - ask a question - search',\r\n ASK_AND_ANSWER_HELPFUL_YES = 'ask answer - helpful - thumbs up',\r\n ASK_AND_ANSWER_HELPFUL_NO = 'ask answer - helpful - thumbs down',\r\n ASK_AND_ANSWER_SHOW_MORE = 'ask answer - show more q&a',\r\n REVIEW_SORT = 'Review - Sort',\r\n ASK_AND_ANSWER_SORT = 'ask answer - sort',\r\n REVIEW_OVERLAY_OPEN = 'review overlay - open',\r\n REVIEW_OVERLAY_CLOSE = 'review overlay - close'\r\n}\r\n","export enum SmartGiftEventAction {\n SMARTGIFT_ADDED = 'launch',\n SMARTGIFT_VIEWED = 'see gift',\n SMARTGIFT_PREPARED = 'prepare my gift',\n SMARTGIFT_WIDGET_TOGGLED = 'minimize / maximize',\n SMARTGIFT_REMOVED = 'remove this item',\n SMARTGIFT_CANCELLED = 'cancel this gift',\n SMARTGIFT_HELP_OPENED = 'help - open',\n SMARTGIFT_HELP_CLOSED = 'help - close'\n}\n","export enum VTO_EVENTS {\n ALL_SHADES_VIEWED = 'allShadesViewed',\n BEST_SHADES_VIEWED = 'bestShadesViewed',\n CAMERA_CLOSED = 'cameraClosed',\n CAMERA_FAILED = 'cameraFailed',\n CAMERA_OPENED = 'cameraOpened',\n CLOSED = 'closed',\n COMPARE = 'compare',\n COMPARE_DISABLED = 'compareDisabled',\n CTA = 'cta',\n ENGINE_CLOSED = 'engineClosed',\n FOUNDATION_QR_CODE_OVERLAY_CLOSED = 'foundationQrCodeOverlayClosed',\n FOUNDATION_QR_CODE_OVERLAY_OPENED = 'foundationQrCodeOverlayOpened',\n KISS_DETECTED = 'kissDetected',\n LOADED = 'loaded',\n LOADING = 'loading',\n MATCH_PERSONALIZED = 'myMatchPersonalized',\n MATCH_REMOVED = 'myMatchRemoved',\n MATCH_SAVED = 'myMatchSaved',\n NON_SHOPPABLE_PRODUCTS_LOADED = 'nonShoppableProductsLoaded',\n OPENED = 'opened',\n PAIR_SHADE_GRID_OPENED = 'pairShadeGridOpened',\n PAIR_SHADE_SELECTED = 'pairShadeSelected',\n PHOTO_LOADED = 'photoLoaded',\n PHOTO_SAVED = 'photoSaved',\n PRICE_SUPPRESSED = 'priceSuppressed',\n RESET = 'reset',\n SHADE_FINDER_CANCELLED = 'shadeFinderCancelled',\n SHADE_FINDER_COMPLETED = 'shadeFinderCompleted',\n SHADE_FINDER_STARTED = 'shadeFinderStared',\n SHADE_REMINDER_OVERLAY_CLOSED = 'shadeReminderOverlayClosed',\n SHADE_REMINDER_OVERLAY_KEEP = 'shadeReminderOverlayKeep',\n SHADE_REMINDER_OVERLAY_OPENED = 'shadeReminderOverlayOpened',\n SHADE_REMINDER_OVERLAY_RETAKE = 'shadeReminderOverlayRetake',\n SHOPPABLE_PRODUCTS_LOADED = 'shoppableProductsLoaded',\n SKIN_ANALYSIS_FINISHED = 'skinAnalysisFinished',\n SKIN_ANALYSIS_STARTED = 'skinAnalysisStarted',\n SKIN_BACK_TO_DETECTING = 'skinBackToDetecting',\n SKIN_SHADE_FOUND = 'skinShadeFound',\n SPLIT_FOUR_WAY = 'splitFourWay',\n SPLIT_FOUR_WAY_DISABLED = 'splitFourWayDisabled',\n SURVEY_IGNORED = 'surveyIgnored',\n SURVEY_LOADED = 'surveyLoaded',\n SURVEY_SUBMITTED = 'surveySubmitted',\n VIDEO_LOADED = 'videoLoaded',\n ZOOM = 'zoom',\n TUTORIAL_STARTED = 'tutorialStarted',\n TUTORIAL_UNMUTED = 'tutorialUnmuted',\n TUTORIAL_MUTED = 'tutorialMuted',\n TUTORIAL_PAUSED = 'tutorialPaused',\n TUTORIAL_STOPPED = 'tutorialStopped',\n TUTORIAL_RESUMED = 'tutorialResumed',\n TUTORIAL_PLAY_SPEED_UPDATED = 'tutorialPlaySpeedUpdated',\n TUTORIAL_PREVIOUS_STEP = 'tutorialPreviousStep',\n TUTORIAL_NEXT_STEP = 'tutorialNextStep',\n TUTORIAL_LOOK_SELECTED = 'applyLook',\n TUTORIAL_PRODUCT_LIST_CLICKED = 'productListClicked',\n TUTORIAL_PRODUCTS_USED_ITEM_CLICKED = 'productsUsedItemClicked',\n BROW_FACE_ATTRIBUTE_PREDICTION_STARTED = 'faceAttributePredictionStarted',\n BROW_FACE_ATTRIBUTE_UPDATED = 'faceAttributeUpdated',\n BROW_GOAL_SELECTED = 'browGoalSelected',\n BROW_TIPS_CLICKED = 'tipsClicked',\n BROW_BACK_TO_GOALS_CLICKED = 'backToGoalsClicked',\n BROW_SHAPE_CHANGED = 'shapeChanged',\n BROW_SHADE_TRY_ON = 'browShadeTryOn',\n BROW_LENGTH_CHANGED = 'lengthChanged',\n BROW_THICKNESS_CHANGED = 'thicknessChanged',\n BROW_OPACITY_CHANGED = 'opacityChanged',\n BROW_GOLDEN_RATION_ENABLED = 'goldenRatioEnabled',\n BROW_GOLDEN_RATION_DISABLED = 'goldenRatioDisabled',\n BROW_STENCIL_ENABLED = 'stencilEnabled',\n BROW_STENCIL_DISABLED = 'stencilDisabled',\n BROW_COMPARE_ENABLED = 'compareEnabled',\n BROW_CAPTURE_CLICKED = 'captureClicked',\n BROW_SEE_ALL_SHADES_CLICKED = 'seeAllShadesClicked',\n BROW_GET_BROW_CLICKED = 'getBrowClicked'\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { ISmartGiftData } from '~interfaces/IAnalytics';\n\nexport class SmartGiftUseCase {\n private eventRepository: EventRepository;\n private eventName: string;\n private smartGiftData: ISmartGiftData;\n\n constructor(eventName: string, smartGiftData: ISmartGiftData) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.smartGiftData = smartGiftData;\n this.eventName = eventName;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.eventName,\n type: 'link',\n payload: this.getSmartGiftPayload()\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getSmartGiftPayload() {\n const { productId, eventAction } = this.smartGiftData;\n\n return {\n event_name: 'smartgift',\n event_category: 'smartgift',\n event_action: eventAction,\n event_label: `PROD${productId}`\n };\n }\n}\n","import { events } from '@estee/elc-service-bus';\n\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nlet debounceTimeout: NodeJS.Timeout;\nconst debounceTimeInMs = 5;\n\nconst allPayloads: IOfferCodePayload[] = [];\n\nexport interface IOfferViewedProps {\n placement: string;\n promotionId: string;\n promotionName: string;\n}\n\ninterface IOfferCodePayload {\n event_name: string;\n enh_action: string;\n event_category: string;\n event_action: string;\n event_label: string[];\n promo_pos: string[];\n promo_creative: string[];\n promo_name: string[];\n promo_id: string[];\n}\n\nconst blankOfferCodePayload = (): IOfferCodePayload => ({\n event_name: 'content_module_view',\n enh_action: 'promo_view',\n event_category: 'ecommerce',\n event_action: 'promotion view',\n event_label: [],\n promo_pos: [],\n promo_creative: [],\n promo_name: [],\n promo_id: []\n});\n\nconst mergeOfferCodePayload = (offerCodePayload: IOfferCodePayload[]) =>\n offerCodePayload.reduce(\n (acc, event) => ({\n event_name: acc.event_name,\n event_category: acc.event_category,\n event_action: acc.event_action,\n event_label: acc.event_label.concat(event.event_label),\n promo_pos: acc.promo_pos.concat(event.promo_pos),\n promo_creative: acc.promo_creative.concat(event.promo_creative),\n promo_name: acc.promo_name.concat(event.promo_name),\n promo_id: acc.promo_id.concat(event.promo_id)\n }),\n\n blankOfferCodePayload() as IOfferCodePayload\n );\n\nexport class OfferViewed {\n private eventRepository: EventRepository;\n private _promotionName: string;\n private _promotionId: string;\n\n constructor({ placement, promotionId, promotionName }: IOfferViewedProps) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this._promotionName = promotionName;\n this._promotionId = promotionId;\n }\n\n public execute = () => {\n const offerCodePayload: IOfferCodePayload = {\n event_name: 'content_module_click',\n enh_action: 'promo_view',\n event_category: 'ecommerce',\n event_action: 'promotion view',\n event_label: this._promotionName ? [`${this._promotionId}`] : ['content module click'],\n promo_pos: ['module'],\n promo_creative: ['Cart Overlay'],\n promo_name: [`${this._promotionName}`],\n promo_id: [`module-Cart Overlay-${this._promotionId}`]\n };\n allPayloads.push(offerCodePayload);\n\n clearTimeout(debounceTimeout);\n debounceTimeout = setTimeout(() => {\n const eventsToMerge = allPayloads.splice(0, allPayloads.length);\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.CART_OVERLAY_OFFER_CLICKED,\n type: 'link',\n payload: mergeOfferCodePayload(eventsToMerge)\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }, debounceTimeInMs);\n };\n}\n","import { events } from '@estee/elc-service-bus';\n\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport interface IOfferClickedProps {\n placement: string;\n promotionId: string;\n promotionName: string;\n}\n\nexport class OfferClicked {\n private eventRepository: EventRepository;\n private _promotionName: string;\n private _promotionId: string;\n\n constructor({ promotionId, promotionName }: IOfferClickedProps) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this._promotionName = promotionName;\n this._promotionId = promotionId;\n }\n\n public execute = () => {\n const offerCodeFailedPayload = {\n event_name: 'content_module_click',\n enh_action: 'promo_click',\n event_category: 'ecommerce',\n event_action: 'promotion click',\n event_label: this._promotionName ? [`${this._promotionId}`] : 'content module click',\n promo_pos: ['module'],\n promo_creative: ['Cart Overlay'],\n promo_name: [`${this._promotionName}`],\n promo_id: [`module-Cart Overlay-${this._promotionId}`]\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.CART_OVERLAY_OFFER_CLICKED,\n type: 'link',\n payload: offerCodeFailedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nconst eventActionMap: { [key: string]: string } = {\n offers: 'offer tab - cart overlay',\n cart: 'cart tab - cart overlay'\n};\n\ninterface ICartTabTabClickedProps {\n tabId: string;\n event: string;\n}\n\nexport class CartTabTabClicked {\n private eventRepository: EventRepository;\n private _tabId: string;\n private _event: string;\n\n constructor({ tabId, event }: ICartTabTabClickedProps) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this._tabId = tabId;\n this._event = event;\n }\n\n public execute = () => {\n const offerCodeFailedPayload = {\n event_name: 'cart overlay',\n event_category: 'ecommerce',\n event_action: eventActionMap[this._tabId] || this._tabId,\n event_label: 'click'\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this._event,\n type: 'link',\n payload: offerCodeFailedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { events } from '@estee/elc-service-bus';\n\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\ninterface defaultPayload {\n nonInteraction: boolean;\n}\nexport class CartOverlayClosed {\n private eventRepository: EventRepository;\n private nonInteraction: boolean;\n\n constructor(props: defaultPayload) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.nonInteraction = props.nonInteraction;\n }\n\n public execute = () => {\n const payload = {\n event_name: 'cart overlay',\n event_category: 'ecommerce',\n event_action: 'cart overlay',\n event_label: 'close',\n event_noninteraction: this.nonInteraction\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.CART_OVERLAY_CLOSED,\n type: 'link',\n payload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { events } from '@estee/elc-service-bus';\n\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\ninterface defaultPayload {\n nonInteraction: boolean;\n}\nexport class CartOverlayOpened {\n private eventRepository: EventRepository;\n private nonInteraction: boolean;\n\n constructor({ nonInteraction }: defaultPayload) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.nonInteraction = nonInteraction;\n }\n\n public execute = async () => {\n const payload = {\n event_name: 'checkout_basket',\n event_category: 'viewcart',\n event_action: 'view_cart',\n event_label: 'view_cart_overlay',\n event_noninteraction: this.nonInteraction\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.CART_OVERLAY_OPENED,\n type: 'link',\n payload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","export enum LoyaltyEventAction {\n LOYALTY_LOADMORE_TEXT = 'Load More',\n LOYALTY_OFFER_SELECTED = 'loyalty offer selected',\n LOYALTY_OFFER_REMOVED = 'loyalty offer removed',\n LOYALTY_REWARD_SELECTED = 'reward selected',\n LOYALTY_REWARD_REMOVED = 'reward removed',\n LOYALTY_ONLINE_TEXT = 'Online Purchase Order',\n LOYALTY_BENEFITS_TEXT = 'Benefits',\n LOYALTY_POINTS_TEXT = 'Points',\n LOYALTY_REWARDS_TEXT = 'Rewards',\n LOYALTY_EVENT_PAGE = 'my account page'\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/AnalyticsService';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { events } from '@estee/elc-service-bus';\n\nexport class AppointmentLocationSelectedUseCase {\n private readonly eventRepository: EventRepository;\n private readonly storeName: string;\n\n constructor(storeName: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.storeName = storeName;\n }\n\n public execute = async () => {\n const appointmentLocationSelectedPayload = {\n event_name: 'appointment booking',\n event_category: 'appointment booking',\n event_action: 'location selected',\n event_label: this.storeName\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_LOCATION_SELECTED,\n type: 'link',\n payload: appointmentLocationSelectedPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport { events } from '@estee/elc-service-bus';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport class PageViewUseCase {\n private eventRepository: EventRepository;\n\n constructor() {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n }\n\n public execute = () => {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.ANALYTICS_PAGE_VIEWED,\n type: 'view'\n });\n this.eventRepository.prependEventToQueue(newEvent);\n };\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/AnalyticsService';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { LoyaltyEventAction } from '~constants/Loyalty';\n\nexport class LoyaltyPointsUseCase {\n private eventRepository: EventRepository;\n private loyaltyActivityData: string;\n private loyaltyPointsEventData: string;\n\n constructor(loyaltyActivityData: string, loyaltyPointsEventData: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.loyaltyActivityData = loyaltyActivityData;\n this.loyaltyPointsEventData = loyaltyPointsEventData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.loyaltyPointsEventData,\n type: 'link',\n payload: this.getLoyaltyPointsHistoryPayload()\n });\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getLoyaltyPointsHistoryPayload() {\n return {\n event_name: LoyaltyEventAction.LOYALTY_EVENT_PAGE,\n event_category: LoyaltyEventAction.LOYALTY_EVENT_PAGE,\n event_action: LoyaltyEventAction.LOYALTY_POINTS_TEXT,\n event_label: this.loyaltyActivityData\n };\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/AnalyticsService';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { LoyaltyEventAction } from '~constants/Loyalty';\n\nexport class LoyaltyBenefitsUseCase {\n private eventRepository: EventRepository;\n private loyaltyPayloadData: string;\n private loyaltyBenefitsEventData: string;\n\n constructor(loyaltyPayloadData: string, loyaltyBenefitsEventData: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.loyaltyPayloadData = loyaltyPayloadData;\n this.loyaltyBenefitsEventData = loyaltyBenefitsEventData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.loyaltyBenefitsEventData,\n type: 'link',\n payload: this.getAccountLoyaltyBenefitsInfoPayload()\n });\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getAccountLoyaltyBenefitsInfoPayload() {\n return {\n event_name: LoyaltyEventAction.LOYALTY_EVENT_PAGE,\n event_category: LoyaltyEventAction.LOYALTY_EVENT_PAGE,\n event_action: LoyaltyEventAction.LOYALTY_BENEFITS_TEXT,\n event_label: this.loyaltyPayloadData\n };\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/AnalyticsService';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { Event } from '~entities/Event';\nimport { LoyaltyEventAction } from '~constants/Loyalty';\n\nexport class LoyaltyRewardsUseCase {\n private eventRepository: EventRepository;\n private loyaltyPayloadData: string;\n private loyaltyRewardsEventData: string;\n\n constructor(loyaltyPayloadData: string, loyaltyRewardsEventData: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.loyaltyPayloadData = loyaltyPayloadData;\n this.loyaltyRewardsEventData = loyaltyRewardsEventData;\n }\n\n public execute() {\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.loyaltyRewardsEventData,\n type: 'link',\n payload: this.getAccountLoyaltyRewardsInfoPayload()\n });\n this.eventRepository.addEventToQueue(newEvent);\n }\n\n private getAccountLoyaltyRewardsInfoPayload() {\n return {\n event_name: LoyaltyEventAction.LOYALTY_EVENT_PAGE,\n event_category: LoyaltyEventAction.LOYALTY_EVENT_PAGE,\n event_action: LoyaltyEventAction.LOYALTY_REWARDS_TEXT,\n event_label: this.loyaltyPayloadData\n };\n }\n}\n","import { EventRepository } from '../../internal/repositories/EventRepository';\nimport serviceNames from '../../service-setup/AnalyticsService';\nimport { diContainer } from '../../service-setup/diContainer';\nimport { Event } from '../domain/entities/Event';\nimport { events } from '@estee/elc-service-bus';\n\nexport interface ISearchFiltersSelected {\n facetId: string;\n responseId?: string;\n filterCategory?: string;\n filterLabel?: string;\n}\n\nexport class SearchFiltersSelectedUsecase {\n private eventRepository: EventRepository;\n private facetId: string;\n private responseId: string;\n private filterCategory: string;\n private filterLabel: string;\n\n constructor(payload: ISearchFiltersSelected) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.facetId = payload.facetId;\n this.responseId = payload.responseId || '';\n this.filterCategory = payload.filterCategory || '';\n this.filterLabel = payload.filterLabel || '';\n }\n\n public execute = async () => {\n const searchFilterPayload = {\n event_name: 'attraqt_facet',\n event_category: 'filter & sort selection',\n event_action: `facet - ${this.filterCategory} | ${this.filterLabel}`,\n event_label: 'add',\n vendor: 'attraqt',\n attraqt_facet_id: this.facetId,\n attraqt_responseId: this.responseId,\n attraqt_facet_name: this.filterLabel\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.SEARCH_FILTERS_SELECTED,\n type: 'link',\n payload: searchFilterPayload\n });\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentReviewWidgetClickUseCase {\n private serviceName: string;\n private eventRepository: EventRepository;\n\n constructor(serviceName: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.serviceName = serviceName;\n }\n\n public async execute() {\n const appointmentReviewWidgetClickPayload = {\n event_name: 'OAB reviews',\n event_category: 'oab reviews',\n event_action: 'review widget click',\n event_label: this.serviceName\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_REVIEW_WIDGET_CLICK,\n type: 'link',\n payload: appointmentReviewWidgetClickPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n}\n","import { events } from '@estee/elc-service-bus';\nimport { Event } from '~entities/Event';\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\n\nexport class AppointmentReviewPaginationUseCase {\n private optionSelection: string;\n private eventRepository: EventRepository;\n\n constructor(optionSelection: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.optionSelection = optionSelection;\n }\n\n public async execute() {\n const appointmentReviewViewPayload = {\n event_name: 'OAB reviews',\n event_category: 'oab reviews',\n event_action: 'pagination',\n event_label: this.optionSelection\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_REVIEW_PAGINATION,\n type: 'link',\n payload: appointmentReviewViewPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n}\n","import { events } from '@estee/elc-service-bus';\nimport { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\n\nexport interface IAppointmentReviewWidgetFiltersUseCase {\n serviceName: string;\n location: string;\n sortBy: string;\n}\n\nexport class AppointmentReviewWidgetFiltersUseCase {\n private serviceName: string;\n private location: string;\n private sortBy: string;\n private eventRepository: EventRepository;\n\n constructor({ serviceName, location, sortBy }: IAppointmentReviewWidgetFiltersUseCase) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.serviceName = serviceName;\n this.location = location;\n this.sortBy = sortBy;\n }\n\n public async execute() {\n const appointmentReviewWidgetFiltersPayload = {\n event_name: 'OAB reviews',\n event_category: 'oab reviews',\n event_action: 'review widget filters',\n event_label: `${this.serviceName} - ${this.location} - ${this.sortBy}`\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: events.APPOINTMENT_REVIEW_WIDGET_FILTERS,\n type: 'link',\n payload: appointmentReviewWidgetFiltersPayload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n }\n}\n","import { EventRepository } from '~repositories/EventRepository';\nimport serviceNames from '~setup/AnalyticsService';\nimport { diContainer } from '~setup/diContainer';\nimport { Event } from '~entities/Event';\nimport { IStoreDeliveryMethodsData } from '~interfaces/IAnalytics';\n\nexport class StoreDeliveryMethodsUseCase {\n private eventRepository: EventRepository;\n private storeDeliveryMethodsData: IStoreDeliveryMethodsData;\n private eventName: string;\n\n constructor(storeDeliveryMethodsData: IStoreDeliveryMethodsData, eventName: string) {\n this.eventRepository = diContainer.get(serviceNames.eventRepository);\n this.storeDeliveryMethodsData = storeDeliveryMethodsData;\n this.eventName = eventName;\n }\n\n public execute = async () => {\n const { eventAction, eventLabel, eventName, eventCategory } = this.storeDeliveryMethodsData;\n const payload = {\n event_name: eventName || 'store_delivery_type',\n event_category: eventCategory || 'ecommerce',\n event_action: eventAction,\n event_label: eventLabel\n };\n\n const newEvent = new Event({\n id: this.eventRepository.generateId(),\n name: this.eventName,\n type: 'link',\n payload\n });\n\n this.eventRepository.addEventToQueue(newEvent);\n };\n}\n","import { events } from '@estee/elc-service-bus';\nimport { AccountPageLandedUseCase } from '~use-cases/AccountPageLandedUseCase';\nimport { AccountLoyaltyPointsInfoUseCase } from '~use-cases/AccountLoyaltyPointsInfoUseCase';\nimport { AccountNonLoyaltyEnrollmentLinkUseCase } from '~use-cases/AccountNonLoyaltyEnrollmentLinkUseCase';\nimport { AccountNonLoyaltyEnrollmentSignupUseCase } from '~use-cases/AccountNonLoyaltyEnrollmentSignupUseCase';\nimport { CartLandingPageViewedUseCase } from '~use-cases/CartLandingPageViewedUseCase';\nimport { CartLoggedInUseCase } from '~use-cases/CartLoggedInUseCase';\nimport { ProductImpressionsUseCase } from '~use-cases/ProductImpressionsUseCase';\nimport { ProductViewedUseCase } from '~use-cases/ProductViewedUseCase';\nimport { CreateAccountAttemptUseCase } from '~use-cases/CreateAccountAttemptUseCase';\nimport { CreateAccountFailUseCase } from '~use-cases/CreateAccountFailUseCase';\nimport { ItemAddedUseCase } from '~use-cases/ItemAddedUseCase';\nimport { ManualOfferCodeAppliedUseCase } from '~use-cases/ManualOfferCodeAppliedUseCase';\nimport { MppFilteredUseCase } from '~use-cases/MppFilteredUseCase';\nimport { OrderConfirmationPageLandedUseCase } from '~use-cases/OrderConfirmationPageLandedUseCase';\nimport { PaymentMethodCompletedUseCase } from '~use-cases/PaymentMethodCompletedUseCase';\nimport { PaymentPageViewedUseCase } from '~use-cases/PaymentPageViewedUseCase';\nimport { ProductClickedUseCase } from '~use-cases/ProductClickedUseCase';\nimport { QuickViewUseCase } from '~use-cases/QuickViewUseCase';\nimport { RemoveItemUseCase } from '~use-cases/RemoveItemUseCase';\nimport { SampleAddedUseCase } from '~use-cases/SampleAddedUseCase';\nimport { SearchAddressSubmittedUseCase } from '~use-cases/SearchAddressSubmittedUseCase';\nimport { ShippingAddressFilledUseCase } from '~use-cases/ShippingAddressFilledUseCase';\nimport { ShippingOptionSelectedUseCase } from '~use-cases/ShippingOptionSelectedUseCase';\nimport { ShippingPageViewedUseCase } from '~use-cases/ShippingPageViewedUseCase';\nimport { StoreLocationSelectedUseCase } from '~use-cases/StoreLocationSelectedUseCase';\nimport { StoreLocatorClickedUseCase } from '~use-cases/StoreLocatorClickedUseCase';\nimport { StoreMarkerClickedUseCase } from '~use-cases/StoreMarkerClickedUseCase';\nimport { StoreTownSelectedUseCase } from '~use-cases/StoreTownSelectedUseCase';\nimport { SubscribedForEmailsUseCase } from '~use-cases/SubscribedForEmailsUseCase';\nimport { TransactionFailedUseCase } from '~use-cases/TransactionFailedUseCase';\nimport { TransactionSuccededUseCase } from '~use-cases/TransactionSuccededUseCase';\nimport { AnalyticsLoadedUseCase } from '~use-cases/AnalyticsLoadedUseCase';\nimport { SkuEngravingUseCase } from '~use-cases/SkuEngravingUseCase';\nimport { GridFilteredUseCase, IAnalyticsFilters } from '~use-cases/GridFilteredUseCase';\nimport { GridSortedUseCase } from '~use-cases/GridSortedUseCase';\nimport { ShadeGroupSelectedUseCase } from '~use-cases/ShadeGroupSelectedUseCase';\nimport { ShadeChangeViewedUseCase } from '../internal/use-cases/ShadeChangeViewedUseCase';\nimport { LiveChatInterfaceClickedUseCase } from '~use-cases/LiveChatInterfaceClickedUseCase';\nimport { ProductComparisonViewedUseCase } from '~use-cases/ProductComparisonViewedUseCase';\nimport { SocialShareIconTriggeredUseCase } from '~use-cases/SocialShareIconTriggeredUseCase';\nimport { StoreBookVirtualAppointmentClickedUseCase } from '~use-cases/StoreBookVirtualAppointmentClickedUseCase';\nimport { SkuPickerInteractionUseCase } from '~use-cases/SkuPickerInteractionUseCase';\nimport { AccountSidebarOverlayOpenedUseCase } from '~use-cases/AccountSidebarOverlayOpenedUseCase';\nimport { AccountSidebarMenuOptionClickedUseCase } from '~use-cases/AccountSidebarMenuOptionClickedUseCase';\nimport { AccountSidebarShowcaseClickedUseCase } from '~use-cases/AccountSidebarShowcaseClickedUseCase';\nimport { AccountEventAction } from '~constants/Account';\nimport { AppointmentVirtualSelectedUseCase } from '~use-cases/AppointmentVirtualSelectedUseCase';\nimport { AppointmentServiceSelectedUseCase } from '~use-cases/AppointmentServiceSelectedUseCase';\nimport { AppointmentDateTimeSelectedUseCase } from '~use-cases/AppointmentDateTimeSelectedUseCase';\nimport { AppointmentEditClickedUseCase } from '~use-cases/AppointmentEditClickedUseCase';\nimport { AppointmentStartedOverUseCase } from '~use-cases/AppointmentStartedOverUseCase';\nimport { AppointmentArtistSelectedUseCase } from '~use-cases/AppointmentArtistSelectedUseCase';\nimport { AppointmentStepLoadedUseCase } from '~use-cases/AppointmentStepLoadedUseCase';\nimport { AppointmentProcessCompletedUseCase } from '~use-cases/AppointmentProcessCompletedUseCase';\nimport { AppointmentAddedToCalendarUseCase } from '~use-cases/AppointmentAddedToCalendarUseCase';\nimport { AppointmentAccountButtonClickedUseCase } from '~use-cases/AppointmentAccountButtonClickedUseCase';\nimport { AppointmentCallStoreClickedUseCase } from '~use-cases/AppointmentCallStoreClickedUseCase';\nimport {\n SearchProductsQueriedUseCase,\n ISearchProductsQueried\n} from '~use-cases/SearchProductsQueriedUseCase';\nimport {\n SearchTermSelectedUseCase,\n ISearchTermSelected\n} from '~use-cases/SearchTermSelectedUseCase';\nimport { VTOActionUseCase } from '~use-cases/VTOActionUseCase';\n\nimport * as routes from '~constants/Routes';\nimport { ProductNotifyMeTriggeredUseCase } from '~use-cases/ProductNotifyMeTriggeredUseCase';\nimport { ProductNotifyMeRequestCompletedUseCase } from '~use-cases/ProductNotifyMeRequestCompletedUseCase';\n\nimport {\n IAccountSidebarBaseData,\n IAccountSidebarShowcaseData,\n IGenericAnalyticsData,\n IProductViewed,\n IProductImpressions,\n IReviewsData,\n ISmartGiftData,\n ISkinCareProducts,\n IVtoLoaded,\n IVtoType,\n IVtoProductsUsedItemClicked,\n IVtoLookSelected,\n IVtoBrowGoalSelected,\n IVtoShapeChanged,\n IVtoBrowShadeTryOn,\n IVtoLengthChanged,\n IVtoThicknessChanged,\n IVtoOpacityChanged,\n IStoreDeliveryMethodsData\n} from '~interfaces/IAnalytics';\nimport { RatingsReviewsUseCase } from '~use-cases/RatingsReviewsUseCase';\n\nimport { ReviewsEventAction } from '~constants/RatingsReviews';\nimport { SmartGiftUseCase } from '~use-cases/SmartGiftUseCase';\nimport { SmartGiftEventAction } from '~constants/SmartGift';\nimport { VTO_EVENTS } from '~constants/Vto';\nimport { ActionType } from '~constants/ActionType';\nimport { IOfferViewedProps, OfferViewed } from '~use-cases/OfferViewed';\nimport { IOfferClickedProps, OfferClicked } from '~use-cases/OfferClicked';\nimport { CartTabTabClicked } from '~use-cases/OffersTabClicked';\nimport { CartOverlayClosed } from '~use-cases/CartOverlayClosed';\nimport { CartOverlayOpened } from '~use-cases/CartOverlayOpened';\nimport { AppointmentLocationSelectedUseCase } from '~use-cases/AppointmentLocationSelectedUseCase';\nimport { PageViewUseCase } from '~use-cases/PageViewUseCase';\nimport { LoyaltyEventAction } from '~constants/Loyalty';\nimport { LoyaltyPointsUseCase } from '~use-cases/LoyaltyPointsUseCase';\nimport { LoyaltyBenefitsUseCase } from '~use-cases/LoyaltyBenefitsUseCase';\nimport { LoyaltyRewardsUseCase } from '~use-cases/LoyaltyRewardsUseCase';\nimport {\n SearchFiltersSelectedUsecase,\n ISearchFiltersSelected\n} from '~use-cases/SearchFiltersSelectedUseCase';\nimport { AppointmentReviewWidgetClickUseCase } from '~use-cases/AppointmentReviewWidgetClickUseCase';\nimport { AppointmentReviewPaginationUseCase } from '~use-cases/AppointmentReviewPaginationUseCase';\nimport { AppointmentReviewWidgetFiltersUseCase } from '~use-cases/AppointmentReviewWidgetFiltersUseCase';\nimport { StoreDeliveryMethodsUseCase } from '~use-cases/StoreDeliveryMethodsUseCase';\n\nexport interface IOrderDetail {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport interface IOrderQueryData {\n orderId: string;\n guestToken: string;\n paymentType: string;\n}\n\ntype IReviewsParam = Omit;\ntype ISmartGiftParam = Omit;\n\nconst SHIPPING_SCREEN_SHIPPING_ADDRESS_SELECTION_CONTEXT =\n 'checkout_shipping_screen_shipping_address_selection';\nconst QUICK_VIEW = 'QV';\n\nexport class ServiceBusController {\n private orderQueryData: IOrderQueryData;\n\n public analyticsLoaded = () => {\n const analyticsLoadedUseCase = new AnalyticsLoadedUseCase();\n analyticsLoadedUseCase.execute();\n };\n\n public pageViewed = () => {\n new PageViewUseCase().execute();\n };\n\n public productViewedUseCase = (payload: IProductViewed) => {\n new ProductViewedUseCase(payload).execute();\n };\n\n public shadeChangeViewedUseCase = (payload: IProductViewed) => {\n new ShadeChangeViewedUseCase(payload).execute();\n };\n\n public productImpressionUseCase = (payload: IProductImpressions) => {\n new ProductImpressionsUseCase(payload).execute();\n };\n\n public storeDetailsClicked = (payload: { storeId: string; storeName: string }) => {\n const storeLocatorClickedUseCase = new StoreLocatorClickedUseCase(\n payload.storeId,\n payload.storeName,\n events.STORE_DETAILS_CLICKED\n );\n storeLocatorClickedUseCase.execute();\n };\n\n public getDirectionsClicked = (payload: { storeId: string; storeName: string }) => {\n const getDirectionsClickedUseCase = new StoreLocatorClickedUseCase(\n payload.storeId,\n payload.storeName,\n events.GET_DIRECTIONS_CLICKED\n );\n getDirectionsClickedUseCase.execute();\n };\n\n public storeInfoClicked = (payload: { storeId: string; storeName: string }) => {\n const storeInfoClickedUseCase = new StoreLocatorClickedUseCase(\n payload.storeId,\n payload.storeName,\n events.STORE_INFO_CLICKED\n );\n storeInfoClickedUseCase.execute();\n };\n\n public storeMarkerClicked = (payload: { storeId: string }) => {\n const storeMarkerClickedUseCase = new StoreMarkerClickedUseCase(payload.storeId);\n storeMarkerClickedUseCase.execute();\n };\n\n public storePhoneClicked = (payload: { storeId: string; storeName: string }) => {\n const storePhoneClickedUseCase = new StoreLocatorClickedUseCase(\n payload.storeId,\n payload.storeName,\n events.STORE_PHONE_CLICKED\n );\n storePhoneClickedUseCase.execute();\n };\n\n public bookAppointmentClicked = (payload: { storeId: string; storeName: string }) => {\n const bookAppointmentClickedUseCase = new StoreLocatorClickedUseCase(\n payload.storeId,\n payload.storeName,\n events.BOOK_APPOINTMENT_CLICKED\n );\n bookAppointmentClickedUseCase.execute();\n };\n\n public bookVirtualAppointmentClicked = (payload: { isVirtual: boolean }) => {\n const bookVirtualAppointmentClickedUseCase = new StoreBookVirtualAppointmentClickedUseCase(\n payload.isVirtual,\n events.BOOK_VIRTUAL_APPOINTMENT_CLICKED\n );\n bookVirtualAppointmentClickedUseCase.execute();\n };\n\n public storeLocationSelected = (payload: { storeId: string }) => {\n const storeLocationSelectedUseCase = new StoreLocationSelectedUseCase(payload.storeId);\n storeLocationSelectedUseCase.execute();\n };\n\n public storeTownSelected = (payload: { town: string }) => {\n const storeTownSelectedUseCase = new StoreTownSelectedUseCase(payload.town);\n storeTownSelectedUseCase.execute();\n };\n\n public searchAddressSubmitted = (payload: { address: string }) => {\n const searchAddressSubmittedUseCase = new SearchAddressSubmittedUseCase(payload.address);\n searchAddressSubmittedUseCase.execute();\n };\n\n public trackOrderDetails = (orderQueryData: IOrderQueryData) => {\n this.orderQueryData = orderQueryData;\n };\n\n public createAccountAttempt = () => {\n const createAccountAttemptUseCase = new CreateAccountAttemptUseCase();\n createAccountAttemptUseCase.execute();\n };\n\n public removeItem = async (payload: { skuId: string }) => {\n const removeItemUseCase = new RemoveItemUseCase(payload.skuId);\n removeItemUseCase.execute();\n };\n\n public createAccountFail = (error: string) => {\n const createAccountFailUseCase = new CreateAccountFailUseCase(error);\n createAccountFailUseCase.execute();\n };\n\n public applyOfferCode = async () => {\n const manualOfferCodeAppliedUseCase = new ManualOfferCodeAppliedUseCase();\n manualOfferCodeAppliedUseCase.execute();\n };\n\n public offerCodeFailed = async () => {\n const manualOfferCodeAppliedUseCase = new ManualOfferCodeAppliedUseCase();\n manualOfferCodeAppliedUseCase.execute();\n };\n\n public productClicked = async (payload: {\n skuId: string;\n positionIndex: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n product?: any;\n }) => {\n const { skuId, positionIndex, product } = payload;\n const pageType = '';\n const productClickedUseCase = new ProductClickedUseCase(\n skuId,\n pageType,\n positionIndex,\n product\n );\n productClickedUseCase.execute();\n };\n\n public productNotifyMeTriggered = async (payload: { skuId: string }) => {\n const productNotifyMeTriggeredUseCase = new ProductNotifyMeTriggeredUseCase(payload.skuId);\n productNotifyMeTriggeredUseCase.execute();\n };\n\n public productNotifyMeRequestSuccess = async (payload: { skuId: string }) => {\n const eventAction = 'notify me - success';\n\n const productNotifyMeRequestCompletedUseCase = new ProductNotifyMeRequestCompletedUseCase(\n payload.skuId,\n events.PRODUCT_NOTIFY_ME_REQUEST_SUCCESS,\n eventAction\n );\n productNotifyMeRequestCompletedUseCase.execute();\n };\n\n public productNotifyMeRequestFailure = async (payload: { skuId: string }) => {\n const eventAction = 'notify me - fail';\n\n const productNotifyMeRequestCompletedUseCase = new ProductNotifyMeRequestCompletedUseCase(\n payload.skuId,\n events.PRODUCT_NOTIFY_ME_REQUEST_FAILURE,\n eventAction\n );\n productNotifyMeRequestCompletedUseCase.execute();\n };\n\n public itemAdded = async (payload: { skuId: string }) => {\n const itemAddedUseCase = new ItemAddedUseCase(payload.skuId);\n itemAddedUseCase.execute();\n };\n\n public sampleAdded = async () => {\n const sampleAddedUseCase = new SampleAddedUseCase();\n sampleAddedUseCase.execute();\n };\n\n public shippingOptionSelected = () => {\n const shippingOptionSelectedUseCase = new ShippingOptionSelectedUseCase();\n shippingOptionSelectedUseCase.execute();\n };\n\n public cartLoggedIn = () => {\n const cartLoggedInUseCase = new CartLoggedInUseCase();\n cartLoggedInUseCase.execute();\n };\n\n public shippingAddressFilled = ({ context }: { context: string }) => {\n if (context === SHIPPING_SCREEN_SHIPPING_ADDRESS_SELECTION_CONTEXT) {\n const shippingAddressFilledUseCase = new ShippingAddressFilledUseCase();\n shippingAddressFilledUseCase.execute();\n }\n };\n\n public paymentMethodCompleted = () => {\n const paymentMethodCompletedUseCase = new PaymentMethodCompletedUseCase();\n paymentMethodCompletedUseCase.execute();\n };\n\n public orderConfirmationPageLanded = async (payload: IOrderDetail) => {\n const orderConfirmationPageLandedUseCase = new OrderConfirmationPageLandedUseCase(payload);\n await orderConfirmationPageLandedUseCase.execute();\n };\n\n public subscribedForEvents = () => {\n const subscribedForEventsUseCase = new SubscribedForEmailsUseCase();\n subscribedForEventsUseCase.execute();\n };\n\n public cartPageView = async () => {\n const cartLandingPageViewedUseCase = new CartLandingPageViewedUseCase();\n await cartLandingPageViewedUseCase.execute();\n };\n\n public transactionFailed = () => {\n const transactionFailedUseCase = new TransactionFailedUseCase(this.orderQueryData);\n transactionFailedUseCase.execute();\n };\n\n public transactionSucceded = () => {\n const transactionSuccededUseCase = new TransactionSuccededUseCase(this.orderQueryData);\n transactionSuccededUseCase.execute();\n };\n\n public filterMpp = async (payload: { method: string }) => {\n const mppFilteredUseCase = new MppFilteredUseCase(payload.method);\n mppFilteredUseCase.execute();\n };\n\n public filterGrid = async (payload: { appliedFilters: IAnalyticsFilters[] }) => {\n const gridFilteredUseCase = new GridFilteredUseCase(payload.appliedFilters);\n gridFilteredUseCase.execute();\n };\n\n public sortGrid = async (payload: { appliedSort: string }) => {\n const sortFilteredUseCase = new GridSortedUseCase(payload.appliedSort);\n await sortFilteredUseCase.execute();\n };\n\n public quickViewSelected = (payload: {\n skuId: string;\n positionIndex: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n product?: any;\n }) => {\n const pageType = QUICK_VIEW;\n const { skuId, positionIndex, product } = payload;\n const quickViewSelectedUseCase = new QuickViewUseCase(skuId, product);\n const productClickedUseCase = new ProductClickedUseCase(\n skuId,\n pageType,\n positionIndex,\n product\n );\n quickViewSelectedUseCase.execute();\n productClickedUseCase.execute();\n };\n\n public cartOverlayClosed = async (payload: { nonInteraction: boolean }) =>\n new CartOverlayClosed(payload).execute();\n\n public cartOverlayOpened = async (payload: { nonInteraction: boolean }) =>\n new CartOverlayOpened(payload).execute();\n\n public cartTabClicked = async ({ tabId }: { tabId: string }) => {\n const payload = { tabId, event: events.CART_OVERLAY_TAB_CLICKED };\n new CartTabTabClicked(payload).execute();\n };\n\n public cartOverlayOfferClicked = async (payload: IOfferClickedProps) => {\n new OfferClicked(payload).execute();\n };\n\n public cartOverlayOfferViewed = async (payload: IOfferViewedProps) => {\n new OfferViewed(payload).execute();\n };\n\n public shadeGroupSelected = (payload: {\n shadeGroupKey: string;\n eventName: string;\n eventAction: string;\n }) => {\n const { shadeGroupKey, eventName, eventAction } = payload;\n const shadeGroupSelectedUseCase = new ShadeGroupSelectedUseCase(\n shadeGroupKey,\n eventName,\n eventAction\n );\n shadeGroupSelectedUseCase.execute();\n };\n\n public productComparisonViewed = (payload: { productIds: string[] }) => {\n const { productIds } = payload;\n const productComparisonViewedUseCase = new ProductComparisonViewedUseCase(productIds);\n productComparisonViewedUseCase.execute();\n };\n\n public searchProductsQueried = (payload: ISearchProductsQueried) => {\n const searchProductsQueriedUseCase = new SearchProductsQueriedUseCase(payload);\n searchProductsQueriedUseCase.execute();\n };\n\n public searchTermSelected = (payload: ISearchTermSelected) => {\n const searchTermSelectedUseCase = new SearchTermSelectedUseCase(payload);\n searchTermSelectedUseCase.execute();\n };\n\n public searchFiltersSelected = (payload: ISearchFiltersSelected) => {\n const searchFiltersSelectedUsecase = new SearchFiltersSelectedUsecase(payload);\n searchFiltersSelectedUsecase.execute();\n };\n\n public navigatedToPageView = async ({ currentRoute }: { currentRoute: string }) => {\n switch (currentRoute) {\n case routes.ACCOUNT_LANDING:\n case routes.LOGIN:\n const accountPageLandedUseCase = new AccountPageLandedUseCase();\n accountPageLandedUseCase.execute();\n break;\n\n case routes.SHIPPING:\n const shippingPageViewedUseCase = new ShippingPageViewedUseCase();\n shippingPageViewedUseCase.execute();\n break;\n\n case routes.PAYMENT:\n const paymentPageViewedUseCase = new PaymentPageViewedUseCase();\n paymentPageViewedUseCase.execute();\n break;\n\n default:\n return;\n }\n };\n\n public vtoCameraClosed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CAMERA_CLOSED,\n vtoType: payload.vtoType\n };\n const vtoCameraClosedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoCameraClosedUseCase.execute();\n };\n\n public vtoCameraFailed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CAMERA_FAILED,\n vtoType: payload.vtoType\n };\n const vtoCameraFailedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoCameraFailedUseCase.execute();\n };\n\n public vtoCameraOpened = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CAMERA_OPENED,\n vtoType: payload.vtoType\n };\n const vtoCameraOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoCameraOpenedUseCase.execute();\n };\n\n public vtoCompare = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.COMPARE,\n vtoType: payload.vtoType\n };\n const vtoCompareUseCase = new VTOActionUseCase(vtoAction);\n\n vtoCompareUseCase.execute();\n };\n\n public vtoCompareDisabled = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.COMPARE_DISABLED,\n vtoType: payload.vtoType\n };\n const vtoCompareDisabledUseCase = new VTOActionUseCase(vtoAction);\n\n vtoCompareDisabledUseCase.execute();\n };\n\n public vtoClosed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CLOSED,\n vtoType: payload.vtoType\n };\n const vtoClosedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoClosedUseCase.execute();\n };\n\n public vtoEnabled = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CTA,\n vtoType: payload.vtoType\n };\n const vtoEnabledUseCase = new VTOActionUseCase(vtoAction);\n\n vtoEnabledUseCase.execute();\n };\n\n public vtoEngineClosed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.ENGINE_CLOSED,\n vtoType: payload.vtoType\n };\n const vtoEngineClosedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoEngineClosedUseCase.execute();\n };\n\n public vtoFoundationQrCodeOverlayClosed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.FOUNDATION_QR_CODE_OVERLAY_CLOSED,\n vtoType: payload.vtoType\n };\n const vtoFoundationQrCodeOverlayClosedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoFoundationQrCodeOverlayClosedUseCase.execute();\n };\n\n public vtoFoundationQrCodeOverlayOpened = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.FOUNDATION_QR_CODE_OVERLAY_OPENED,\n vtoType: payload.vtoType\n };\n const vtoFoundationQrCodeOverlayOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoFoundationQrCodeOverlayOpenedUseCase.execute();\n };\n\n public vtoLoaded = (payload: IVtoLoaded) => {\n const vtoAction = {\n event: VTO_EVENTS.LOADED,\n vtoType: payload.vtoType,\n eventValue: payload.eventValue\n };\n const vtoLoadedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoLoadedUseCase.execute();\n };\n\n public vtoLoading = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.LOADING,\n vtoType: payload.vtoType\n };\n const vtoLoadingUseCase = new VTOActionUseCase(vtoAction);\n\n vtoLoadingUseCase.execute();\n };\n\n public vtoKissDetected = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.KISS_DETECTED,\n vtoType: payload.vtoType\n };\n const vtoKissDetectedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoKissDetectedUseCase.execute();\n };\n\n public vtoOpened = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.OPENED,\n vtoType: payload.vtoType\n };\n const vtoOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoOpenedUseCase.execute();\n };\n\n public vtoPairShadeGridOpened = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.PAIR_SHADE_GRID_OPENED,\n vtoType: payload.vtoType\n };\n const vtoOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoOpenedUseCase.execute();\n };\n\n public vtoPairShadeSelected = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.PAIR_SHADE_SELECTED,\n vtoType: payload.vtoType\n };\n const vtoOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoOpenedUseCase.execute();\n };\n\n public vtoPhotoLoaded = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.PHOTO_LOADED,\n vtoType: payload.vtoType\n };\n const vtoPhotoLoadedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoPhotoLoadedUseCase.execute();\n };\n\n public vtoPhotoSaved = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.PHOTO_SAVED,\n vtoType: payload.vtoType\n };\n const vtoPhotoSavedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoPhotoSavedUseCase.execute();\n };\n\n public vtoPriceSuppressed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.PRICE_SUPPRESSED,\n vtoType: payload.vtoType\n };\n const vtoPriceSuppressedUsedCase = new VTOActionUseCase(vtoAction);\n\n vtoPriceSuppressedUsedCase.execute();\n };\n\n public vtoReset = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.RESET,\n vtoType: payload.vtoType\n };\n const vtoResetUseCase = new VTOActionUseCase(vtoAction);\n\n vtoResetUseCase.execute();\n };\n\n public vtoVideoLoaded = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.VIDEO_LOADED,\n vtoType: payload.vtoType\n };\n const vtoVideoLoadedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoVideoLoadedUseCase.execute();\n };\n\n public vtoViewAllShades = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.ALL_SHADES_VIEWED,\n vtoType: payload.vtoType\n };\n const vtoViewAllShadesUseCase = new VTOActionUseCase(vtoAction);\n\n vtoViewAllShadesUseCase.execute();\n };\n\n public vtoViewBestShades = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.BEST_SHADES_VIEWED,\n vtoType: payload.vtoType\n };\n const vtoViewBestShadesUseCase = new VTOActionUseCase(vtoAction);\n\n vtoViewBestShadesUseCase.execute();\n };\n\n public vtoShadeFinderStarted = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SHADE_FINDER_STARTED,\n vtoType: payload.vtoType\n };\n const vtoShadeFinderStartedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoShadeFinderStartedUseCase.execute();\n };\n\n public vtoShadeFinderCompleted = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SHADE_FINDER_COMPLETED,\n vtoType: payload.vtoType\n };\n const vtoShadeFinderCompletedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoShadeFinderCompletedUseCase.execute();\n };\n\n public vtoShadeFinderCancelled = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SHADE_FINDER_CANCELLED,\n vtoType: payload.vtoType\n };\n const vtoShadeFinderCancelledUseCase = new VTOActionUseCase(vtoAction);\n\n vtoShadeFinderCancelledUseCase.execute();\n };\n\n public vtoSkinShadeFound = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SKIN_SHADE_FOUND,\n vtoType: payload.vtoType\n };\n const vtoSkinShadeFoundUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinShadeFoundUseCase.execute();\n };\n\n public vtoSplitFourWay = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SPLIT_FOUR_WAY,\n vtoType: payload.vtoType\n };\n const vtoSplitFourWayUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSplitFourWayUseCase.execute();\n };\n\n public vtoSplitFourWayDisabled = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SPLIT_FOUR_WAY_DISABLED,\n vtoType: payload.vtoType\n };\n const vtoSplitFourWayDisabledUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSplitFourWayDisabledUseCase.execute();\n };\n\n public vtoShadeReminderOverlayOpened = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SHADE_REMINDER_OVERLAY_OPENED,\n vtoType: payload.vtoType\n };\n const vtoShadeReminderOverlayOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoShadeReminderOverlayOpenedUseCase.execute();\n };\n\n public vtoShadeReminderOverlayClosed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SHADE_REMINDER_OVERLAY_CLOSED,\n vtoType: payload.vtoType\n };\n const vtoShadeReminderOverlayClosedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoShadeReminderOverlayClosedUseCase.execute();\n };\n\n public vtoShadeReminderOverlayRetained = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SHADE_REMINDER_OVERLAY_KEEP,\n vtoType: payload.vtoType\n };\n const vtoShadeReminderOverlayRetainedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoShadeReminderOverlayRetainedUseCase.execute();\n };\n\n public vtoShadeReminderRetaken = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SHADE_REMINDER_OVERLAY_RETAKE,\n vtoType: payload.vtoType\n };\n const vtoShadeReminderRetakenUseCase = new VTOActionUseCase(vtoAction);\n\n vtoShadeReminderRetakenUseCase.execute();\n };\n\n public vtoZoom = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.ZOOM,\n vtoType: payload.vtoType\n };\n const vtoZoomUseCase = new VTOActionUseCase(vtoAction);\n\n vtoZoomUseCase.execute();\n };\n\n public vtoMatchSaved = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.MATCH_SAVED,\n vtoType: payload.vtoType\n };\n const vtoMatchSavedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoMatchSavedUseCase.execute();\n };\n\n public vtoMatchRemoved = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.MATCH_REMOVED,\n vtoType: payload.vtoType\n };\n const vtoMatchRemovedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoMatchRemovedUseCase.execute();\n };\n\n public vtoMatchPersonalized = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.MATCH_PERSONALIZED,\n vtoType: payload.vtoType\n };\n const vtoMatchPersonalizedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoMatchPersonalizedUseCase.execute();\n };\n\n public vtoSkinCareOpened = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.OPENED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareOpenedUseCase.execute();\n };\n\n public vtoSkinCareCameraOpened = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CAMERA_OPENED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareCameraOpenedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareCameraOpenedUseCase.execute();\n };\n\n public vtoSkinCareCameraFailed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CAMERA_FAILED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareCameraFailedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareCameraFailedUseCase.execute();\n };\n\n public vtoSkinCareCameraClosed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CAMERA_CLOSED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareCameraClosedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareCameraClosedUseCase.execute();\n };\n\n public vtoSkinCareLoading = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.LOADING,\n vtoType: payload.vtoType\n };\n const vtoSkinCareLoadingUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareLoadingUseCase.execute();\n };\n\n public vtoSkinCareLoaded = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.LOADED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareLoadedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareLoadedUseCase.execute();\n };\n\n public vtoSkinCareVideoLoaded = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.VIDEO_LOADED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareVideoLoadedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareVideoLoadedUseCase.execute();\n };\n\n public vtoSkinCareAnalysisStarted = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SKIN_ANALYSIS_STARTED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareAnalysisStartedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareAnalysisStartedUseCase.execute();\n };\n\n public vtoSkinCareAnalysisFinished = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SKIN_ANALYSIS_FINISHED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareAnalysisFinishedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareAnalysisFinishedUseCase.execute();\n };\n\n public vtoSkinCareBackToDetecting = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SKIN_BACK_TO_DETECTING,\n vtoType: payload.vtoType\n };\n const vtoSkinCareBackToDetectingUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareBackToDetectingUseCase.execute();\n };\n\n public vtoSkinCareClosed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.CLOSED,\n vtoType: payload.vtoType\n };\n const vtoSkinCareClosedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareClosedUseCase.execute();\n };\n\n public vtoSkinCareProductsLoaded = (payload: ISkinCareProducts) => {\n const { SHOPPABLE_PRODUCTS_LOADED, NON_SHOPPABLE_PRODUCTS_LOADED } = VTO_EVENTS;\n const event = payload.isShoppable\n ? SHOPPABLE_PRODUCTS_LOADED\n : NON_SHOPPABLE_PRODUCTS_LOADED;\n const vtoAction = {\n event,\n vtoType: payload.vtoType\n };\n const vtoSkinCareProductsLoadedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSkinCareProductsLoadedUseCase.execute();\n };\n\n public vtoSurveyIgnored = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SURVEY_IGNORED,\n vtoType: payload.vtoType\n };\n const vtoSurveyIgnoredUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSurveyIgnoredUseCase.execute();\n };\n public vtoSurveyLoaded = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SURVEY_LOADED,\n vtoType: payload.vtoType\n };\n const vtoSurveyLoadedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSurveyLoadedUseCase.execute();\n };\n public vtoSurveySubmitted = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.SURVEY_SUBMITTED,\n vtoType: payload.vtoType\n };\n const vtoSurveySubmittedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoSurveySubmittedUseCase.execute();\n };\n\n public vtoTutorialStarted = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_STARTED,\n vtoType: payload.vtoType\n };\n const vtoTutorialStartedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialStartedUseCase.execute();\n };\n\n public vtoTutorialUnmuted = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_UNMUTED,\n vtoType: payload.vtoType\n };\n const vtoTutorialUnmutedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialUnmutedUseCase.execute();\n };\n\n public vtoTutorialMuted = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_MUTED,\n vtoType: payload.vtoType\n };\n const vtoTutorialMutedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialMutedUseCase.execute();\n };\n\n public vtoTutorialPaused = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_PAUSED,\n vtoType: payload.vtoType\n };\n const vtoTutorialPausedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialPausedUseCase.execute();\n };\n\n public vtoTutorialStopped = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_STOPPED,\n vtoType: payload.vtoType\n };\n const vtoTutorialStoppedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialStoppedUseCase.execute();\n };\n\n public vtoTutorialResumed = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_RESUMED,\n vtoType: payload.vtoType\n };\n const vtoTutorialResumedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialResumedUseCase.execute();\n };\n\n public vtoTutorialPlaySpeedUpdated = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_PLAY_SPEED_UPDATED,\n vtoType: payload.vtoType\n };\n const vtoTutorialPlaySpeedUpdatedUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialPlaySpeedUpdatedUseCase.execute();\n };\n\n public vtoTutorialPreviousStep = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_PREVIOUS_STEP,\n vtoType: payload.vtoType\n };\n const vtoTutorialPreviousStepUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialPreviousStepUseCase.execute();\n };\n\n public vtoTutorialNextStep = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_NEXT_STEP,\n vtoType: payload.vtoType\n };\n const vtoTutorialNextStepUseCase = new VTOActionUseCase(vtoAction);\n\n vtoTutorialNextStepUseCase.execute();\n };\n\n public vtoLookSelected = (payload: IVtoLookSelected) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_LOOK_SELECTED,\n vtoType: payload.vtoType,\n vtoLookIndex: payload.vtoLookIndex,\n vtoLookId: payload.vtoLookId\n };\n const vtoLookSelectedUseCase = new VTOActionUseCase(vtoAction);\n vtoLookSelectedUseCase.execute();\n };\n\n public vtoProductListClicked = (payload: IVtoType) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_PRODUCT_LIST_CLICKED,\n vtoType: payload.vtoType\n };\n const vtoProductListClickedUseCase = new VTOActionUseCase(vtoAction);\n vtoProductListClickedUseCase.execute();\n };\n\n public vtoProductsUsedItemClicked = (payload: IVtoProductsUsedItemClicked) => {\n const vtoAction = {\n event: VTO_EVENTS.TUTORIAL_PRODUCTS_USED_ITEM_CLICKED,\n vtoType: payload.vtoType,\n vtoItemId: payload.vtoItemId\n };\n const vtoProductsUsedItemClickedUseCase = new VTOActionUseCase(vtoAction);\n vtoProductsUsedItemClickedUseCase.execute();\n };\n\n public vtoFaceAttributePredictionStarted = (payload: IVtoType) => {\n const vtoFaceAttributePredictionStartedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_FACE_ATTRIBUTE_PREDICTION_STARTED,\n ...payload\n });\n vtoFaceAttributePredictionStartedUseCase.execute();\n };\n\n public vtoFaceAttributeUpdated = (payload: IVtoType) => {\n const vtoFaceAttributeUpdatedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_FACE_ATTRIBUTE_UPDATED,\n ...payload\n });\n vtoFaceAttributeUpdatedUseCase.execute();\n };\n\n public vtoBrowGoalSelected = (payload: IVtoBrowGoalSelected) => {\n const vtoBrowGoalSelectedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_GOAL_SELECTED,\n ...payload\n });\n vtoBrowGoalSelectedUseCase.execute();\n };\n\n public vtoTipsClicked = (payload: IVtoType) => {\n const vtoTipsClickedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_TIPS_CLICKED,\n ...payload\n });\n vtoTipsClickedUseCase.execute();\n };\n\n public vtoBackToGoalsClicked = (payload: IVtoType) => {\n const vtoBackToGoalsClickedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_BACK_TO_GOALS_CLICKED,\n ...payload\n });\n vtoBackToGoalsClickedUseCase.execute();\n };\n\n public vtoShapeChanged = (payload: IVtoShapeChanged) => {\n const vtoShapeChangedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_SHAPE_CHANGED,\n ...payload\n });\n vtoShapeChangedUseCase.execute();\n };\n\n public vtoBrowShadeTryOn = (payload: IVtoBrowShadeTryOn) => {\n const vtoBrowShadeTryOnUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_SHADE_TRY_ON,\n ...payload\n });\n vtoBrowShadeTryOnUseCase.execute();\n };\n\n public vtoLengthChanged = (payload: IVtoLengthChanged) => {\n const vtoLengthChangedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_LENGTH_CHANGED,\n ...payload\n });\n vtoLengthChangedUseCase.execute();\n };\n\n public vtoThicknessChanged = (payload: IVtoThicknessChanged) => {\n const vtoThicknessChangedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_THICKNESS_CHANGED,\n ...payload\n });\n vtoThicknessChangedUseCase.execute();\n };\n\n public vtoOpacityChanged = (payload: IVtoOpacityChanged) => {\n const vtoOpacityChangedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_OPACITY_CHANGED,\n ...payload\n });\n vtoOpacityChangedUseCase.execute();\n };\n\n public vtoGoldenRatioEnabled = (payload: IVtoType) => {\n const vtoGoldenRatioEnabledUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_GOLDEN_RATION_ENABLED,\n ...payload\n });\n vtoGoldenRatioEnabledUseCase.execute();\n };\n\n public vtoGoldenRatioDisabled = (payload: IVtoType) => {\n const vtoGoldenRatioDisabledUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_GOLDEN_RATION_DISABLED,\n ...payload\n });\n vtoGoldenRatioDisabledUseCase.execute();\n };\n\n public vtoStencilEnabled = (payload: IVtoType) => {\n const vtoStencilEnabledUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_STENCIL_ENABLED,\n ...payload\n });\n vtoStencilEnabledUseCase.execute();\n };\n\n public vtoStencilDisabled = (payload: IVtoType) => {\n const vtoStencilDisabledUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_STENCIL_DISABLED,\n ...payload\n });\n vtoStencilDisabledUseCase.execute();\n };\n\n public vtoCompareEnabled = (payload: IVtoType) => {\n const vtoCompareEnabledUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_COMPARE_ENABLED,\n ...payload\n });\n vtoCompareEnabledUseCase.execute();\n };\n\n public vtoCaptureClicked = (payload: IVtoType) => {\n const vtoCaptureClickedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_CAPTURE_CLICKED,\n ...payload\n });\n vtoCaptureClickedUseCase.execute();\n };\n\n public vtoSeeAllShadesClicked = (payload: IVtoType) => {\n const vtoSeeAllShadesClickedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_SEE_ALL_SHADES_CLICKED,\n ...payload\n });\n vtoSeeAllShadesClickedUseCase.execute();\n };\n\n public vtoGetBrowClicked = (payload: IVtoType) => {\n const vtoGetBrowClickedUseCase = new VTOActionUseCase({\n event: VTO_EVENTS.BROW_GET_BROW_CLICKED,\n ...payload\n });\n vtoGetBrowClickedUseCase.execute();\n };\n\n public engravingTriggered = (payload: {\n skuId: string;\n skuBaseId?: number;\n size: string;\n price: string;\n name: string;\n }) => {\n const skuEngravingUseCase = new SkuEngravingUseCase(payload);\n skuEngravingUseCase.execute();\n };\n\n public writeReviewEventTriggered = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.WRITE_REVIEWS_LINK_CLICKED, {\n ...payload,\n eventAction: ReviewsEventAction.WRITE_REVIEW\n });\n ratingsReviewsUseCase.execute();\n };\n\n public readReviewsEventTriggered = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.WRITE_REVIEWS_LINK_CLICKED, {\n ...payload,\n eventAction: ReviewsEventAction.READ_REVIEW\n });\n ratingsReviewsUseCase.execute();\n };\n\n public reviewsHelpfulYesClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(\n events.REVIEWS_HELPFUL_YES_CLICKED,\n {\n ...payload,\n eventAction: ReviewsEventAction.HELPFUL_YES\n }\n );\n ratingsReviewsUseCase.execute();\n };\n\n public reviewsHelpfulNoClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.REVIEWS_HELPFUL_NO_CLICKED, {\n ...payload,\n eventAction: ReviewsEventAction.HELPFUL_NO\n });\n ratingsReviewsUseCase.execute();\n };\n\n public reviewsFlagReviewClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(\n events.REVIEWS_FLAG_REVIEW_CLICKED,\n {\n ...payload,\n eventAction: ReviewsEventAction.FLAG_REVIEW\n }\n );\n ratingsReviewsUseCase.execute();\n };\n\n public reviewsFilterClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.REVIEWS_FILTER_CLICKED, {\n ...payload,\n eventAction: ReviewsEventAction.REVIEWS_FILTER\n });\n ratingsReviewsUseCase.execute();\n };\n\n public reviewsSearchClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.REVIEWS_SEARCH_CLICKED, {\n ...payload,\n eventAction: ReviewsEventAction.REVIEWS_SEARCH\n });\n ratingsReviewsUseCase.execute();\n };\n\n public askAndAnswerClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.ASK_AND_ANSWER_CLICKED, {\n ...payload,\n eventAction: ReviewsEventAction.ASK_AND_ANSWER\n });\n ratingsReviewsUseCase.execute();\n };\n\n public askAndAnswerSubmitted = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.ASK_AND_ANSWER_SUBMITTED, {\n ...payload,\n eventAction: ReviewsEventAction.ASK_AND_ANSWER_SUBMIT\n });\n ratingsReviewsUseCase.execute();\n };\n\n public askAndAnswerSearchClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(\n events.ASK_AND_ANSWER_SEARCH_CLICKED,\n {\n ...payload,\n eventAction: ReviewsEventAction.ASK_AND_ANSWER_SEARCH\n }\n );\n ratingsReviewsUseCase.execute();\n };\n\n public askAndAnswerHelpfulYesClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(\n events.ASK_AND_ANSWER_HELPFUL_YES_CLICKED,\n {\n ...payload,\n eventAction: ReviewsEventAction.ASK_AND_ANSWER_HELPFUL_YES\n }\n );\n ratingsReviewsUseCase.execute();\n };\n\n public askAndAnswerHelpfulNoClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(\n events.ASK_AND_ANSWER_HELPFUL_NO_CLICKED,\n {\n ...payload,\n eventAction: ReviewsEventAction.ASK_AND_ANSWER_HELPFUL_NO\n }\n );\n ratingsReviewsUseCase.execute();\n };\n\n public askAndAnswerShowMoreClicked = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(\n events.ASK_AND_ANSWER_SHOW_MORE_CLICKED,\n {\n ...payload,\n eventAction: ReviewsEventAction.ASK_AND_ANSWER_SHOW_MORE\n }\n );\n ratingsReviewsUseCase.execute();\n };\n\n public reviewsSortByChanged = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.REVIEWS_SORT_BY_CHANGED, {\n ...payload,\n eventAction: ReviewsEventAction.REVIEW_SORT\n });\n ratingsReviewsUseCase.execute();\n };\n\n public askAndAnswerSortByChanged = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(\n events.ASK_AND_ANSWERS_SORT_BY_CHANGED,\n {\n ...payload,\n eventAction: ReviewsEventAction.ASK_AND_ANSWER_SORT\n }\n );\n ratingsReviewsUseCase.execute();\n };\n\n public writeReviewStarted = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.WRITE_REVIEW_STARTED, {\n ...payload,\n eventAction: ReviewsEventAction.WRITE_REVIEW\n });\n ratingsReviewsUseCase.execute();\n };\n\n public reviewOverlayOpened = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.REVIEW_OVERLAY_OPENED, {\n ...payload,\n eventAction: ReviewsEventAction.REVIEW_OVERLAY_OPEN\n });\n ratingsReviewsUseCase.execute();\n };\n\n public reviewOverlayClosed = (payload: IReviewsParam) => {\n const ratingsReviewsUseCase = new RatingsReviewsUseCase(events.REVIEW_OVERLAY_CLOSED, {\n ...payload,\n eventAction: ReviewsEventAction.REVIEW_OVERLAY_CLOSE\n });\n ratingsReviewsUseCase.execute();\n };\n\n public smartGiftAdded = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_ADDED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_ADDED\n });\n smartGiftUseCase.execute();\n };\n\n public smartGiftViewed = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_VIEWED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_VIEWED\n });\n smartGiftUseCase.execute();\n };\n\n public smartGiftPrepared = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_PREPARED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_PREPARED\n });\n smartGiftUseCase.execute();\n };\n\n public smartGiftWidgetToggled = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_WIDGET_TOGGLED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_WIDGET_TOGGLED\n });\n smartGiftUseCase.execute();\n };\n\n public smartGiftRemoved = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_REMOVED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_REMOVED\n });\n smartGiftUseCase.execute();\n };\n\n public smartGiftCancelled = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_CANCELLED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_CANCELLED\n });\n smartGiftUseCase.execute();\n };\n\n public smartgiftHelpOpen = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_HELP_OPENED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_HELP_OPENED\n });\n smartGiftUseCase.execute();\n };\n\n public smartgiftHelpClosed = (payload: ISmartGiftParam) => {\n const smartGiftUseCase = new SmartGiftUseCase(events.SMARTGIFT_HELP_CLOSED, {\n ...payload,\n eventAction: SmartGiftEventAction.SMARTGIFT_HELP_CLOSED\n });\n smartGiftUseCase.execute();\n };\n\n public accountSidebarOverlayOpened = async () => {\n const accountSidebarOverlayOpenedUseCase = new AccountSidebarOverlayOpenedUseCase();\n accountSidebarOverlayOpenedUseCase.execute();\n };\n\n public accountSidebarMenuClicked = (payload: IAccountSidebarBaseData) => {\n const accountSidebarUseCase = new AccountSidebarMenuOptionClickedUseCase({\n ...payload,\n eventAction: AccountEventAction.ACCOUNT_SIDEBAR_MENU_CLICKED\n });\n accountSidebarUseCase.execute();\n };\n\n public accountSidebarLoyaltyClicked = (payload: IAccountSidebarBaseData) => {\n const accountSidebarUseCase = new AccountSidebarMenuOptionClickedUseCase({\n ...payload,\n eventAction: AccountEventAction.ACCOUNT_SIDEBAR_LOYALTY_CLICKED\n });\n accountSidebarUseCase.execute();\n };\n\n public accountSidebarShowcaseClicked = (payload: IAccountSidebarShowcaseData) => {\n const accountSidebarUseCase = new AccountSidebarShowcaseClickedUseCase({\n ...payload,\n eventAction: AccountEventAction.ACCOUNT_SIDEBAR_SHOWCASE_CLICKED\n });\n accountSidebarUseCase.execute();\n };\n\n public accountLoyaltyPointsInfoLinkClicked = (payload: IAccountSidebarBaseData) => {\n const accountLoyaltyPointsInfoCLickedUseCase = new AccountLoyaltyPointsInfoUseCase({\n ...payload,\n eventAction: AccountEventAction.ACCOUNT_LOYALTY_POINTS_INFO_LINK_CLICKED\n });\n accountLoyaltyPointsInfoCLickedUseCase.execute();\n };\n\n public accountNonLoyaltyEnrollmentSignupClicked = (payload: IAccountSidebarBaseData) => {\n const accountNonLoyaltyEnrollmentSignupUseCase = new AccountNonLoyaltyEnrollmentSignupUseCase(\n {\n ...payload,\n eventAction: AccountEventAction.ACCOUNT_NONLOYALTY_ENROLLMENT_SIGNUP_CLICKED\n }\n );\n accountNonLoyaltyEnrollmentSignupUseCase.execute();\n };\n\n public accountNonLoyaltyEnrollmentLinkClicked = (payload: IAccountSidebarBaseData) => {\n const accountNonLoyaltyEnrollmentLinkClickedUseCase = new AccountNonLoyaltyEnrollmentLinkUseCase(\n {\n ...payload,\n eventAction: AccountEventAction.ACCOUNT_NONLOYALTY_ENROLLMENT_LINK_CLICKED\n }\n );\n accountNonLoyaltyEnrollmentLinkClickedUseCase.execute();\n };\n\n public liveChatInterfaceClicked = (payload: IGenericAnalyticsData) => {\n const liveChatInterfaceClicked = new LiveChatInterfaceClickedUseCase(payload);\n liveChatInterfaceClicked.execute();\n };\n\n public socialShareIconTriggered = (payload: IGenericAnalyticsData) => {\n const socialShareIconTriggered = new SocialShareIconTriggeredUseCase(payload);\n socialShareIconTriggered.execute();\n };\n\n public skuPickerOpened = (payload: { productId: string }) => {\n const { productId } = payload;\n const skuPickerOpened = new SkuPickerInteractionUseCase(productId, ActionType.OPEN);\n skuPickerOpened.execute();\n };\n\n public skuPickerClosed = (payload: { productId: string }) => {\n const { productId } = payload;\n const skuPickerClosed = new SkuPickerInteractionUseCase(productId, ActionType.CLOSE);\n skuPickerClosed.execute();\n };\n\n public appointmentVirtualSelected = () => {\n const appointmentVirtualSelected = new AppointmentVirtualSelectedUseCase();\n void appointmentVirtualSelected.execute();\n };\n\n public appointmentLocationSelected = (payload: { storeName: string }) => {\n const { storeName } = payload;\n const appointmentLocationSelected = new AppointmentLocationSelectedUseCase(storeName);\n void appointmentLocationSelected.execute();\n };\n\n public appointmentServiceSelected = (payload: { serviceName: string[] }) => {\n const { serviceName } = payload;\n const appointmentServiceSelected = new AppointmentServiceSelectedUseCase(serviceName);\n void appointmentServiceSelected.execute();\n };\n\n public appointmentDateTimeSelected = (payload: { dateTime: string }) => {\n const { dateTime } = payload;\n const appointmentDateTimeSelected = new AppointmentDateTimeSelectedUseCase(dateTime);\n void appointmentDateTimeSelected.execute();\n };\n\n public appointmentEditClicked = () => {\n const appointmentEditClicked = new AppointmentEditClickedUseCase();\n void appointmentEditClicked.execute();\n };\n\n public appointmentStartedOver = () => {\n const appointmentStartedOver = new AppointmentStartedOverUseCase();\n void appointmentStartedOver.execute();\n };\n\n public appointmentArtistSelected = (payload: { artistName: string }) => {\n const { artistName } = payload;\n const appointmentArtistSelected = new AppointmentArtistSelectedUseCase(artistName);\n void appointmentArtistSelected.execute();\n };\n\n public appointmentStepLoaded = (payload: { step: string }) => {\n const { step } = payload;\n const appointmentStepLoaded = new AppointmentStepLoadedUseCase(step);\n void appointmentStepLoaded.execute();\n };\n\n public appointmentProcessCompleted = () => {\n const appointmentProcessCompleted = new AppointmentProcessCompletedUseCase();\n void appointmentProcessCompleted.execute();\n };\n\n public appointmentAddedToCalendar = () => {\n const appointmentAddedToCalendar = new AppointmentAddedToCalendarUseCase();\n void appointmentAddedToCalendar.execute();\n };\n\n public loyaltyLoadMoreLinkClicked = () => {\n const payload = LoyaltyEventAction.LOYALTY_LOADMORE_TEXT;\n const eventLoadAction = events.LOYALTY_LOADMORE_LINK_CLICKED;\n const loyaltyLoadMoreLinkUseCase = new LoyaltyPointsUseCase(payload, eventLoadAction);\n loyaltyLoadMoreLinkUseCase.execute();\n };\n\n public loyaltyOnlineOrderNumberClicked = (payload: string) => {\n const payloadData = payload?.replace('#', '').trim();\n const eventOnlineAction = events.LOYALTY_ONLINE_ORDER_NUMBER_CLICKED;\n const loyaltyActivityLinkUseCase = new LoyaltyPointsUseCase(payloadData, eventOnlineAction);\n loyaltyActivityLinkUseCase.execute();\n };\n\n public loyaltyShopNowClicked = (payload: string) => {\n const eventShopAction = events.LOYALTY_SHOP_NOW_CLICKED;\n const loyaltyActivityLinkUseCase = new LoyaltyBenefitsUseCase(payload, eventShopAction);\n loyaltyActivityLinkUseCase.execute();\n };\n\n public loyaltyAllBenefitsClicked = (payload: string) => {\n const eventAllBenefitsAction = events.LOYALTY_ALL_BENEFITS_CLICKED;\n const loyaltyAllBenefitsUseCase = new LoyaltyBenefitsUseCase(\n payload,\n eventAllBenefitsAction\n );\n loyaltyAllBenefitsUseCase.execute();\n };\n\n public loyaltyBenefitsRedeemClicked = (payload: string) => {\n const eventRedeemAction = events.LOYALTY_BENEFITS_REDEEM_CLICKED;\n const payloadData = `${LoyaltyEventAction.LOYALTY_OFFER_SELECTED} - ${payload}`;\n const loyaltyBenefitsRedeemUseCase = new LoyaltyBenefitsUseCase(\n payloadData,\n eventRedeemAction\n );\n loyaltyBenefitsRedeemUseCase.execute();\n };\n\n public loyaltyBenefitsRemoveClicked = (payload: string) => {\n const eventRemoveAction = events.LOYALTY_BENEFITS_REMOVE_CLICKED;\n const payloadData = `${LoyaltyEventAction.LOYALTY_OFFER_REMOVED} - ${payload}`;\n const loyaltyBenefitsRemoveUseCase = new LoyaltyBenefitsUseCase(\n payloadData,\n eventRemoveAction\n );\n loyaltyBenefitsRemoveUseCase.execute();\n };\n\n public loyaltyRewardsRedeemClicked = () => {\n const eventRedeemAction = events.LOYALTY_REWARDS_REDEEM_CLICKED;\n const payload = LoyaltyEventAction.LOYALTY_REWARD_SELECTED;\n const loyaltyRewardsRedeemUseCase = new LoyaltyRewardsUseCase(payload, eventRedeemAction);\n loyaltyRewardsRedeemUseCase.execute();\n };\n\n public loyaltyRewardsRemoveClicked = () => {\n const eventRemoveAction = events.LOYALTY_REWARDS_REMOVE_CLICKED;\n const payload = LoyaltyEventAction.LOYALTY_REWARD_REMOVED;\n const loyaltyRewardsRemoveUseCase = new LoyaltyRewardsUseCase(payload, eventRemoveAction);\n loyaltyRewardsRemoveUseCase.execute();\n };\n\n public loyaltyRewardsTabClicked = (payload: string) => {\n const eventTabAction = events.LOYALTY_REWARDS_TAB_CLICKED;\n const loyaltyRewardsTabUseCase = new LoyaltyRewardsUseCase(payload, eventTabAction);\n loyaltyRewardsTabUseCase.execute();\n };\n\n public appointmentReviewWidgetClick = (payload: { serviceName: string }) => {\n const { serviceName } = payload;\n const appointmentReviewWidgetClick = new AppointmentReviewWidgetClickUseCase(serviceName);\n appointmentReviewWidgetClick.execute();\n };\n\n public appointmentReviewPagination = (payload: { optionSelection: string }) => {\n const { optionSelection } = payload;\n const appointmentReviewPagination = new AppointmentReviewPaginationUseCase(optionSelection);\n appointmentReviewPagination.execute();\n };\n\n public appointmentReviewWidgetFilters = (payload: {\n location: string;\n sortBy: string;\n serviceName: string;\n }) => {\n const { location, sortBy, serviceName } = payload;\n const appointmentReviewWidgetFilters = new AppointmentReviewWidgetFiltersUseCase({\n location,\n sortBy,\n serviceName\n });\n appointmentReviewWidgetFilters.execute();\n };\n\n public appointmentAccountButtonClicked = (payload: { accountButtonLabel: string }) => {\n const { accountButtonLabel } = payload;\n const appointmentAccountButtonClicked = new AppointmentAccountButtonClickedUseCase(\n accountButtonLabel\n );\n appointmentAccountButtonClicked.execute();\n };\n\n public storeDeliveryTypeSelected = (payload: IStoreDeliveryMethodsData) => {\n const storeDeliveryTypeSelectedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_DELIVERY_TYPE_SELECTED\n );\n storeDeliveryTypeSelectedUseCase.execute();\n };\n\n public storeSearchAddressSubmited = (payload: IStoreDeliveryMethodsData) => {\n const storeSearchAddressSubmitedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_SEARCH_ADDRESS_SUBMITTED\n );\n storeSearchAddressSubmitedUseCase.execute();\n };\n\n public storeChangeLinkClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeChangeLinkClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_CHANGE_LINK_CLICKED\n );\n storeChangeLinkClickedUseCase.execute();\n };\n\n public storeSelected = (payload: IStoreDeliveryMethodsData) => {\n const storeSelectedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_SELECTED\n );\n storeSelectedUseCase.execute();\n };\n\n public storeOpeningHoursToggled = (payload: IStoreDeliveryMethodsData) => {\n const storeOpeningHoursToggledUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_OPENING_HOURS_TOGGLED\n );\n storeOpeningHoursToggledUseCase.execute();\n };\n\n public appointmentCallStoreClicked = (payload: { storeName: string }) => {\n const { storeName } = payload;\n const appointmentCallStoreClicked = new AppointmentCallStoreClickedUseCase(storeName);\n appointmentCallStoreClicked.execute();\n };\n\n public storeFilterToggled = (payload: IStoreDeliveryMethodsData) => {\n const storeFilterToggledUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_FILTER_TOGGLED\n );\n storeFilterToggledUseCase.execute();\n };\n\n public storeDirectoryLinkClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeDirectoryLinkClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_DIRECTORY_LINK_CLICKED\n );\n storeDirectoryLinkClickedUseCase.execute();\n };\n\n public storeDirectoryMapLinkClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeDirectoryMapLinkClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_DIRECTORY_MAP_LINK_CLICKED\n );\n storeDirectoryMapLinkClickedUseCase.execute();\n };\n\n public storeDirectoryStoreLinkClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeDirectoryStoreLinkClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_DIRECTORY_STORE_LINK_CLICKED\n );\n storeDirectoryStoreLinkClickedUseCase.execute();\n };\n\n public storeMapMarkerClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeMapMarkerClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_MAP_MARKER_CLICKED\n );\n storeMapMarkerClickedUseCase.execute();\n };\n\n public storeGetDirectionsLinkClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeGetDirectionsLinkClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_GET_DIRECTIONS_CLICKED\n );\n storeGetDirectionsLinkClickedUseCase.execute();\n };\n\n public storeDetailsLinkClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeDetailsLinkClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_DETAILS_LINK_CLICKED\n );\n storeDetailsLinkClickedUseCase.execute();\n };\n\n public storeBookAppointmentinkClicked = (payload: IStoreDeliveryMethodsData) => {\n const storeBookAppointmentinkClickedUseCase = new StoreDeliveryMethodsUseCase(\n payload,\n events.STORE_BOOK_APPOINTMENT_LINK_CLICKED\n );\n storeBookAppointmentinkClickedUseCase.execute();\n };\n}\n","export const CHECKOUT = 'checkout';\nexport const CART = 'cart';\nexport const LOGIN = 'login';\nexport const ACCOUNT_LANDING = 'accountLanding';\nexport const ORDER = 'order';\nexport const GUEST_ORDER = 'guestOrder';\nexport const SHIPPING = 'shipping';\nexport const PAYMENT = 'payment';\n","import { observable, action } from 'mobx';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport class ConfigStore {\n @observable public config: any;\n @observable\n public breakpoints: Theme.IBreakpoints = {\n desktop: 768,\n largeScreen: 1024,\n extraLargeScreen: 1200\n };\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 { IAppConfig } from '@estee/elc-universal-utils';\nimport { getDecorators, ServiceManager } from '@estee/elc-service';\nimport { Container } from 'hypo-container';\nimport { AnalyticsDriver } from './../internal/AnalyticsDriver';\nimport { EventSubmitter } from '../internal/EventSubmitter';\nimport { EventRepository } from '~repositories/EventRepository';\nimport { DataAggregator } from '../internal/DataAggregator';\nimport { ServiceBusController } from './ServiceBusController';\nimport serviceNames, { AnalyticsService } from './AnalyticsService';\nimport { ConfigStore } from './ConfigStore';\n\nexport const diContainer = new Container();\n\nexport const setConfig = (configJSON: IAppConfig) => {\n diContainer.config = configJSON;\n};\n\ndiContainer\n .register(\n serviceNames.configStore,\n diContainer.factory((c) => new ConfigStore(c.config))\n )\n .register(serviceNames.eventRepository, (c) => new EventRepository())\n .register(\n serviceNames.dataAggregator,\n (c) => new DataAggregator(c.get(serviceNames.eventRepository))\n )\n\n .register(serviceNames.serviceBusController, (c) => new ServiceBusController())\n .register(serviceNames.analyticsDriver, (c) => new AnalyticsDriver())\n .register(\n serviceNames.eventSubmitter,\n (c) =>\n new EventSubmitter(\n c.get(serviceNames.analyticsDriver),\n c.get(serviceNames.eventRepository)\n )\n )\n .register(\n serviceNames.analyticsService,\n (c) =>\n new AnalyticsService((config: IAppConfig) => {\n setConfig(config);\n\n c.get(serviceNames.dataAggregator);\n c.get(serviceNames.eventSubmitter);\n c.get(serviceNames.serviceBusController);\n })\n );\n\nexport const serviceStarter = ServiceManager.startService;\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":["AnalyticsDriver","isLoaded","trackEvent","data","cb","this","client","link","pageTrack","view","utagData","enable","observable","action","EventSubmitter","constructor","analyticsDriver","eventRepository","updateUtagData","payload","extend","Object","keys","forEach","key","payloadData","concat","product_impression_id","product_impression_position","map","pos","i","isQACookieSet","logEvent","tealiumEvents","sessionStorage","getItem","tealiumEventsFromSessionStorage","JSON","parse","push","setItem","stringify","transformPayload","trackEvents","hasEventsToSubmit","analyticsDriverLoaded","completeEvents","event","type","hasIncompleteDataEvents","hasIncompleteViewEvents","sendEvent","removeEventFromQueue","id","autorun","EventRepository","events","idCounter","generateId","Math","floor","random","prependEventToQueue","unshift","addEventToQueue","filter","markEventAsComplete","missingInfos","index","findIndex","e","markedEvent","addPayload","isComplete","incompleteEvents","incompleteViewEvents","incompleteLinkEvents","incompleteDataEvents","length","hasIncompleteEvents","hasIncompleteLinkEvents","computed","getProductSkuMap","product","skuData","sku","skus","productDetails","newSku","skuId","mapProductSkusById","skusData","reduce","DataAggregator","saturateIncompleteEvents","isExecuting","markEventAsExecuting","checkForMissingInformation","collectionsInfo","Promise","all","collection","cartProduct","getCartProductInfo","cartProducts","getCartProductsInfo","getProductInfo","productImpressions","getProductImpresionsInfo","productShort","getShortProductInfo","collectionInfoPayload","currentCollection","productViewedPayload","productId","productInfo","skuInfo","skuIdMap","query","serviceQueries","filterBy","skuIds","productIds","product_base_id","product_category","defaultCategory","product_id","toString","product_name","displayName","product_price","prices","includeTax","price","product_product_code","productCode","product_shade","shades","name","product_short_desc","shortDescription","product_size","sizes","label","value","product_sku","perlgem","SKU_BASE_ID","product_sku_large_image_url","media","large","src","product_sku_small_image_url","small","product_url","productUrl","url","cartProductPayload","cartProductsPayload","productsInfo","cartItems","indexOf","acc","next","cart_product_category","cart_product_id","cart_product_name","cart_product_price","cart_product_shade","cart_product_size","cart_product_sku","cart_product_url","cart_product_is_preorder","cart_product_quantity","cart_product_discount_amount","cart","cartItemsQuantity","assign","quantity","cartItemsDiscounts","discountsPercent","appliedPriceWithoutTax","toFixed","display_name","shade","size","product_date","productPayload","populateProductInfo","short_description","productIdString","skuBaseId","productImpressionsPayload","filteredItemsList","products","productTags","skuIdList","slice","productIdList","productTagsList","tagList","isNaN","Number","ids","productList","tags","includeInnerHits","sortBy","productDisplayOrder","includes","impressionsInfo","product_impression_base_id","product_impression_name","product_impression_shade","product_impression_size","product_impression_price","product_impression_sku_large_image_url","product_impression_sku_small_image_url","product_impression_url","product_impression_short_desc","product_impression_sku","product_impression_product_code","product_impression_category","product_impression_list","product_impression_was_price","item","$mobx","listOverride","originalPrice","reaction","Event","markEventAsCompleted","missingInfo","AccountPageLandedUseCase","execute","newEvent","diContainer","get","AccountLoyaltyPointsInfoUseCase","accountLoyaltyPointsInfoData","eventAction","getAccountLoyaltyPointsInfoPayload","event_name","event_category","event_action","event_label","site_type","AccountNonLoyaltyEnrollmentLinkUseCase","accountNonLoyaltyEnrollmentData","getAccountNonLoyaltyEnrollmentSignupPayload","promo_pos","promo_creative","promo_name","promo_id","AccountNonLoyaltyEnrollmentSignupUseCase","imp_promo_pos","imp_promo_creative","imp_promo_name","imp_promo_id","CartLandingPageViewedUseCase","active_checkout_panel","CartLoggedInUseCase","ProductImpressionsUseCase","event_noninteraction","ProductViewedUseCase","enh_action","CreateAccountAttemptUseCase","CreateAccountFailUseCase","error","createAccountFailPayload","ItemAddedUseCase","Add_to_Bag_Module","ManualOfferCodeAppliedUseCase","manualOffer","isOfferFailed","message","offerCodePayload","offerCode","FILTER_METHODS","MppFilteredUseCase","method","category","option","filters","replace","filterMppPayload","OrderConfirmationPageLandedUseCase","order","items","orderConfirmationPayload","order_currency_code","currency","isoCode","order_discount_amount","totals","totalDiscounts","order_grand_total","totalWithTax","order_id","order_merchandise_total","subTotalWithTax","order_payment_type","paymentMethods","order_shipping_amount","shippingInfo","priceWithTax","order_subtotal","order_tax_amount","tax","order_total_product_units","order_type","orderType","orders_compare","orders_total","category_id","category_name","page_name","page_type","page_site_area","page_template","PaymentMethodCompletedUseCase","serviceCommands","PaymentPageViewedUseCase","PRODUCT_CLICKED","ProductClickedUseCase","skudId","pageType","positionIndex","productClickedPayload","product_position","product_list","QuickViewUseCase","quickViewPayload","productShortPayload","RemoveItemUseCase","SampleAddedUseCase","SearchAddressSubmittedUseCase","address","searchAddressSubmittedPayload","ShippingAddressFilledUseCase","getLocation","pathName","configStore","config","routes","checkout","settings","shippingAddressFilled","ShippingOptionSelectedUseCase","ShippingPageViewedUseCase","StoreLocationSelectedUseCase","storeId","storeLocationSelectedPayload","StoreLocatorClickedUseCase","storeName","eventLabel","storeLocatorClickedPayload","StoreMarkerClickedUseCase","storeMarkerClickedPayload","StoreTownSelectedUseCase","town","storeTownSelectedPayload","SubscribedForEmailsUseCase","TransactionFailedUseCase","orderQueryData","totalCountOfOrders","orderQuery","event_info","transactionFailedPayload","paymentType","orders_count","SkuEngraving","TransactionSuccededUseCase","orderNumber","transactionSuccededPayload","AnalyticsLoadedUseCase","SkuEngravingUseCase","engravingData","getEngravingEvent","EVENT_ACTION","EVENT_CATEGORY","EVENT_LABEL","EVENT_NAME","EVENT_NONINTERACTION","engravingPayload","GRID_ACTIONS","GridFilteredUseCase","appliedFilters","previousValue","filterGridPayload","GridSortedUseCase","appliedSort","sort","sortGridPayload","sortEvent","ShadeGroupSelectedUseCase","shadeGroupKey","eventName","ShadeChangeViewedUseCase","shadeChangeActionPayload","LiveChatInterfaceClickedUseCase","liveChatData","getLiveChatPayload","ProductComparisonViewedUseCase","join","SocialShareIconTriggeredUseCase","socialShareData","getSocialSharePayload","ActionType","StoreBookVirtualAppointmentClickedUseCase","isVirtual","storeLocatorBookVirtualAppointmentClickedPayload","eventRepostiory","SkuPickerInteractionUseCase","OPEN","getSkuPickerPayload","AccountEventAction","AccountSidebarOverlayOpenedUseCase","AccountSidebarMenuOptionClickedUseCase","accountSidebarData","getAccountSidebarPayload","AccountSidebarShowcaseClickedUseCase","item_title","AppointmentVirtualSelectedUseCase","AppointmentServiceSelectedUseCase","serviceName","appointmentServiceSelectedPayload","AppointmentDateTimeSelectedUseCase","dateTime","appointmentDateTimeSelectedPayload","AppointmentEditClickedUseCase","AppointmentStartedOverUseCase","AppointmentArtistSelectedUseCase","artistName","appointmentArtistSelectedPayload","AppointmentStepLoadedUseCase","step","appointmentStepPayload","page_url","location","origin","AppointmentProcessCompletedUseCase","appointmentProcessCompletedPayload","window","AppointmentAddedToCalendarUseCase","AppointmentAccountButtonClickedUseCase","accountButtonLabel","appointmentAccountButtonClickedPayload","AppointmentCallStoreClickedUseCase","SearchProductsQueriedUseCase","searchTerm","searchType","searchProductsQueriedPayload","search_keyword","search_type","search_results","site_search_results_found","Number_of_On_Site_Searches","attraqt_responseId","sourceId","SearchTermSelectedUseCase","searchTermSelectedPayload","VTOActionUseCase","vtoAction","vtoActionPayload","eventValue","event_value","modiface_evar","vendor","vto_type","vtoType","vtoItemId","vto_item_id","vtoLookIndex","vto_look_index","vtoLookId","vto_look_id","vtoBrowGoals","vto_brow_goals","vtoBrowShape","vto_brow_shape","vtoBrowSkuId","vto_brow_sku_id","vtoBrowLength","vto_brow_length","vtoBrowThickness","vto_brow_thickness","vtoBrowOpacity","vto_brow_opacity","ProductNotifyMeTriggeredUseCase","productNotifyMeTriggeredPayload","ProductNotifyMeRequestCompletedUseCase","productNotifyMeRequestCompletedPayload","RatingsReviewsUseCase","reviewsData","getRatingsReviewsPayload","reviewCategory","selectedValue","ReviewsEventAction","SmartGiftEventAction","VTO_EVENTS","SmartGiftUseCase","smartGiftData","getSmartGiftPayload","debounceTimeout","allPayloads","mergeOfferCodePayload","OfferViewed","placement","promotionId","promotionName","_promotionName","_promotionId","clearTimeout","setTimeout","eventsToMerge","splice","OfferClicked","offerCodeFailedPayload","eventActionMap","offers","CartTabTabClicked","tabId","_tabId","_event","CartOverlayClosed","props","nonInteraction","CartOverlayOpened","LoyaltyEventAction","AppointmentLocationSelectedUseCase","appointmentLocationSelectedPayload","PageViewUseCase","LoyaltyPointsUseCase","loyaltyActivityData","loyaltyPointsEventData","getLoyaltyPointsHistoryPayload","LOYALTY_EVENT_PAGE","LOYALTY_POINTS_TEXT","LoyaltyBenefitsUseCase","loyaltyPayloadData","loyaltyBenefitsEventData","getAccountLoyaltyBenefitsInfoPayload","LOYALTY_BENEFITS_TEXT","LoyaltyRewardsUseCase","loyaltyRewardsEventData","getAccountLoyaltyRewardsInfoPayload","LOYALTY_REWARDS_TEXT","SearchFiltersSelectedUsecase","searchFilterPayload","filterCategory","filterLabel","attraqt_facet_id","facetId","responseId","attraqt_facet_name","AppointmentReviewWidgetClickUseCase","appointmentReviewWidgetClickPayload","AppointmentReviewPaginationUseCase","optionSelection","appointmentReviewViewPayload","AppointmentReviewWidgetFiltersUseCase","appointmentReviewWidgetFiltersPayload","StoreDeliveryMethodsUseCase","storeDeliveryMethodsData","eventCategory","ServiceBusController","analyticsLoaded","pageViewed","productViewedUseCase","shadeChangeViewedUseCase","productImpressionUseCase","storeDetailsClicked","getDirectionsClicked","storeInfoClicked","storeMarkerClicked","storePhoneClicked","bookAppointmentClicked","bookVirtualAppointmentClicked","storeLocationSelected","storeTownSelected","searchAddressSubmitted","trackOrderDetails","createAccountAttempt","removeItem","createAccountFail","applyOfferCode","offerCodeFailed","productClicked","productNotifyMeTriggered","productNotifyMeRequestSuccess","productNotifyMeRequestFailure","itemAdded","sampleAdded","shippingOptionSelected","cartLoggedIn","context","paymentMethodCompleted","orderConfirmationPageLanded","orderConfirmationPageLandedUseCase","subscribedForEvents","cartPageView","cartLandingPageViewedUseCase","transactionFailed","transactionSucceded","filterMpp","filterGrid","sortGrid","sortFilteredUseCase","quickViewSelected","quickViewSelectedUseCase","productClickedUseCase","cartOverlayClosed","cartOverlayOpened","cartTabClicked","cartOverlayOfferClicked","cartOverlayOfferViewed","shadeGroupSelected","productComparisonViewed","searchProductsQueried","searchTermSelected","searchFiltersSelected","navigatedToPageView","currentRoute","vtoCameraClosed","CAMERA_CLOSED","vtoCameraFailed","CAMERA_FAILED","vtoCameraOpened","CAMERA_OPENED","vtoCompare","COMPARE","vtoCompareDisabled","COMPARE_DISABLED","vtoClosed","CLOSED","vtoEnabled","CTA","vtoEngineClosed","ENGINE_CLOSED","vtoFoundationQrCodeOverlayClosed","FOUNDATION_QR_CODE_OVERLAY_CLOSED","vtoFoundationQrCodeOverlayOpened","FOUNDATION_QR_CODE_OVERLAY_OPENED","vtoLoaded","LOADED","vtoLoading","LOADING","vtoKissDetected","KISS_DETECTED","vtoOpened","OPENED","vtoPairShadeGridOpened","PAIR_SHADE_GRID_OPENED","vtoPairShadeSelected","PAIR_SHADE_SELECTED","vtoPhotoLoaded","PHOTO_LOADED","vtoPhotoSaved","PHOTO_SAVED","vtoPriceSuppressed","PRICE_SUPPRESSED","vtoReset","RESET","vtoVideoLoaded","VIDEO_LOADED","vtoViewAllShades","ALL_SHADES_VIEWED","vtoViewBestShades","BEST_SHADES_VIEWED","vtoShadeFinderStarted","SHADE_FINDER_STARTED","vtoShadeFinderCompleted","SHADE_FINDER_COMPLETED","vtoShadeFinderCancelled","SHADE_FINDER_CANCELLED","vtoSkinShadeFound","SKIN_SHADE_FOUND","vtoSplitFourWay","SPLIT_FOUR_WAY","vtoSplitFourWayDisabled","SPLIT_FOUR_WAY_DISABLED","vtoShadeReminderOverlayOpened","SHADE_REMINDER_OVERLAY_OPENED","vtoShadeReminderOverlayClosed","SHADE_REMINDER_OVERLAY_CLOSED","vtoShadeReminderOverlayRetained","SHADE_REMINDER_OVERLAY_KEEP","vtoShadeReminderRetaken","SHADE_REMINDER_OVERLAY_RETAKE","vtoZoom","ZOOM","vtoMatchSaved","MATCH_SAVED","vtoMatchRemoved","MATCH_REMOVED","vtoMatchPersonalized","MATCH_PERSONALIZED","vtoSkinCareOpened","vtoSkinCareCameraOpened","vtoSkinCareCameraFailed","vtoSkinCareCameraClosed","vtoSkinCareLoading","vtoSkinCareLoaded","vtoSkinCareVideoLoaded","vtoSkinCareAnalysisStarted","SKIN_ANALYSIS_STARTED","vtoSkinCareAnalysisFinished","SKIN_ANALYSIS_FINISHED","vtoSkinCareBackToDetecting","SKIN_BACK_TO_DETECTING","vtoSkinCareClosed","vtoSkinCareProductsLoaded","SHOPPABLE_PRODUCTS_LOADED","NON_SHOPPABLE_PRODUCTS_LOADED","isShoppable","vtoSurveyIgnored","SURVEY_IGNORED","vtoSurveyLoaded","SURVEY_LOADED","vtoSurveySubmitted","SURVEY_SUBMITTED","vtoTutorialStarted","TUTORIAL_STARTED","vtoTutorialUnmuted","TUTORIAL_UNMUTED","vtoTutorialMuted","TUTORIAL_MUTED","vtoTutorialPaused","TUTORIAL_PAUSED","vtoTutorialStopped","TUTORIAL_STOPPED","vtoTutorialResumed","TUTORIAL_RESUMED","vtoTutorialPlaySpeedUpdated","TUTORIAL_PLAY_SPEED_UPDATED","vtoTutorialPreviousStep","TUTORIAL_PREVIOUS_STEP","vtoTutorialNextStep","TUTORIAL_NEXT_STEP","vtoLookSelected","TUTORIAL_LOOK_SELECTED","vtoProductListClicked","TUTORIAL_PRODUCT_LIST_CLICKED","vtoProductsUsedItemClicked","TUTORIAL_PRODUCTS_USED_ITEM_CLICKED","vtoFaceAttributePredictionStarted","BROW_FACE_ATTRIBUTE_PREDICTION_STARTED","vtoFaceAttributeUpdated","BROW_FACE_ATTRIBUTE_UPDATED","vtoBrowGoalSelected","BROW_GOAL_SELECTED","vtoTipsClicked","BROW_TIPS_CLICKED","vtoBackToGoalsClicked","BROW_BACK_TO_GOALS_CLICKED","vtoShapeChanged","BROW_SHAPE_CHANGED","vtoBrowShadeTryOn","BROW_SHADE_TRY_ON","vtoLengthChanged","BROW_LENGTH_CHANGED","vtoThicknessChanged","BROW_THICKNESS_CHANGED","vtoOpacityChanged","BROW_OPACITY_CHANGED","vtoGoldenRatioEnabled","BROW_GOLDEN_RATION_ENABLED","vtoGoldenRatioDisabled","BROW_GOLDEN_RATION_DISABLED","vtoStencilEnabled","BROW_STENCIL_ENABLED","vtoStencilDisabled","BROW_STENCIL_DISABLED","vtoCompareEnabled","BROW_COMPARE_ENABLED","vtoCaptureClicked","BROW_CAPTURE_CLICKED","vtoSeeAllShadesClicked","BROW_SEE_ALL_SHADES_CLICKED","vtoGetBrowClicked","BROW_GET_BROW_CLICKED","engravingTriggered","writeReviewEventTriggered","WRITE_REVIEW","readReviewsEventTriggered","READ_REVIEW","reviewsHelpfulYesClicked","HELPFUL_YES","reviewsHelpfulNoClicked","HELPFUL_NO","reviewsFlagReviewClicked","FLAG_REVIEW","reviewsFilterClicked","REVIEWS_FILTER","reviewsSearchClicked","REVIEWS_SEARCH","askAndAnswerClicked","ASK_AND_ANSWER","askAndAnswerSubmitted","ASK_AND_ANSWER_SUBMIT","askAndAnswerSearchClicked","ASK_AND_ANSWER_SEARCH","askAndAnswerHelpfulYesClicked","ASK_AND_ANSWER_HELPFUL_YES","askAndAnswerHelpfulNoClicked","ASK_AND_ANSWER_HELPFUL_NO","askAndAnswerShowMoreClicked","ASK_AND_ANSWER_SHOW_MORE","reviewsSortByChanged","REVIEW_SORT","askAndAnswerSortByChanged","ASK_AND_ANSWER_SORT","writeReviewStarted","reviewOverlayOpened","REVIEW_OVERLAY_OPEN","reviewOverlayClosed","REVIEW_OVERLAY_CLOSE","smartGiftAdded","SMARTGIFT_ADDED","smartGiftViewed","SMARTGIFT_VIEWED","smartGiftPrepared","SMARTGIFT_PREPARED","smartGiftWidgetToggled","SMARTGIFT_WIDGET_TOGGLED","smartGiftRemoved","SMARTGIFT_REMOVED","smartGiftCancelled","SMARTGIFT_CANCELLED","smartgiftHelpOpen","SMARTGIFT_HELP_OPENED","smartgiftHelpClosed","SMARTGIFT_HELP_CLOSED","accountSidebarOverlayOpened","accountSidebarMenuClicked","ACCOUNT_SIDEBAR_MENU_CLICKED","accountSidebarLoyaltyClicked","ACCOUNT_SIDEBAR_LOYALTY_CLICKED","accountSidebarShowcaseClicked","ACCOUNT_SIDEBAR_SHOWCASE_CLICKED","accountLoyaltyPointsInfoLinkClicked","ACCOUNT_LOYALTY_POINTS_INFO_LINK_CLICKED","accountNonLoyaltyEnrollmentSignupClicked","ACCOUNT_NONLOYALTY_ENROLLMENT_SIGNUP_CLICKED","accountNonLoyaltyEnrollmentLinkClicked","ACCOUNT_NONLOYALTY_ENROLLMENT_LINK_CLICKED","liveChatInterfaceClicked","socialShareIconTriggered","skuPickerOpened","skuPickerClosed","CLOSE","appointmentVirtualSelected","appointmentLocationSelected","appointmentServiceSelected","appointmentDateTimeSelected","appointmentEditClicked","appointmentStartedOver","appointmentArtistSelected","appointmentStepLoaded","appointmentProcessCompleted","appointmentAddedToCalendar","loyaltyLoadMoreLinkClicked","LOYALTY_LOADMORE_TEXT","eventLoadAction","loyaltyOnlineOrderNumberClicked","trim","eventOnlineAction","loyaltyShopNowClicked","eventShopAction","loyaltyAllBenefitsClicked","eventAllBenefitsAction","loyaltyBenefitsRedeemClicked","eventRedeemAction","LOYALTY_OFFER_SELECTED","loyaltyBenefitsRemoveClicked","eventRemoveAction","LOYALTY_OFFER_REMOVED","loyaltyRewardsRedeemClicked","LOYALTY_REWARD_SELECTED","loyaltyRewardsRemoveClicked","LOYALTY_REWARD_REMOVED","loyaltyRewardsTabClicked","eventTabAction","appointmentReviewWidgetClick","appointmentReviewPagination","appointmentReviewWidgetFilters","appointmentAccountButtonClicked","storeDeliveryTypeSelected","storeSearchAddressSubmited","storeChangeLinkClicked","storeSelected","storeOpeningHoursToggled","appointmentCallStoreClicked","storeFilterToggled","storeDirectoryLinkClicked","storeDirectoryMapLinkClicked","storeDirectoryStoreLinkClicked","storeMapMarkerClicked","storeGetDirectionsLinkClicked","storeDetailsLinkClicked","storeBookAppointmentinkClicked","ConfigStore","breakpoints","desktop","largeScreen","extraLargeScreen","updateConfig","Container","setConfig","configJSON","register","factory","c","AnalyticsService","serviceStarter","ServiceManager","lazyInject","container","target","descriptor","resourceName","sbGetter","resource","Error","propertyDescriptor","defineProperty"],"sourceRoot":""}