MCPcopy Create free account
hub / github.com/codicocodes/speedtyper.dev / useKeyMap

Function useKeyMap

packages/webapp-next/hooks/useKeyMap.ts:11–59  ·  view source on GitHub ↗
(
  isActive: boolean,
  selectedKeys: string,
  callback: () => void
)

Source from the content-addressed store, hash-verified

9export const triggerKeys = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*() ";
10
11export const useKeyMap = (
12 isActive: boolean,
13 selectedKeys: string,
14 callback: () => void
15) => {
16 const [capsLockActive, setCapsLockActive] = useState(false);
17
18 useEffect(() => {
19 const handleKeyDown = (e: KeyboardEvent) => {
20 const { key: pressedKey } = e;
21 if (pressedKey === "CapsLock") {
22 setCapsLockActive(!capsLockActive);
23 }
24 if (
25 Object.values(Keys)
26 .map((en) => en.toString())
27 .includes(selectedKeys)
28 ) {
29 if (pressedKey !== selectedKeys) return;
30 e.preventDefault();
31 callback();
32 return;
33 }
34 if (!selectedKeys.includes(pressedKey)) return;
35 e.preventDefault();
36 callback();
37 };
38
39 const handleCapsLock = (e: KeyboardEvent) => {
40 setCapsLockActive(e.getModifierState("CapsLock"));
41 };
42
43 if (window && document) {
44 if (isActive) {
45 document.addEventListener("keydown", handleKeyDown);
46 document.addEventListener("keydown", handleCapsLock);
47 return () => {
48 document.removeEventListener("keydown", handleKeyDown);
49 document.removeEventListener("keydown", handleCapsLock);
50 };
51 } else {
52 document.removeEventListener("keydown", handleKeyDown);
53 document.removeEventListener("keydown", handleCapsLock);
54 }
55 }
56 }, [isActive, callback, selectedKeys, capsLockActive]);
57
58 return { capsLockActive };
59};

Callers 4

ActionButtonsFunction · 0.90
CodeTypingContainerFunction · 0.90
Play2PageFunction · 0.90
OverlayFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected