{"version":3,"file":"EinsteinTracking.js","names":["EinsteinTracking","a","setters","Component","default","deepMerge","Event","appendUrl","ajax","execute","constructor","element","options","arguments","length","activityURL","bindEvents","on","onEvent","eventName","data","eventType","ecommerce","add","triggerActivity","activityName","products","map","product","ID","id","quantity","price","forEach","recommenderName","detail","click","filter","pid","eventData","encodeURIComponent","JSON","stringify","url","navigator","sendBeacon","method","destroy","removeListener"],"sources":["components/global/EinsteinTracking.js"],"sourcesContent":["import Component from 'core/Component';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { Event } from 'services/EventEmitter';\nimport { appendUrl } from 'toolbox/queryString';\nimport { ajax } from 'toolbox/ajax';\n\n/**\n * This is a description of the EinsteinTracking constructor function.\n * @class\n * @classdesc This component contains all the activities tracking related to Einstein API.\n * This component is only injected in the storefront when the Einstein API Recommendations Provider is enabled.\n * @extends Component\n */\nexport default class EinsteinTracking extends Component {\n /**\n * Constructor of the class that mainly merge the options of the components\n * @param {HTMLElement} element HTMLElement of the component\n * @param {Object} options options that belongs to the component\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n // This is URL to call to register an activity\n activityURL: undefined,\n }, options));\n }\n\n /**\n * Should contain only event listeners and nothing else\n * All the event handlers should be into a separated function. No usage of anonyous function\n */\n bindEvents() {\n Event.on('analytics.event', this.onEvent, this);\n }\n\n /**\n * Handler called when sending basic events\n * @param { String } eventName - of the event\n * @param { Object } data - Data that needs to be passed in the event\n */\n onEvent(eventName, data = {}) {\n if (typeof eventName === 'object') {\n // if first argument is an object then we don't pass the eventName and use the default\n // The first param become the data object\n data = eventName;\n }\n\n switch (data.eventType) {\n case 'addProduct':\n if (!data.ecommerce || !data.ecommerce.add) {\n break;\n }\n\n this.triggerActivity({\n activityName: 'addToCart',\n data: {\n products: data.ecommerce.add.products.map(product => ({\n ID: product.id,\n quantity: product.quantity,\n price: product.price,\n })),\n },\n });\n break;\n case 'productImpression':\n data.product.forEach((product) => {\n const { recommenderName } = product;\n\n if (recommenderName) {\n this.triggerActivity({\n activityName: 'viewRecommendation',\n data: {\n recommenderName,\n products: [{ ID: product.id }],\n },\n });\n }\n });\n break;\n case 'productDetail':\n data.ecommerce.detail.products.forEach((product) => {\n this.triggerActivity({\n activityName: 'viewProduct',\n data: {\n product: {\n ID: product.id,\n },\n },\n });\n });\n break;\n case 'productClick':\n // Only register clicks on recommendations tiles, meaning that the recommenderName is provided on the product object\n // Skip the others\n data.ecommerce.click.products\n .filter(product => typeof product.recommenderName !== 'undefined' && product.recommenderName !== '')\n .forEach((product) => {\n this.triggerActivity({\n activityName: 'clickRecommendation',\n data: {\n recommenderName: product.recommenderName,\n product: {\n ID: product.pid,\n },\n },\n });\n });\n break;\n default:\n // Other event types are not supported by the Einstein API\n break;\n }\n }\n\n /**\n * Trigger the activity event if the activity URL is provided as option\n *\n * @param {Object} eventData The data to pass to the event\n */\n triggerActivity(eventData) {\n const activityURL = this.options.activityURL || undefined;\n if (!activityURL) {\n return;\n }\n\n eventData.data = encodeURIComponent(JSON.stringify(eventData.data));\n const url = appendUrl(activityURL, eventData);\n\n if (navigator.sendBeacon) {\n navigator.sendBeacon(url);\n } else {\n ajax(url, { method: 'POST' });\n }\n }\n\n /**\n * Destroy is called automatically after the component is being removed from the DOM\n * You must always destroy the listeners attached to an element to avoid any memory leaks\n */\n destroy() {\n Event.removeListener('analytics.event', this.onEvent, this);\n }\n}\n"],"mappings":"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","ignoreList":[]}