{"version":3,"file":"PersonalizationTracking.js","names":["PersonalizationTracking","a","setters","Component","default","deepMerge","cookie","ajax","stringify","execute","constructor","element","options","arguments","length","data","cookieID","afterInit","track","context","item","json","getTrackingData","count","items","indexOf","filter","value","push","limit","slice","setTrackingData","threshold","url","method","body","headers","\"Content-Type\"","then","catch","JSON","parse","decodeURIComponent","getCookie","e","setCookie","encodeURIComponent"],"sources":["components/global/PersonalizationTracking.js"],"sourcesContent":["import Component from 'core/Component';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { cookie } from 'toolbox/cookie';\nimport { ajax } from 'toolbox/ajax';\nimport { stringify } from 'toolbox/queryString';\n\n/**\n * Component manages cookie about viewed products, categories.\n * @class\n * @extends Component\n */\nexport default class PersonalizationTracking 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 data: null, // tracking data\n cookieID: null, // tracking cookie id\n }, options));\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n this.track(this.options.data || {});\n }\n\n /**\n * Track data\n * @param {Object} data tracking data\n */\n track(data) {\n const { context, item } = data;\n\n if (!context || !item) {\n return;\n }\n\n let json = this.getTrackingData();\n\n json[context] = json[context] || { count: 0, items: [] };\n\n if (json[context].items.indexOf(item) === -1) {\n // count how many items were tracked before server push\n json[context].count += 1;\n } else {\n // remove existing item, to be able to move it to the end of array\n json[context].items = json[context].items.filter(value => value !== item);\n }\n\n // append last visited item\n json[context].items.push(item);\n\n if (json[context].items.length > this.options.limit) {\n json[context].items = json[context].items.slice(-this.options.limit);\n }\n\n this.setTrackingData(json);\n\n // if threshold reached, tracking data should be updated on server side\n if (json[context].count >= this.options.threshold) {\n ajax(this.options.url.track, {\n method: 'POST',\n body: stringify({ context }),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n }).then(() => {\n // reset count of tracked items before sync\n json = this.getTrackingData();\n json[context].count = 0;\n this.setTrackingData(json);\n }).catch(() => {});\n }\n }\n\n /**\n * Returns saved tracking data\n * @returns {Object} tracking data\n */\n getTrackingData() {\n let json = {};\n\n try {\n json = JSON.parse(decodeURIComponent(cookie.getCookie(this.options.cookieID)));\n } catch (e) {\n json = {};\n }\n\n return json;\n }\n\n /**\n * Set tracking data\n * @param {Object} data tracking data\n */\n setTrackingData(data) {\n cookie.setCookie(this.options.cookieID, encodeURIComponent(JSON.stringify(data)));\n }\n}\n"],"mappings":"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","ignoreList":[]}