summaryrefslogtreecommitdiff
path: root/apps/web/src/hooks
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2025-06-24 17:51:34 +0200
committerMaze Winther <mazewinther@gmail.com>2025-06-24 17:51:34 +0200
commit2aa37920d5f183f9c0de2c42076fa57c5b48320e (patch)
tree2bde61eddd07d43027ed65478222b70314800403 /apps/web/src/hooks
parentc3df43b8c8bf281da022514b665b532928f1fbd0 (diff)
downloadopencut-2aa37920d5f183f9c0de2c42076fa57c5b48320e.tar.gz
refactor: overhaul timeline component, separate into different files
Diffstat (limited to 'apps/web/src/hooks')
-rw-r--r--apps/web/src/hooks/use-keyboard-shortcuts.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/apps/web/src/hooks/use-keyboard-shortcuts.ts b/apps/web/src/hooks/use-keyboard-shortcuts.ts
new file mode 100644
index 00000000..5fd81bff
--- /dev/null
+++ b/apps/web/src/hooks/use-keyboard-shortcuts.ts
@@ -0,0 +1,51 @@
+import { useEffect } from "react";
+import { useTimelineStore } from "@/stores/timeline-store";
+
+export function useKeyboardShortcuts() {
+ const { selectedClips, removeClipFromTrack, clearSelectedClips, undo, redo } =
+ useTimelineStore();
+
+ // Delete/Backspace - Delete selected clips
+ useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if (
+ (e.key === "Delete" || e.key === "Backspace") &&
+ selectedClips.length > 0
+ ) {
+ selectedClips.forEach(({ trackId, clipId }) => {
+ removeClipFromTrack(trackId, clipId);
+ });
+ clearSelectedClips();
+ }
+ };
+ window.addEventListener("keydown", handleKeyDown);
+ return () => window.removeEventListener("keydown", handleKeyDown);
+ }, [selectedClips, removeClipFromTrack, clearSelectedClips]);
+
+ // Cmd+Z / Ctrl+Z - Undo
+ useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if ((e.metaKey || e.ctrlKey) && e.key === "z" && !e.shiftKey) {
+ e.preventDefault();
+ undo();
+ }
+ };
+ window.addEventListener("keydown", handleKeyDown);
+ return () => window.removeEventListener("keydown", handleKeyDown);
+ }, [undo]);
+
+ // Cmd+Shift+Z / Ctrl+Shift+Z or Cmd+Y / Ctrl+Y - Redo
+ useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if ((e.metaKey || e.ctrlKey) && e.key === "z" && e.shiftKey) {
+ e.preventDefault();
+ redo();
+ } else if ((e.metaKey || e.ctrlKey) && e.key === "y") {
+ e.preventDefault();
+ redo();
+ }
+ };
+ window.addEventListener("keydown", handleKeyDown);
+ return () => window.removeEventListener("keydown", handleKeyDown);
+ }, [redo]);
+}