UNPKG

react-use

Version:
49 lines (48 loc) 1.52 kB
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;