Source: initiators/tagManager.js

/**
 * @memberof Initiators/Analytics
 * @constructor TagManager
 * @param {Object} args - all arguments
 * @example
 * const tagManager = new TagManager({});
 */
export default class TagManager {
  args = null;

  constructor(args) {
    window.dataLayer = window.dataLayer || [];
    this.args = args;
  }

  /**
   * @method TagManager#onClickBanner
   * @memberof Initiators/Analytics
   * @description Tag manager event click banner
   * @example
   * const tagManager = new TagManager({});
   * tagManager.onClickBanner();
   */
  onClickBanner() {
    const previousLayers = window.dataLayer.filter((layer) => {
      if (typeof layer.ecommerce === 'undefined') return false;
      if (typeof layer.ecommerce.promoClick === 'undefined') return false;
      if (typeof layer.ecommerce.promoClick.promotions === 'undefined') return false;
      const promotions = Array.isArray(layer.ecommerce.promoClick.promotions)
        && layer.ecommerce.promoClick.promotions
          .filter(promotion => promotion.id === this.args.name);
      return !!promotions.length;
    });
    if (previousLayers.length) return;
    window.dataLayer.push({
      event: 'promotionClick',
      ecommerce: {
        promoClick: {
          promotions: [{
            id: this.args.name, // Название рекламы http://prntscr.com/iioa7j
            name: 'JS Banner',
            creative: this.args.link, // URL на который ведет баннер или Start Chat
            position: 'slot1',
          }],
        },
      },
    });
  }

  /**
   * @method TagManager#onShowBanner
   * @memberof Initiators/Analytics
   * @description Tag manager event show banner
   * @example
   * const tagManager = new TagManager({});
   * tagManager.onShowBanner();
   */
  onShowBanner() {
    const previousLayers = window.dataLayer.filter((layer) => {
      if (typeof layer.ecommerce === 'undefined') return false;
      if (typeof layer.ecommerce.promoView === 'undefined') return false;
      if (typeof layer.ecommerce.promoView.promotions === 'undefined') return false;
      const promotions = Array.isArray(layer.ecommerce.promoView.promotions)
        && layer.ecommerce.promoView.promotions
          .filter(promotion => promotion.id === this.args.name);
      return !!promotions.length;
    });
    if (previousLayers.length) return;
    window.dataLayer.push({
      event: 'promotionView',
      ecommerce: {
        promoView: {
          promotions: [{
            id: this.args.name, // Название рекламы
            name: 'JS Banner',
            creative: this.args.link, // URL на который ведет баннер или Start Chat
            position: 'slot1',
          }],
        },
      },
    });
  }
}