// @flow import * as React from 'react'; import ReactDOM from 'react-dom'; import autobind from 'autobind-decorator'; import { isMac } from '../../common/constants'; type Props = { onKeydown: Function, children: React.Node, disabled?: boolean, scoped?: boolean, stopMetaPropagation?: boolean, }; @autobind class KeydownBinder extends React.PureComponent { _handleKeydown(e: KeyboardEvent) { const { stopMetaPropagation, onKeydown, disabled } = this.props; if (disabled) { return; } const isMeta = isMac() ? e.metaKey : e.ctrlKey; if (stopMetaPropagation && isMeta) { e.stopPropagation(); } onKeydown(e); } componentDidMount() { if (this.props.scoped) { const el = ReactDOM.findDOMNode(this); el && el.addEventListener('keydown', this._handleKeydown); } else { document.body && document.body.addEventListener('keydown', this._handleKeydown); } } componentWillUnmount() { if (this.props.scoped) { const el = ReactDOM.findDOMNode(this); el && el.removeEventListener('keydown', this._handleKeydown); } else { document.body && document.body.removeEventListener('keydown', this._handleKeydown); } } render() { return this.props.children; } } export default KeydownBinder;