Source: initiators/flipclock/index.js

import FlipClock from 'flipclock-es6';
import 'flipclock-es6/compiled/flipclock.css';
import Lang from './extension/lang';
import { DailyCounterFace, HourlyCounterFace } from './extension/faces';
import './style.less';
import DomService from '../domService';

/**
 * @memberof Initiators/FlipClock
 * @constructor FlipClockInitiator
 * @param {Object} args - all arguments
 * @example
 * const flipClock = new FlipClockInitiator({selector: '.Promotion__timer'});
 */
export default class FlipClockInitiator {
  wrapperObject = null;
  args = null;
  clock = [];
  constructor(args) {
    this.args = args;
    this.wrapperObject = DomService.getAll('.PlasmaPromotion__timerJs');
  }

  /**
   * @method FlipClockInitiator#addExtension
   * @memberof Initiators/FlipClock
   * @description Private method for init extension
   */
  addExtension = () => {
    FlipClock.Lang = {
      ...FlipClock.Lang,
      ...Lang,
    };

    FlipClock.PlasmaDailyCounterFace = FlipClock.Face.extend(DailyCounterFace);
    FlipClock.PlasmaHourlyCounterFace = FlipClock.Face.extend(HourlyCounterFace);
  };

  /**
   * @method FlipClockInitiator#run
   * @memberof Initiators/FlipClock
   * @description Run timer
   * @example
   * const flipClock = new FlipClockInitiator({selector: '.Promotion__timer'});
   * flipClock.run();
   */
  run = () => {
    if (this.args.withoutTimer) return;
    if (this.wrapperObject === null) return;
    this.addExtension();

    Array.prototype.forEach.call(this.wrapperObject, (timer) => {
      const clock = new FlipClock(timer, this.args.time, {
        language: this.args.language,
        countdown: this.args.countdown,
        clockFace: this.args.clockFace,
      });

      if (this.args.clockFace === 'counter') {
        DomService.addClass(timer, ['PlasmaPromotionCounter']);
      }
      this.clock.push(clock);
    });

    if (this.args.clockFace === 'counter') {
      this.clock.forEach((flipTimer) => {
        setTimeout(() => {
          setInterval(() => {
            flipTimer.decrement();
          }, this.args.timeInterval);
        });
      });
    }
  }
}