getninjas/tagmanager-wrap

View on GitHub
src/tagmanager-wrap.js

Summary

Maintainability
A
0 mins
Test Coverage

const defaultOptions = {
  gtmId: '111111',
  virtualPageViewEvent: 'virtual_pageview',
  startPush: {
    experiements: [],
  },
  addExperiments: [],
};

export default class TagManager {
  constructor(dataLayer = [], params = defaultOptions) {
    this.options = Object.assign({}, defaultOptions, params);
    this.dataLayer = dataLayer;
    this.dataLayer.push(this.options.startPush);
  }

  init() {
    Object.assign(window.tagManagerDataLayer, this.dataLayer);
    this.dataLayer = window.tagManagerDataLayer;
  }

  prependExperiment({ event, schema, data }) {
    this.options.startPush.experiments.push(data);

    this.custom({ event, schema, data });
  }

  virtualPageView(vpname, eventType) {
    this.dataLayer.push({
      vpname,
      event: eventType || this.options.virtualPageViewEvent,
    });
  }

  eventCategory(eventCategory, infos = {}) {
    const categoryObj = Object.assign({
      eventCategory,
      event: 'GAEvent',
    }, infos);

    return this.dataLayer.push(categoryObj);
  }

  custom(obj) {
    return this.dataLayer.push(obj);
  }

  bindEvents() {
    const gtmElements = [].slice.call(document.querySelectorAll('[data-gtm-event="ga-event"]'));

    gtmElements.map((el) => {
      if (!el.getAttribute('data-gtm-bind')) {
        el.addEventListener('click', this._clickGAEvent.bind(this));
        el.setAttribute('data-gtm-bind', true);
      }

      return el;
    });

    return gtmElements;
  }

  _clickGAEvent(evt) {
    const el = evt.currentTarget;

    const category = this._getAttribute(el, 'data-gtm-category');
    const props = this._getProps(el, ['action', 'label', 'value', 'property']);

    this.eventCategory(category, props);
  }

  _getProps(el, keys) {
    return keys.reduce((previousValue, currentValue) => {
      const key = `event${this._captalize(currentValue)}`;
      const val = this._getAttribute(el, `data-gtm-${currentValue}`);

      return Object.assign({}, previousValue, { [key]: val });
    }, {});
  }

  _captalize(word) {
    return word && word[0].toUpperCase() + word.slice(1);
  }

  _getAttribute(el, attr) {
    return el.getAttribute(attr) || null;
  }
}