all files / components/Utils/ Utils.js

69.35% Statements 43/62
38.89% Branches 14/36
87.5% Functions 14/16
42.42% Lines 14/33
5 statements, 4 functions, 6 branches Ignored     
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                                                                                                                  
import Transmit from 'react-transmit'
 
export default class Utils {
  /**
   * Find a parent element by traversing up.
   * @param  {object} child     - dom element
   * @param  {string} selector  - selector to find parent. e.g. '#id123' or '.content' or 'div'
   * @return {object}           - return parent dom element
   */
  static findParentByChild (child, selector) {
    let el = child
    const isClassName = (selector[0] === '.' ? true : false)
    const isId = (selector[0] === '#' ? true : false)
    if (isId || isClassName) {
      selector = selector.slice(1)
    }
    el = el.parentElement
    while (el) {
      const classes = el.getAttribute('class')
      if ((isId && el.getAttribute('id') === selector) ||
        (isClassName && classes && classes.split(' ').indexOf(selector) >= 0) ||
        (el.tagName === selector.toUpperCase())) {
        break
      }
      el = el.parentElement
    }
    return el
  }
 
  /**
   * Toggle element by setting display style to 'block' or 'none'
   * @example - toggle({ overlayEl: el, show: false })
   * @param  {object} param - object parameter { name: domEl, show: boolean }
   */
  static toggle (param) {
    const el = param[ Object.keys(param)[0] ] // first param object.
    el.style.display = (param.show ? 'block' : 'none')
  }
 
  static getTransmitFragments (fragmentArr) {
    return fragmentArr.reduce((res, item) => {
      const key = Object.keys(item)[0]
      const fragmentParams = item[key]
      res[key] = () => ( __CLIENT__ ? Promise.resolve() : fragmentParams[0].apply(this, fragmentParams.slice(1)) )
      return res
    }, {})
  }
 
  static fetchFragmentsToState (fragmentArr, ctx, callbackFn) {
    fragmentArr.map(item => {
      const key = Object.keys(item)[0]
      const fragmentParams = item[ key ]
      const fn = fragmentParams[0]
      fn(fragmentParams.slice(1)).then(data => {
        const state = {}
        state[ key ] = data
        ctx.setState(state)
        if (callbackFn) {
          callbackFn(key, data)
        }
      })
    })
  }
 
  static createTransmitContainer (Component, fragmentArr) {
    const fragments = this.getTransmitFragments(fragmentArr)
    return Transmit.createContainer(Component, { initialVariables: {}, fragments })
  }
}