{"version":3,"file":"js/scripts_libraries__modules_tracking_index_js.js?_t=68a8f8aaac7258958ad1","mappings":";;;;;;;;;;;;AAAA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AAEA;AAAA;AAGA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;ACrEA;AAEA;AAAA;AAEA;AAEA;AAAA;AACA;AAGA;AACA;AACA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAMA;AAEA;AACA;AACA;AACA;AAAA;AAGA;AACA;AAAA;AACA;AACA;AAKA;AAAA;AAEA;AApCA;AA+BA;AAnCA;;;;;;;;;;;;;;;;;ACAA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AAAA;AAGA;AACA;AACA;AAAA;AAEA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AAGA;AAAA;AACA;AAGA;AACA;AAAA;AACA;AAEA;AAAA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAAA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAEA","sources":["webpack://@mlssoccer/netcore/./scripts/libraries/_modules/tracking/index.js","webpack://@mlssoccer/netcore/./scripts/libraries/_modules/tracking/service.js","webpack://@mlssoccer/netcore/./scripts/libraries/utils.js"],"sourcesContent":["import GoogleTagManagerService from './service';\nimport { trackBlockClick, trackBlockImpression, trackEvent } from \"./helpers\";\n\nGoogleTagManagerService.registerInstance('[data-tracking-block-impression]', (elements) => {\n  const blockImpressionsList = [];\n\n  elements.forEach((element) => {\n    if (element.dataset.impressionTracked) return;\n\n    const data = JSON.parse(element.dataset.trackingBlockImpression);\n\n    const bucketName = element.closest('[data-bucket-name]')?.dataset.bucketName;\n    const blockType = element.closest('[data-block-type]')?.dataset.blockType;\n\n    let blockImpressionsIndex = blockImpressionsList.findIndex(bi => bi.bucketName === bucketName && bi.blockType === blockType);\n    if (blockImpressionsIndex < 0 && blockImpressionsList.length == 0) {\n      blockImpressionsIndex = 0;\n      blockImpressionsList.push({\n        bucketName,\n        blockType,\n        impressions: [],\n      });\n    }\n\n    if (blockImpressionsIndex < 0 && blockImpressionsList.length != 0) {\n      blockImpressionsIndex = blockImpressionsList.length;\n      blockImpressionsList.push({\n        bucketName,\n        blockType,\n        impressions: [],\n      });\n    }\n\n    blockImpressionsList[blockImpressionsIndex].impressions.push({\n      ...data,\n    });\n    element.dataset.impressionTracked = true;\n  });\n\n  if (!blockImpressionsList.length) return;\n\n  blockImpressionsList.forEach(({ bucketName, blockType, impressions }) => impressions.length && trackBlockImpression(bucketName, blockType, impressions));\n});\n\nGoogleTagManagerService.registerInstance('[data-tracking-block-click]', (elements) => {\n  elements.forEach((element) => {\n    const data = JSON.parse(element.dataset.trackingBlockClick);\n\n    const bucketName = element.closest('[data-bucket-name]')?.dataset.bucketName;\n    const blockType = element.closest('[data-block-type]')?.dataset.blockType;\n    const layoutName = element.closest('[data-layout-name]')?.dataset.layoutName;\n    const blockLayout = element.closest('[data-block-layout]')?.dataset.blockLayout;\n    const blockStyle = element.closest('[data-block-style]')?.dataset.blockStyle;\n\n    const impressionBlock = element.closest('[data-tracking-block-impression]');\n    const promotion = impressionBlock?.dataset.trackingBlockImpression && JSON.parse(impressionBlock.dataset.trackingBlockImpression);\n\n    element.addEventListener('click', () => {\n      trackBlockClick(bucketName, blockType, layoutName, blockLayout, blockStyle, data, promotion);\n    });\n  });\n});\n\nGoogleTagManagerService.registerInstance('[data-tracking-click]', (elements) => {\n  elements.forEach((element) => {\n    element.addEventListener('click', () => {\n      const eventName = element.dataset.clickEventName;\n      const data = JSON.parse(element.dataset.trackingClick);\n      trackEvent(eventName, data);\n    });\n  });\n});\n","/* eslint-disable bam/no-react-unbound */\n\nimport { domIsReady, watchAddedNodes } from \"../../utils\";\n\nexport default class GoogleTagManagerService {\n  constructor(selector, trackingMethod) {\n    this.callback = trackingMethod;\n\n    this.init(selector);\n  }\n\n  async init(selector) {\n    await domIsReady();\n    watchAddedNodes((nodes) => {\n      this.generateObserver(nodes);\n    }, selector);\n  }\n\n  /**\n   * Process nodes\n   */\n  generateObserver(nodes) {\n    this.observer && this.observer.disconnect();\n\n    this.observer = new IntersectionObserver((inttersectedEls) => {\n      const elements = inttersectedEls.filter((e) => e.isIntersecting).map((e) => e.target);\n      elements.forEach((e) => this.observer.unobserve(e));\n      this.callback(elements);\n    });\n\n    nodes.forEach((node) => {\n      this.observer.observe(node);\n    });\n  }\n\n  static instances = [];\n\n  static registerInstance(selector, trackingMethod) {\n    this.instances.push(new GoogleTagManagerService(selector, trackingMethod));\n  }\n}\n","export function Warn(...args) {\n  window.console && window.console.warn(...args);\n}\n\nexport const watchAddedNodes = async (callback, querySelector, immediate = true) => {\n  const throttle = await import('./_utilities/throttle');\n  if (!callback || typeof callback !== 'function') throw new Error('callback must be a function');\n  if (!querySelector) throw new Error('querySelector must have a value');\n\n  if (immediate) {\n    const initialElements = Array.from(document.querySelectorAll(querySelector));\n    callback(initialElements);\n  }\n\n  const observer = new MutationObserver((mutationsList) => {\n    let elements = [];\n    const debouncedClbk = throttle.debounce(\n      () => {\n        callback(elements);\n      },\n      250,\n      false\n    );\n    for (const mutation of mutationsList) {\n      if (mutation.type === 'childList') {\n        const nodes = Array.from(mutation.addedNodes).filter((node) => node.nodeType === 1);\n        const selfNodes = nodes.filter(\n          (node) => !querySelector || node.matches(querySelector)\n        );\n        const innerNodes = nodes\n          .filter(\n            (node) => querySelector && node.querySelector(querySelector))\n          .map((node) => Array.from(node.querySelectorAll(querySelector)))\n          .reduce((a, b) => a.concat(b), []);\n        elements = [...elements, ...selfNodes, ...innerNodes];\n      }\n    }\n\n    if (elements && elements.length) {\n      debouncedClbk();\n    }\n  });\n  observer.observe(document, {\n    childList: true,\n    subtree: true,\n  });\n  return observer;\n};\n\nexport const domIsReady = () => new Promise((resolve) => {\n  if (document.readyState === 'complete' || document.readyState === 'interactive') {\n    // resolve if we are after pageload\n    resolve();\n  }\n  if (!document.attachEvent || typeof document.attachEvent === 'undefined') {\n    document.addEventListener('DOMContentLoaded', () => { resolve(); });\n    document.addEventListener('readystatechange', () => {\n      if (document.readyState === 'complete' || document.readyState === 'interactive') {\n        resolve();\n      }\n    });\n  } else {\n    document.attachEvent('onreadystatechange', () => {\n      if (document.readyState === 'complete' || document.readyState === 'interactive') {\n        resolve();\n      }\n    });\n  }\n});\n"],"names":[],"sourceRoot":""}