useKeyPress.tsx 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import {useEffect, useState} from 'react';
  2. /**
  3. * Hook to detect when a specific key is being pressed
  4. */
  5. const useKeyPress = (
  6. targetKey: string,
  7. target?: HTMLElement,
  8. preventDefault?: boolean
  9. ) => {
  10. const [keyPressed, setKeyPressed] = useState(false);
  11. const current = target ?? document.body;
  12. useEffect(() => {
  13. const downHandler = (event: KeyboardEvent) => {
  14. if (event.key === targetKey) {
  15. setKeyPressed(true);
  16. if (preventDefault) {
  17. event.preventDefault();
  18. }
  19. }
  20. };
  21. const upHandler = (event: KeyboardEvent) => {
  22. if (event.key === targetKey) {
  23. setKeyPressed(false);
  24. if (preventDefault) {
  25. event.preventDefault();
  26. }
  27. }
  28. };
  29. current.addEventListener('keydown', downHandler);
  30. current.addEventListener('keyup', upHandler);
  31. return () => {
  32. current.removeEventListener('keydown', downHandler);
  33. current.removeEventListener('keyup', upHandler);
  34. };
  35. }, [targetKey, current, preventDefault]);
  36. return keyPressed;
  37. };
  38. export default useKeyPress;