All files / menu index.js

84.21% Statements 16/19
65% Branches 13/20
100% Functions 4/4
83.33% Lines 15/18
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  1x 1x   1x         24x 4x 4x 11x 11x           4x         4x 2x                   6x     6x     1x 1x                                                                        
 
import React from 'react'
import {Motion, spring} from 'react-motion'
 
export const Divider = 'DIVIDER'
 
/**
 * Menu component
 */
export function Menu ({items, children, visible, onClick, transformX, transformY}) {
  var hasIcon = false
  for (let i = 0; i < items.length; i++) {
    var item = items[i]
    Iif (item.icon) {
      hasIcon = true
      break
    }
  }
 
  return (
    <div className='Menu'>
      {children}
      <Motion style={{val: spring(visible ? 1 : 0)}}>
        {style => {
          if (!visible) { return <span /> }
          return (
            <ul className='Menu-list' style={{
              top: transformY === 'top' ? 0 : null,
              bottom: transformY === 'bottom' ? 0 : null,
              left: transformX === 'left' ? 0 : null,
              right: transformX === 'right' ? 0 : null,
              transformOrigin: `${transformX} ${transformY}`,
              transform: `scale(${style.val})`
            }}>
              {items.map((item, index) => {
                Iif (item === Divider) {
                  return <li key={index} className='Menu-divider' />
                }
                return (
                  <li key={index} className='Menu-list-item' style={{opacity: style.val}}>
                    <a href='#' className='Menu-list-item-link' onClick={e => {
                      e.preventDefault()
                      onClick(item)
                    }}>
                      {hasIcon &&
                        <div className='Menu-icon'>
                          {item.icon}
                        </div>
                      }
                      {item.content || item}
                    </a>
                  </li>
                )
              })}
            </ul>
          )
        }}
      </Motion>
    </div>
  )
}
 
/**
 * Property types
 */
Menu.propTypes = {
  items: React.PropTypes.array,
  onClick: React.PropTypes.func.isRequired,
  visible: React.PropTypes.bool
}
 
/**
 * Default properties
 */
Menu.defaultProps = {
  items: ['One', 'Two'],
  visible: false
}