{"version":3,"file":"ArticleGTM.js","names":["ArticleGTM","a","setters","Component","default","AnalyticsMixin","mix","Event","getData","deepMerge","execute","with","constructor","element","options","arguments","length","scrollRatio","loadTimeout","initState","state","articleScrollEvent","bindEvents","on","onPageScrolled","afterInit","window","setTimeout","innerHeight","scrollY","document","body","offsetHeight","pushArticleScrollEvent","pageData","Object","assign","page","category","title","articleName","sendAnalytics","event","action","label","extraData","event_name","article_name","destroy","removeListener"],"sources":["components/analytics/ArticleGTM.js"],"sourcesContent":["import Component from 'core/Component';\nimport AnalyticsMixin from 'mixins/Analytics';\nimport { mix } from 'core/mixwith';\nimport { Event } from 'services/EventEmitter';\nimport { getData } from 'services/DataLayer';\nimport { deepMerge } from 'toolbox/deepMerge';\n\n/**\n * component used to push specific analytics component to article pages\n * - push the event when a user scroll down at 75% (by default) and stay on the page at least 30 seconds (by default)\n * @class\n * @classdesc This is a description of the ArticleGTM class. (must be edited)\n * @extends Component\n */\nexport default class ArticleGTM 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 scrollRatio: 0.75,\n loadTimeout: 30000,\n }, options));\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.articleScrollEvent = 'disabled';\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('page.scrolled', this.onPageScrolled, this);\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n window.setTimeout(() => {\n if ((window.innerHeight + window.scrollY) >= (this.options.scrollRatio * document.body.offsetHeight)) {\n this.pushArticleScrollEvent();\n } else {\n this.state.articleScrollEvent = 'pending';\n }\n }, this.options.loadTimeout);\n }\n\n /**\n * pageScrolled event handler\n * mark page as scrolled, this is required for qualified visit event\n */\n onPageScrolled() {\n if (this.state.articleScrollEvent === 'pending') {\n if ((window.innerHeight + window.scrollY) >= (this.options.scrollRatio * document.body.offsetHeight)) {\n this.pushArticleScrollEvent();\n }\n }\n }\n\n /**\n * push the event when a user scroll down at 75% on articles pages and stay on the page at least 30 seconds\n */\n pushArticleScrollEvent() {\n if (this.state.articleScrollEvent !== 'pushed') {\n const pageData = Object.assign({\n page: {\n category: '',\n title: '',\n },\n articleName: '',\n }, getData() || {});\n\n const articleName = pageData.articleName || pageData.page.title;\n\n this.sendAnalytics({\n event: 'uaevent',\n category: pageData.page.category,\n action: 'read article',\n label: articleName,\n extraData: {\n event_name: 'read_article',\n article_name: articleName,\n },\n });\n this.state.articleScrollEvent = 'pushed';\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('page.scrolled', this.onPageScrolled, this);\n }\n}\n"],"mappings":"4LAcqBA,CAAU,QAAAC,CAAA,oBAAAC,OAAA,WAAAD,CAAA,EAdxBE,CAAS,CAAAF,CAAA,CAAAG,OAAA,WAAAH,CAAA,EACTI,CAAc,CAAAJ,CAAA,CAAAG,OAAA,WAAAH,CAAA,EACZK,CAAG,CAAAL,CAAA,CAAHK,GAAG,WAAAL,CAAA,EACHM,CAAK,CAAAN,CAAA,CAALM,KAAK,WAAAN,CAAA,EACLO,CAAO,CAAAP,CAAA,CAAPO,OAAO,WAAAP,CAAA,EACPQ,CAAS,CAAAR,CAAA,CAATQ,SAAS,GAAAC,OAAA,SAAAA,CAAA,EAAAT,CAAA,WASGD,CAAU,CAAhB,aAAyB,CAAAM,CAAG,CAACH,CAAS,CAAC,CAACQ,IAAI,CAACN,CAAc,CAAE,CAMxEO,WAAWA,CAACC,CAAO,CAAgB,IAAd,CAAAC,CAAO,GAAAC,SAAA,CAAAC,MAAA,WAAAD,SAAA,IAAAA,SAAA,IAAG,CAAC,CAAC,CAC7B,KAAK,CAACF,CAAO,CAAEJ,CAAS,CAAC,CACrBQ,WAAW,CAAE,GAAI,CACjBC,WAAW,CAAE,GACjB,CAAC,CAAEJ,CAAO,CAAC,CACf,CAMAK,SAASA,CAAA,CAAG,CACR,IAAI,CAACC,KAAK,CAACC,kBAAkB,CAAG,UACpC,CAMAC,UAAUA,CAAA,CAAG,CACTf,CAAK,CAACgB,EAAE,CAAC,eAAe,CAAE,IAAI,CAACC,cAAc,CAAE,IAAI,CACvD,CAMAC,SAASA,CAAA,CAAG,CACRC,MAAM,CAACC,UAAU,CAAC,IAAM,CACfD,MAAM,CAACE,WAAW,CAAGF,MAAM,CAACG,OAAO,EAAM,IAAI,CAACf,OAAO,CAACG,WAAW,CAAGa,QAAQ,CAACC,IAAI,CAACC,YAAa,CAChG,IAAI,CAACC,sBAAsB,CAAC,CAAC,CAE7B,IAAI,CAACb,KAAK,CAACC,kBAAkB,CAAG,SAExC,CAAC,CAAE,IAAI,CAACP,OAAO,CAACI,WAAW,CAC/B,CAMAM,cAAcA,CAAA,CAAG,CACyB,SAAS,GAA3C,IAAI,CAACJ,KAAK,CAACC,kBAAgC,EACtCK,MAAM,CAACE,WAAW,CAAGF,MAAM,CAACG,OAAO,EAAM,IAAI,CAACf,OAAO,CAACG,WAAW,CAAGa,QAAQ,CAACC,IAAI,CAACC,YAAa,EAChG,IAAI,CAACC,sBAAsB,CAAC,CAGxC,CAKAA,sBAAsBA,CAAA,CAAG,CACrB,GAAsC,QAAQ,GAA1C,IAAI,CAACb,KAAK,CAACC,kBAA+B,CAAE,MACtC,CAAAa,CAAQ,CAAGC,MAAM,CAACC,MAAM,CAAC,CAC3BC,IAAI,CAAE,CACFC,QAAQ,CAAE,EAAE,CACZC,KAAK,CAAE,EACX,CAAC,CACDC,WAAW,CAAE,EACjB,CAAC,CAAEhC,CAAO,CAAC,CAAC,EAAI,CAAC,CAAC,CAAC,CAEbgC,CAAW,CAAGN,CAAQ,CAACM,WAAW,EAAIN,CAAQ,CAACG,IAAI,CAACE,KAAK,CAE/D,IAAI,CAACE,aAAa,CAAC,CACfC,KAAK,CAAE,SAAS,CAChBJ,QAAQ,CAAEJ,CAAQ,CAACG,IAAI,CAACC,QAAQ,CAChCK,MAAM,CAAE,cAAc,CACtBC,KAAK,CAAEJ,CAAW,CAClBK,SAAS,CAAE,CACPC,UAAU,CAAE,cAAc,CAC1BC,YAAY,CAAEP,CAClB,CACJ,CAAC,CAAC,CACF,IAAI,CAACpB,KAAK,CAACC,kBAAkB,CAAG,QACpC,CACJ,CAMA2B,OAAOA,CAAA,CAAG,CACNzC,CAAK,CAAC0C,cAAc,CAAC,eAAe,CAAE,IAAI,CAACzB,cAAc,CAAE,IAAI,CACnE,CACJ,CAAC","ignoreList":[]}