react-use
Version:
Collection of React Hooks
49 lines (48 loc) • 1.52 kB
JavaScript
import useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';
import { off, on } from './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(function () {
var keydown = function (event) {
!isFocusedElementEditable() && isTypedCharGood(event) && onStartTyping(event);
};
on(document, 'keydown', keydown);
return function () {
off(document, 'keydown', keydown);
};
}, []);
};
export default useStartTyping;