{"version":3,"file":"SfmcDataLayer.js","names":["SfmcDataLayer","a","setters","loadjs","default","Component","Event","ajax","on","off","mix","deepMerge","OneTrustDelayedLoader","execute","with","constructor","element","options","arguments","length","setOrgId","scriptUrl","componentUrl","events","sfmcLayerName","loadScriptTimeout","initCache","selectors","document","initState","state","scriptLoaded","bindEvents","onEvent","onCartUpdated","OnLoginSuccess","OnSignUpSuccess","bind","customEvent","afterInit","initLoad","readyState","disableSFMCTracking","window","OnetrustActiveGroups","loadScriptWithDependency","loadScript","loaded","path","success","onScriptLoaded","error","onScriptLoadFailed","pushInitData","console","message","pushObject","loadDependencyFailed","includes","Object","keys","forEach","key","value","push","eventName","data","event","callAjax","item","ecommerce","click","products","id","e","detail","content","custom","userInfo","updateUserInfo","method","headers","\"Content-Type\"","then","response","pushAjaxData","ajaxEvents","componentOptions","trackCart","cartAjax","cart","clear_cart","setUserInfo","destroy"],"sources":["components/analytics/SfmcDataLayer.js"],"sourcesContent":["/* eslint complexity: off */\n/* eslint max-lines: 0 */\nimport loadjs from 'loadjs';\nimport Component from 'core/Component';\nimport { Event } from 'services/EventEmitter';\nimport { ajax } from 'toolbox/ajax';\nimport { on, off } from 'toolbox/event';\nimport { mix } from 'core/mixwith';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport OneTrustDelayedLoader from 'mixins/OneTrustDelayedLoader';\n\n/**\n * Class which handles SFMC tracking. It listens to the main events for basket update\n * @class\n * @classdesc Class which handles SFMC tracking. It listens to the main events for basket update\n * @extends Component\n */\nexport default class SfmcDataLayer extends mix(Component).with(OneTrustDelayedLoader) {\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 setOrgId: null,\n scriptUrl: null,\n componentUrl: null,\n events: null,\n sfmcLayerName: '_etmc',\n loadScriptTimeout: 5000,\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.document = document;\n }\n\n /**\n * Init the different state of the component\n * It helps to avoid heavy DOM manipulation\n */\n initState() {\n this.state.scriptLoaded = false;\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 Event.on('cart.updated', this.onCartUpdated, this);\n Event.on('login.success', this.OnLoginSuccess, this);\n on('signup.success', this.selectors.document, this.OnSignUpSuccess.bind(this), { customEvent: true });\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {}\n\n /**\n * Executed when load event is triggered or triggered directly when component is initialized if window.onload has been\n * triggered before the initialization of the component. Is called after all the other hooks\n */\n initLoad() {\n if (document.readyState === 'complete') {\n if (this.options.disableSFMCTracking && !window.OnetrustActiveGroups) {\n this.loadScriptWithDependency(this.options.loadScriptTimeout);\n } else {\n this.loadScript();\n }\n } else {\n this.loaded = false;\n }\n }\n\n /**\n * Load the SFMC script\n * @param { String } id - GTM ID\n */\n loadScript() {\n if (this.state.scriptLoaded) {\n return;\n }\n\n loadjs(this.path, {\n success: this.onScriptLoaded.bind(this),\n error: this.onScriptLoadFailed.bind(this),\n });\n }\n\n\n /**\n * On script load handler, called when SFMC is loaded\n */\n onScriptLoaded() {\n this.state.scriptLoaded = true;\n this.pushInitData();\n }\n\n /**\n * On SFMC script loading failed handler\n * @param {object} error Error object\n */\n onScriptLoadFailed(error) {\n console.error(error.message);\n }\n\n /**\n * Call function to push all backend data in datalayer\n */\n pushInitData() {\n const {\n setOrgId,\n events,\n disableSFMCTracking,\n } = this.options;\n\n this.pushObject('setOrgId', setOrgId);\n\n if (disableSFMCTracking && (this.state.loadDependencyFailed || !window.OnetrustActiveGroups.includes(',3,'))) {\n this.pushObject('doNotTrack');\n this.pushObject('trackPageView');\n }\n\n if (Object.keys(events).length) {\n Object.keys(events).forEach((key) => {\n this.pushObject(key, events[key]);\n });\n }\n }\n\n /**\n * Push Object in datalayer\n * @param {key} key Name of the event ot be pushed\n * @param {value} value Value to be pushed\n */\n pushObject(key, value) {\n const { sfmcLayerName } = this.options;\n if (window[sfmcLayerName]) {\n window[sfmcLayerName].push(value ? [key, value] : [key]);\n }\n }\n\n /**\n * Handler called when sending basic analytics 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 switch (data.event) {\n case 'addToCart':\n this.callAjax();\n break;\n case 'productClick':\n this.pushObject('trackPageView', { item: data.ecommerce.click.products[0].id });\n break;\n default:\n break;\n }\n }\n\n /**\n * On cart.updated handler\n */\n onCartUpdated() {\n this.callAjax();\n }\n\n /**\n * On login.success handler\n */\n OnLoginSuccess() {\n this.callAjax(true);\n }\n\n /**\n * On signup.success handler\n * @param {Object} e event data\n */\n OnSignUpSuccess(e) {\n const {\n events,\n } = this.options;\n\n if (e.detail && e.detail.content.custom && e.detail.content.custom.userInfo) {\n this.pushObject('setUserInfo', e.detail.content.custom.userInfo);\n if (Object.keys(events).length) {\n Object.keys(events).forEach((key) => {\n this.pushObject(key, events[key]);\n });\n }\n }\n }\n\n /**\n * Call the backend component using Ajax\n * @param { Boolean } updateUserInfo Update User Info\n * @returns {Promise} Ajax request\n */\n callAjax(updateUserInfo = false) {\n const { componentUrl } = this.options;\n\n return ajax(componentUrl, {\n method: 'GET',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n }).then(response => this.pushAjaxData(response, updateUserInfo));\n }\n\n /**\n * Push in the datalayer the ajax response\n * @param {Object} response Data\n * @param { Boolean } updateUserInfo Update User Info\n */\n pushAjaxData(response, updateUserInfo) {\n const ajaxEvents = response.componentOptions.events;\n if (ajaxEvents.trackCart) {\n const cartAjax = ajaxEvents.trackCart;\n if (cartAjax.cart.length) {\n this.pushObject('trackCart', cartAjax);\n }\n } else {\n this.pushObject('trackCart', { clear_cart: true });\n }\n\n if (updateUserInfo && ajaxEvents.setUserInfo) {\n this.pushObject('setUserInfo', ajaxEvents.setUserInfo);\n }\n }\n\n /**\n * Get path URL\n * @returns {string} - get google tag manager URL\n */\n get path() {\n const { scriptUrl } = this.options;\n return scriptUrl;\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.off('analytics.event', this.onEvent, this);\n Event.off('cart.updated', this.onCartUpdated, this);\n off('signup.success', this.selectors.document);\n }\n}\n"],"mappings":"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","ignoreList":[]}