Skip to content

Instantly share code, notes, and snippets.

@alexrussell
Last active October 27, 2016 14:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexrussell/04a032f828fb6478707c8b59d1bebcbb to your computer and use it in GitHub Desktop.
Save alexrussell/04a032f828fb6478707c8b59d1bebcbb to your computer and use it in GitHub Desktop.
Outside event listener HOC
export default function OutsideEventListener(Target, listeners = []) {
return class OutsideEventListener extends Component {
target = null
componentDidMount() {
for (const eventName of listeners) {
window.addEventListener(eventName, this.handleEvent, false)
}
}
componentWillUnmount() {
for (const eventName of listeners) {
window.removeEventListener(eventName, this.handleEvent, false)
}
}
handleEvent = (event) => {
if (this.target) {
const targetElement = ReactDOM.findDOMNode(this.target)
const isInside = (targetElement === event.target) || targetElement.contains(event.target)
if (! isInside) {
this.target.onOutsideEvent(event)
}
}
}
storeTarget = (ref) => {
if (ref && ! ref.onOutsideEvent) {
throw new Error('Component does not define "onOutsideEvent" method.')
}
this.target = ref
}
render() {
return <Target { ...this.props } ref={ this.storeTarget } />
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment