52 lines
1.6 KiB
JavaScript
52 lines
1.6 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var tslib_1 = require("tslib");
|
|
var useIsomorphicLayoutEffect_1 = tslib_1.__importDefault(require("./useIsomorphicLayoutEffect"));
|
|
var util_1 = require("./misc/util");
|
|
var isFocusedElementEditable = function () {
|
|
var activeElement = document.activeElement, body = document.body;
|
|
if (!activeElement) {
|
|
return false;
|
|
}
|
|
// If not element has focus, we assume it is not editable, too.
|
|
if (activeElement === body) {
|
|
return false;
|
|
}
|
|
// Assume <input> and <textarea> elements are editable.
|
|
switch (activeElement.tagName) {
|
|
case 'INPUT':
|
|
case 'TEXTAREA':
|
|
return true;
|
|
}
|
|
// Check if any other focused element id editable.
|
|
return activeElement.hasAttribute('contenteditable');
|
|
};
|
|
var isTypedCharGood = function (_a) {
|
|
var keyCode = _a.keyCode, metaKey = _a.metaKey, ctrlKey = _a.ctrlKey, altKey = _a.altKey;
|
|
if (metaKey || ctrlKey || altKey) {
|
|
return false;
|
|
}
|
|
// 0...9
|
|
if (keyCode >= 48 && keyCode <= 57) {
|
|
return true;
|
|
}
|
|
// a...z
|
|
if (keyCode >= 65 && keyCode <= 90) {
|
|
return true;
|
|
}
|
|
// All other keys.
|
|
return false;
|
|
};
|
|
var useStartTyping = function (onStartTyping) {
|
|
useIsomorphicLayoutEffect_1.default(function () {
|
|
var keydown = function (event) {
|
|
!isFocusedElementEditable() && isTypedCharGood(event) && onStartTyping(event);
|
|
};
|
|
util_1.on(document, 'keydown', keydown);
|
|
return function () {
|
|
util_1.off(document, 'keydown', keydown);
|
|
};
|
|
}, []);
|
|
};
|
|
exports.default = useStartTyping;
|