import React from 'react'; import PropTypes from 'prop-types'; import { GlobalHotKeys } from 'react-hotkeys'; export default class HotkeysDetector extends React.Component { constructor(props) { super(props); this.hotkeyList = this.props.hotkeyList; this.state = { userCommand: [], }; this.processingCommands = []; this.check = this.check.bind(this); } check(event) { const target = event.target; // ignore when target dom is input const inputPattern = /^input|textinput|textarea$/i; if (inputPattern.test(target.tagName) || target.isContentEditable) { return; } // don't fire when not needed if (!event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) { console.log(event.key); this.setState({ userCommand: this.state.userCommand.concat(event.key), }); // filters the corresponding hotkeys(keys) that the user has pressed so far const tempUserCommand = this.state.userCommand; this.processingCommands = this.hotkeyList.filter((value) => { return value.slice(0, tempUserCommand.length).toString() === tempUserCommand.toString(); }); // executes if there were keymap that matches what the user pressed fully. if ((this.processingCommands.length === 1) && (this.hotkeyList.find(ary => ary.toString() === this.state.userCommand.toString()))) { this.props.onDetected(this.processingCommands[0]); this.setState({ userCommand: [], }); } else if (this.processingCommands.toString() === [].toString()) { this.setState({ userCommand: [], }); } } return null; } render() { const keyMap = { check: this.props.keymap }; const handlers = { check: (event) => { return this.check(event) } }; return ( ); } } HotkeysDetector.propTypes = { onDetected: PropTypes.func.isRequired, keymap: PropTypes.array.isRequired, hotkeyList: PropTypes.array.isRequired, };