summaryrefslogtreecommitdiff
path: root/apps/web/src/hooks/use-keybindings.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
commit3e89d2998588f8e35c524e523ba2ee853f0f6475 (patch)
tree57221f96c1259b3b07e3ddf8c1adefc502b9d8eb /apps/web/src/hooks/use-keybindings.ts
parent729d10592f4e802f91c555c309ff3ba4b119f843 (diff)
downloadopencut-3e89d2998588f8e35c524e523ba2ee853f0f6475.tar.gz
refactor: restructure files to their domains, new preview overlay system, and dep graph
Diffstat (limited to 'apps/web/src/hooks/use-keybindings.ts')
-rw-r--r--apps/web/src/hooks/use-keybindings.ts87
1 files changed, 0 insertions, 87 deletions
diff --git a/apps/web/src/hooks/use-keybindings.ts b/apps/web/src/hooks/use-keybindings.ts
deleted file mode 100644
index 0c524214..00000000
--- a/apps/web/src/hooks/use-keybindings.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { useEffect } from "react";
-import { invokeAction } from "@/lib/actions";
-import { useEditor } from "@/hooks/use-editor";
-import { useKeybindingsStore } from "@/stores/keybindings-store";
-import { isTypableDOMElement } from "@/utils/browser";
-
-/**
- * a composable that hooks to the caller component's
- * lifecycle and hooks to the keyboard events to fire
- * the appropriate actions based on keybindings
- */
-export function useKeybindingsListener() {
- const editor = useEditor();
- const {
- keybindings,
- getKeybindingString,
- overlayDepth,
- isLoadingProject,
- isRecording,
- } = useKeybindingsStore();
-
- useEffect(() => {
- const eventOptions: AddEventListenerOptions = { capture: true };
- const handleKeyDown = (ev: KeyboardEvent) => {
- const normalizedKey = (ev.key ?? "").toLowerCase();
-
- if (overlayDepth > 0 || isLoadingProject || isRecording) {
- return;
- }
-
- const binding = getKeybindingString(ev);
- const activeElement = document.activeElement;
- const isTextInput =
- activeElement instanceof HTMLElement &&
- isTypableDOMElement({ element: activeElement });
- const boundAction = binding ? keybindings[binding] : undefined;
-
- if (normalizedKey === "escape" && isTextInput) {
- activeElement.blur();
- return;
- }
-
- if (!binding) return;
- if (!boundAction) return;
-
- if (isTextInput) return;
- if (boundAction === "paste-copied") {
- if (!editor.clipboard.hasEntry()) return;
- ev.preventDefault();
- invokeAction("paste-copied", undefined, "keypress");
- return;
- }
-
- ev.preventDefault();
-
- switch (boundAction) {
- case "seek-forward":
- invokeAction("seek-forward", { seconds: 1 }, "keypress");
- break;
- case "seek-backward":
- invokeAction("seek-backward", { seconds: 1 }, "keypress");
- break;
- case "jump-forward":
- invokeAction("jump-forward", { seconds: 5 }, "keypress");
- break;
- case "jump-backward":
- invokeAction("jump-backward", { seconds: 5 }, "keypress");
- break;
- default:
- invokeAction(boundAction, undefined, "keypress");
- }
- };
-
- document.addEventListener("keydown", handleKeyDown, eventOptions);
-
- return () => {
- document.removeEventListener("keydown", handleKeyDown, eventOptions);
- };
- }, [
- keybindings,
- getKeybindingString,
- overlayDepth,
- isLoadingProject,
- isRecording,
- editor,
- ]);
-}