1import { getMetadata } from './lib-franklin.js'; 2 3class Analytics { 4 constructor(manager) { 5 this.manager = manager; 6 this.globals = {}; 7 this.data = {}; 8 } 9 10 async loadGlobalAnalytics(url = '/global/analytics.json') { 11 const resp = await fetch(url); 12 const json = await resp.json(); 13 this.globals = json.data.map((row) => row.Key); 14 const dataArray = json.data 15 .filter((row) => row.Value !== '') 16 .map((row) => [row.Key, row.Value]); 17 this.setData(Object.fromEntries(dataArray)); 18 } 19 20 /* eslint-disable class-methods-use-this */ 21 getPageUrl() { 22 const { host, protocol } = document.location; 23 let { pathname } = document.location; 24 pathname = pathname !== '/' ? pathname : ''; 25 const urlSegments = [protocol, '//', host, pathname]; 26 return urlSegments.join(''); 27 } 28 29 getGlobalOverrides() { 30 const data = {}; 31 this.globals.forEach((key) => { 32 const value = getMetadata(key); 33 if (value) { 34 data[key] = value; 35 } 36 }); 37 return data; 38 } 39 40 loadPageAnalyticsData() { 41 const defaults = {}; 42 defaults['Page Name'] = getMetadata('og:title'); 43 defaults['Page URL'] = this.getPageUrl(); 44 const overrides = this.getGlobalOverrides(); 45 this.setData({ ...defaults, ...overrides }); 46 } 47 48 setData(data) { 49 this.data = { ...this.data, ...data }; 50 } 51 52 toCamelCase(text) { 53 const words = text.split(/[\s_-]+/); 54 for (let i = 1; i < words.length; i += 1) { 55 words[i] = words[i][0].toUpperCase() + words[i].substring(1); 56 } 57 const camelCase = words.join(''); 58 return camelCase[0].toLowerCase() + camelCase.substring(1); 59 } 60 61 formatMetaDataKeys(data) { 62 const newData = {}; 63 Object.keys(data).forEach((key) => { 64 newData[this.toCamelCase(key)] = data[key]; 65 }); 66 return newData; 67 } 68 69 /** 70 * Returns experiment id and variant running, if any 71 * @returns {{experimentVariant: *, experimentId}} 72 */ 73 getExperimentDetails() { 74 let experiment; 75 if (window.hlx && window.hlx.experiment) { 76 experiment = { 77 experimentId: window.hlx.experiment.id, 78 experimentVariant: window.hlx.experiment.selectedVariant, 79 }; 80 } 81 return experiment; 82 } 83 84 async initialize(defaults, url) { 85 this.setData(defaults); 86 if (!this.manager.endpoint) return; 87 await this.loadGlobalAnalytics(url); 88 this.loadPageAnalyticsData(); 89 window.pfAnalyticsData = window.pfAnalyticsData || {}; 90 window.pfAnalyticsData.pfPage = window.pfAnalyticsData.pfPage || {}; 91 const pfExperiment = this.getExperimentDetails(); 92 if (pfExperiment) { 93 window.pfAnalyticsData.pfExperiment = pfExperiment; 94 } 95 Object.assign(window.pfAnalyticsData.pfPage, this.formatMetaDataKeys(this.data)); 96 } 97 98 /** 99 * Appends data to element as an attribute. 100 * Recommended for all clickable all events (e.g. <a>, <button>, etc.). 101 * @param {string} event The event type (i.e. pfLinkName, pfFileDownload, etc.) 102 * @param {json} data The data to append to analytics data layer 103 * @param {element} element The element to append the data layer attribute 104 */ 105 static setDataLayer(event, data, element) { 106 if (!element || !event || !data) { 107 return; // No Action 108 } 109 const dataLayer = { pfAnalyticsAttrData: {} }; 110 dataLayer.pfAnalyticsAttrData[event] = data; 111 element.setAttribute('sc-pf-data', JSON.stringify(dataLayer)); 112 } 113 114 /** 115 * Appends data to element as an attribute 116 * Recommended for all NON clickable all events (e.g. scroll, custom events, specific conditions, etc.). 117 * @param {string} event The data type (i.e. pfLinkName, pfFileDownload, etc.) 118 * @param {json} data The data to append to analytics data layer 119 */ 120 static triggerEvent(event, data) { 121 if (event === 'pfPage') { // Exception for pfPage event for assign on page load 122 window.pfAnalyticsData = window.pfAnalyticsData || {}; 123 window.pfAnalyticsData.pfPage = window.pfAnalyticsData.pfPage || {}; 124 Object.assign(window.pfAnalyticsData.pfPage, data); 125 } else if (window.$pfa_datalayer) { // If Pfizer Analytics events handler already setup triggers event 126 const dataLayer = { event }; 127 dataLayer[event] = data; 128 const eventObj = new CustomEvent('pfAnalytics', { detail: [dataLayer] }); 129 document.querySelector('body').dispatchEvent(eventObj); 130 } else { // If Pfizer Analytics events handler no ready, it add event to queue 131 window.$pfa_queue_dl = window.$pfa_queue_dl || []; 132 window.$pfa_queue_dl.push([event, data]); 133 } 134 } 135 136} 137 138export default Analytics;
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.