All files WaterfallTips.js

100% Statements 34/34
100% Branches 35/35
100% Functions 11/11
100% Lines 33/33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127            2x 2x 2x   3x             3x   3x                 4x                 5x 1x     4x   4x 1x     3x         3x 3x                 8x 15x   8x                   7x   7x 3x   3x 1x     4x     7x             2x 1x     2x                     62x               11x 9x   9x 1x          
export default class WaterfallTips {
  /**
   * @constructor
   * @param {*} indexes - Indexes to create
   */
  constructor(indexes = [], options = {}) {
    this._index = null
    this.indexes = {}
    this.options = options
 
    indexes.forEach(index => this.createIndex(index))
  }
 
  /**
   * Start the waterfall tips by the first position
   */
  start() {
    this.index = this.getIndexByPosition(0)
 
    return this.index && this.index.name
  }
 
  /**
   * Check if an alement must be visible or not
   * @param {String|Object} index - The index
   * @returns {Boolean} Is visible or not
   */
  isVisible(index = '') {
    return this.index ? index === this.index.name : false
  }
 
  /**
   * Create a new index
   * @param {String} name - The name of the index
   * @returns {*} The index object
   */
  createIndex(name) {
    if (!name) {
      throw new Error(`WaterfallTips.createIndex must have a name parameter. Found: "${name}"`)
    }
 
    const key = name.replace(/[^a-zA-Z]/g, '')
 
    if (this.indexes[key]) {
      throw new Error(`WaterfallTips index must be unique. Found duplicate key: "${key} (${name})"`)
    }
 
    const index = {
      name: key,
      position: Object.keys(this.indexes).length
    }
 
    this.indexes[key] = index
    return key
  }
 
  /**
   * Get the index by its position
   * @param {Number} position - The position of the index
   * @returns {*} The index object
   */
  getIndexByPosition(position) {
    const key = Object.keys(this.indexes)
      .find(k => this.indexes[k].position === position)
 
    return this.indexes[key]
  }
 
 
  /* METHODS */
 
  /**
   * Trigger the next tips
   */
  next() {
    const isFinished = this.index && this.index.position + 1 >= Object.keys(this.indexes).length
 
    if (!this.index || isFinished) {
      this.index = null
 
      if (this.options.onEnd) {
        this.options.onEnd()
      }
    } else {
      this.index = this.getIndexByPosition(this.index.position + 1)
    }
 
    return this.index && this.index.name
  }
 
  /**
   * Trigger the previous tips
   */
  previous() {
    if (this.index && this.index.position > 0) {
      this.index = this.getIndexByPosition(this.index.position - 1)
    }
 
    return this.index && this.index.name
  }
 
 
  /* ACCESSORS */
 
  /**
   * Get the current index
   * @returns {Object}
   */
  get index() {
    return this.options.disabled ? null : this._index
  }
 
  /**
   * Set the new index
   * @returns {Object}
   */
  set index(index) {
    if (index !== this._index) {
      this._index = index
 
      if (this.options.onIndexChange) {
        this.options.onIndexChange(index && index.name)
      }
    }
  }
}