Spaces:
Running
Running
import bindAll from 'lodash.bindall'; | |
import PropTypes from 'prop-types'; | |
import React from 'react'; | |
import MenuComponent from '../components/menu/menu.jsx'; | |
class Menu extends React.Component { | |
constructor (props) { | |
super(props); | |
bindAll(this, [ | |
'addListeners', | |
'removeListeners', | |
'handleClick', | |
'ref' | |
]); | |
} | |
componentDidMount () { | |
if (this.props.open) this.addListeners(); | |
} | |
componentDidUpdate (prevProps) { | |
if (this.props.open && !prevProps.open) this.addListeners(); | |
if (!this.props.open && prevProps.open) this.removeListeners(); | |
} | |
componentWillUnmount () { | |
this.removeListeners(); | |
} | |
addListeners () { | |
document.addEventListener('mouseup', this.handleClick); | |
} | |
removeListeners () { | |
document.removeEventListener('mouseup', this.handleClick); | |
} | |
handleClick (e) { | |
if (this.props.open && !this.menu.contains(e.target)) { | |
this.props.onRequestClose(); | |
} | |
} | |
ref (c) { | |
this.menu = c; | |
} | |
render () { | |
const { | |
open, | |
children, | |
...props | |
} = this.props; | |
if (!open) return null; | |
return ( | |
<MenuComponent | |
componentRef={this.ref} | |
{...props} | |
> | |
{children} | |
</MenuComponent> | |
); | |
} | |
} | |
Menu.propTypes = { | |
children: PropTypes.node, | |
onRequestClose: PropTypes.func.isRequired, | |
open: PropTypes.bool.isRequired | |
}; | |
export default Menu; | |