appirio-tech-react-components-test10
Version:
Topcoder UI Kit library of components for our React apps.
81 lines (65 loc) • 2.17 kB
JSX
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import classNames from 'classnames'
import NavLink from '../NavLink/NavLink'
require('./MenuBar.scss')
export default class MenuBar extends Component {
componentWillMount() {
this.handleResize = this.handleResize.bind(this)
this.handleResize()
window.addEventListener('resize', this.handleResize)
}
componentWillUnmount() {
window.removeEventListener('resize', this.handleResize)
}
handleResize() {
this.setState({ mobile: window.innerWidth <= this.props.mobileBreakPoint })
}
renderLinkDom(item, linkContent, itemClass, linkTarget) {
// _.self forces a full page refresh using underlying Link
linkTarget = item.target || null
return (
<NavLink key={item.text} to={item.link} target={linkTarget} content={linkContent} classes={itemClass} />
)
}
renderAnchorDom(item, linkContent, itemClass, linkTarget) {
return (
<li key={item.text} className={itemClass}>
<a href={item.link} target={linkTarget}>{linkContent}</a>
</li>
)
}
render() {
const { orientation, items, forReactRouter } = this.props
const mbClasses = classNames({
MenuBar: true,
[orientation]: true
})
const menuItem = item => {
const itemClass = classNames({
[orientation]: true,
mobile: this.state.mobile,
selected: item.selected || (item.regex && window.location.href.match(item.regex) !== null)
})
const linkTarget = item.target || '_self'
const linkContent = this.state.mobile ? <img src={item.img} /> : item.text
return forReactRouter && !item.absolute ?
this.renderLinkDom(item, linkContent, itemClass, linkTarget)
: this.renderAnchorDom(item, linkContent, itemClass, linkTarget)
}
return (
<ul className={mbClasses}>
{ items.map(menuItem) }
</ul>
)
}
}
MenuBar.propTypes = {
items: PropTypes.array.isRequired,
mobileBreakPoint: PropTypes.number,
orientation: PropTypes.oneOf(['vertical', 'horizontal'])
}
MenuBar.defaultProps = {
mobileBreakPoint: 768,
orientation: 'horizontal'
}