|
|
@@ -15,6 +15,13 @@ export default class HotkeysDetector extends React.Component {
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
+ }
|
|
|
this.processingCommands = this.hotkeyList;
|
|
|
|
|
|
if (event.ctrlKey) {
|
|
|
@@ -60,11 +67,32 @@ export default class HotkeysDetector extends React.Component {
|
|
|
this.setState({
|
|
|
userCommand: [],
|
|
|
});
|
|
|
- }
|
|
|
- else if (this.processingCommands.toString() === [].toString()) {
|
|
|
+
|
|
|
+ // don't fire when not needed
|
|
|
+ if (!event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
|
|
|
+ console.log(event.key);
|
|
|
this.setState({
|
|
|
- userCommand: [],
|
|
|
+ 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;
|
|
|
|