react-use/src/useStartTyping.ts
Renovate Bot a27f09fd36
chore: refactoring and rearrangement.
More DRY code. Also move non-hooks to separate directories.

BREAKING CHANGE: all `create*` factories been moved to `factory` subdirectory and in case direct import should be imported like `react-use/esm/factory/createBreakpoint`
BREAKING CHANGE: `comps` directory renamed to `component`
2021-01-30 23:30:26 +03:00

57 lines
1.3 KiB
TypeScript

import useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';
import { off, on } from './misc/util';
const isFocusedElementEditable = () => {
const { activeElement, body } = document;
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');
};
const isTypedCharGood = ({ keyCode, metaKey, ctrlKey, altKey }: KeyboardEvent) => {
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;
};
const useStartTyping = (onStartTyping: (event: KeyboardEvent) => void) => {
useIsomorphicLayoutEffect(() => {
const keydown = (event) => {
!isFocusedElementEditable() && isTypedCharGood(event) && onStartTyping(event);
};
on(document, 'keydown', keydown);
return () => {
off(document, 'keydown', keydown);
};
}, []);
};
export default useStartTyping;