{"version":3,"file":"DsfServicesButton.js","names":["DsfServicesButton","a","setters","deepMerge","mix","Component","default","AnalyticsMixin","on","off","Event","ajax","stringify","getCSRF","execute","with","constructor","element","options","arguments","length","scriptUrl","updateCartUrl","changePrescriptionUrl","tagName","tenant","application","customer","country","environment","range","touchpoint","type","loadingBg","loadingMsg","switchEcom","switchAutostart","vtoType","vtoCategory","vtoUPCList","vtoSelectedUPC","vtoSelectedLook","vtoSelectedMakeupCategory","scriptId","displayAnalytics","recordUrl","dsfEventMapping","initCache","selectors","document","querySelector","bindEvents","onClick","bind","afterInit","autoStart","setTimeout","click","sendAnalytics","isDSFInitialized","window","dsfDropper","initializeDSF","createElement","body","appendChild","setApplicationAttributes","bindApplicationEvents","dsfDropperLoaded","openDsfService","dsfApp","addEventListener","onPrescriptionChanged","onFirstUserShadeSelected","onResultPageLoaded","getElementById","dropperScript","setAttribute","onload","onScriptLoadSuccess","head","onUpdateCart","event","Promise","reject","parameters","location","detail","quantity","parseInt","products","forEach","pid","idx","method","headers","\"Content-Type\"","then","response","addedToCart","catch","item","steps","step","product","indexOf","data","EAN","push","join","resolve","eventID","service_name","sendEventRequest","Error","requestBody","JSON","recordEventID","csrf","name","token","forceOpening","target","currentTarget","analytics","getAnalyticsAttributeData","attributes","removeAttribute","dsfUpdateMinicart","emit","showMiniCart","destroy"],"sources":["components/global/DsfServicesButton.js"],"sourcesContent":["import { deepMerge } from 'toolbox/deepMerge';\nimport { mix } from 'core/mixwith';\nimport Component from 'core/Component';\nimport AnalyticsMixin from 'mixins/Analytics';\nimport { on, off } from 'toolbox/event';\nimport { Event } from 'services/EventEmitter';\nimport { ajax } from 'toolbox/ajax';\nimport { stringify } from 'toolbox/queryString';\nimport { getCSRF } from 'toolbox/csrf';\n\n/**\n * This is a description of the DsfServicesButton constructor function.\n * @class\n * @classdesc This is a description of the DsfServicesButton class. (must be edited)\n * @extends Component\n */\nexport default class DsfServicesButton extends mix(Component).with(AnalyticsMixin) {\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 scriptUrl: 'https://dsf-cdn.loreal.io/dropper.js',\n updateCartUrl: null, // add to cart url\n changePrescriptionUrl: null, // change prescription url\n tagName: 'dsf-app',\n tenant: 'lorealsa', // The tenant on the Firecamp CMS (possible values: lorealsa, modiface)\n application: 'haircarediag', // The Service you want to run (possible values: shadefinder, haircarediag, skindrv2, spotscan2, nailstudio)\n customer: null, // The account name of L'Oréal DSF Firecamp back-office. (possible values: keratase, lorealparis)\n country: null, // The localization country code in ISO3 format\n environment: 'dev', // The environment of the Service you want to start (possible values: dev, staging, production)\n range: null, // The range code\n touchpoint: 'web', // Technical value to provided by DSF (possible values: web, pos)\n type: 'std', // Technical value to provided by DSF (possible values: std, canary)\n loadingBg: '#000', // Background color during first stage loading (optional)\n loadingMsg: 'loading', // Message to be display during first stage loading (optional)\n switchEcom: true, // Set to false to disable price & CTA on product tiles (optional)\n switchAutostart: false, // Force the Service to start immediately even if a CTA button is expect (optional)\n vtoType: null, // VTO experience (\"sp\" - Single Product, \"mp\" - Multi Product)\n vtoCategory: null, // VTO service category (nails, makeup or hair),\n vtoUPCList: null, // list of product UPCs you want to load in the VTO experience\n vtoSelectedUPC: null, // preselected UPC at the launch of the VTO experience\n vtoSelectedLook: null, // preselected Look at the launch of the VTO experience\n vtoSelectedMakeupCategory: null, // preselected Category at the launch of the VTO experience\n scriptId: 'dsf', // DSF SDK script id\n displayAnalytics: null, // display analytics\n recordUrl: null, // URL for recording DDXL events activity\n dsfEventMapping: {}, // Mapping between DSF services and DDXL events\n }, options));\n }\n\n /**\n * All selectors must be cached. Never cache elements that are out of the component scope\n */\n initCache() {\n this.selectors.application = document.querySelector(this.options.tagName);\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 on('click', this.element, this.onClick.bind(this));\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n if (this.options.autoStart) {\n setTimeout(() => {\n this.element.click();\n }, 1000);\n }\n\n if (this.options.displayAnalytics) {\n this.sendAnalytics(this.options.displayAnalytics);\n }\n }\n\n /**\n * Check if DSF initialized\n * @return {Boolean} true, if DSF already initialized\n */\n isDSFInitialized() {\n return !!window.dsfDropper && !!this.selectors.application;\n }\n\n /**\n * Initialize DSF\n */\n initializeDSF() {\n let element = this.selectors.application;\n\n if (!element) {\n element = document.createElement(this.options.tagName);\n document.body.appendChild(element);\n this.selectors.application = element;\n }\n\n this.setApplicationAttributes();\n this.bindApplicationEvents();\n\n if (!window.dsfDropper) {\n window.dsfDropperLoaded = () => {\n window.dsfDropper.openDsfService(this.options.application);\n window.dsfApp.addEventListener('onPrescriptionChanged', this.onPrescriptionChanged.bind(this));\n window.dsfApp.addEventListener('onFirstUserShadeSelected', this.onFirstUserShadeSelected.bind(this));\n window.dsfApp.addEventListener('onResultPageLoaded', this.onResultPageLoaded.bind(this));\n };\n }\n\n if (!document.getElementById(this.options.scriptId)) {\n const dropperScript = document.createElement('script');\n dropperScript.setAttribute('id', this.options.scriptId);\n dropperScript.setAttribute('src', this.options.scriptUrl);\n dropperScript.setAttribute('type', 'application/javascript');\n dropperScript.setAttribute('auto-run', 'false');\n dropperScript.onload = this.onScriptLoadSuccess.bind(this);\n document.head.appendChild(dropperScript);\n } else {\n // script already loaded by other service, need to open DSF service\n window.dsfDropper.openDsfService(this.options.application);\n }\n }\n\n /**\n * Bind DSF events\n */\n bindApplicationEvents() {\n if (!this.selectors.application) {\n return;\n }\n\n this.selectors.application.addEventListener('addToCart', this.onUpdateCart.bind(this));\n }\n\n /**\n * Add to cart event handler\n * @param {Object} event event payload\n * @returns {Promise} response promise\n */\n onUpdateCart(event) {\n if (!this.options.updateCartUrl) {\n return Promise.reject();\n }\n\n const parameters = {};\n let location = null;\n\n if (event.detail) {\n const quantity = event.detail.quantity === undefined ? 1 : parseInt(event.detail.quantity, 10);\n\n if (event.detail.location) {\n ({ location } = event.detail);\n }\n\n if (event.detail.products) {\n event.detail.products.forEach((pid, idx) => {\n parameters[`pid_${idx}`] = pid;\n parameters[`qty_${idx}`] = quantity;\n });\n }\n }\n\n if (location) {\n parameters.location = location;\n }\n\n return ajax(this.options.updateCartUrl, {\n method: 'POST',\n body: stringify(parameters),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n }).then((response) => {\n let products = [];\n\n // get added products from response\n products = (response && response.products) || [];\n // trigger DSF service addedToCart action\n this.selectors.application.addedToCart(products);\n }).catch(() => {\n this.selectors.application.addedToCart([]);\n });\n }\n\n\n /**\n * Prescription changed event handler\n * @param {Object} event event payload\n * @returns {Promise} response promise\n */\n onPrescriptionChanged(event) {\n if (!this.options.changePrescriptionUrl) {\n return Promise.reject();\n }\n\n const products = [];\n event.detail.forEach((item) => {\n item.steps.forEach((step) => {\n step.products.forEach((product) => {\n if (products.indexOf(product.data.EAN) === -1) {\n products.push(product.data.EAN);\n }\n });\n });\n });\n\n if (products.length) {\n return ajax(this.options.changePrescriptionUrl, {\n method: 'POST',\n body: stringify({\n products: products.join(','),\n application: this.options.application,\n }),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Sends a request to record the event of the first user shade selection.\n * @param {Object} event event payload\n * @returns {void}\n */\n onFirstUserShadeSelected(event) {\n const eventID = this.options.dsfEventMapping[event.detail.service_name];\n this.sendEventRequest(this.options.recordUrl, eventID);\n }\n\n /**\n * Sends a request to record the event when the results page is loaded.\n * This applies to services such as Hair Diagnostic, Shade Finder, Skin Dr V3, Face Architect and Fragrance Finder.\n * @param {Object} event event payload\n * @returns {void}\n */\n onResultPageLoaded(event) {\n const eventID = this.options.dsfEventMapping[event.detail.service_name];\n this.sendEventRequest(this.options.recordUrl, eventID);\n }\n\n /**\n * Helper function to handle AJAX requests with event data.\n * @param {string} recordUrl - The URL to send the request.\n * @param {string} eventID - The event ID to include in the request body.\n * @returns {void}\n */\n sendEventRequest(recordUrl, eventID) {\n if (!recordUrl || !eventID) {\n throw new Error('Request could not be processed.');\n }\n const data = { recordEventID: eventID };\n const requestBody = {\n data: JSON.stringify(data),\n };\n const csrf = getCSRF();\n if (csrf) {\n requestBody[csrf.name] = csrf.token;\n }\n ajax(this.options.recordUrl, {\n method: 'POST',\n body: requestBody,\n });\n }\n\n /* eslint-disable complexity */\n /**\n * Method to handle click event\n * @param {Object} event event object\n */\n onClick(event) {\n // try to get DSF button, during click\n // in can be empty during component initialization, but can be inserted into DOM after other DSF button was clicked\n if (!this.selectors.application) {\n this.selectors.application = document.querySelector(this.options.tagName);\n }\n\n if (this.isDSFInitialized()) {\n this.setApplicationAttributes();\n window.dsfDropper.openDsfService(this.options.application, { forceOpening: true });\n } else {\n this.initializeDSF();\n }\n\n const target = event.currentTarget;\n setTimeout(() => {\n const analytics = this.getAnalyticsAttributeData(target);\n this.sendAnalytics(analytics);\n }, 0);\n }\n\n /**\n * Set DSF attribute to DSF web component\n * @param {Element} element DSF DOM element\n */\n setApplicationAttributes() {\n const element = this.selectors.application;\n\n // remove all attributes before setting new one\n while (element.attributes.length > 0) {\n element.removeAttribute(element.attributes[0].name);\n }\n\n element.setAttribute('tenant', this.options.tenant);\n element.setAttribute('application', this.options.application);\n element.setAttribute('customer', this.options.customer);\n element.setAttribute('country', this.options.country);\n element.setAttribute('environment', this.options.environment);\n element.setAttribute('touchpoint', this.options.touchpoint);\n element.setAttribute('type', this.options.type);\n element.setAttribute('loadingbg', this.options.loadingBg);\n element.setAttribute('loadingmsg', this.options.loadingMsg);\n element.setAttribute('switch_ecom', this.options.switchEcom);\n element.setAttribute('switch_autostart', this.options.switchAutostart);\n const csrf = getCSRF();\n if (csrf) {\n element.setAttribute('csrf_token', csrf.token);\n }\n\n if (this.options.range) {\n element.setAttribute('range', this.options.range);\n }\n\n // VTO attributes\n if (this.options.vtoType) {\n element.setAttribute('vto_type', this.options.vtoType);\n element.setAttribute('vto_category', this.options.vtoCategory);\n\n if (this.options.vtoUPCList) {\n element.setAttribute('vto_upc_list', this.options.vtoUPCList);\n }\n\n if (this.options.vtoSelectedUPC) {\n element.setAttribute('vto_selected_upc', this.options.vtoSelectedUPC);\n }\n\n if (this.options.vtoSelectedLook) {\n element.setAttribute('vto_selected_look', this.options.vtoSelectedLook);\n }\n\n if (this.options.vtoSelectedMakeupCategory) {\n element.setAttribute('vto_selected_makeup_category', this.options.vtoSelectedMakeupCategory);\n }\n }\n }\n\n /**\n * Perform actions after scripts and styles load\n */\n onScriptLoadSuccess() {\n if (!window.dsfUpdateMinicart) {\n window.dsfUpdateMinicart = () => {\n Event.emit('cart.product.added', {\n showMiniCart: false,\n });\n };\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 off('click', this.element, this.onClick.bind(this));\n }\n}\n"],"mappings":"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","ignoreList":[]}