summaryrefslogtreecommitdiff
path: root/apps/web/src/hooks/use-editor-actions.ts
diff options
context:
space:
mode:
authorMaze <167211895+mazeincoding@users.noreply.github.com>2026-01-31 00:20:04 +0100
committerGitHub <noreply@github.com>2026-01-31 00:20:04 +0100
commit7bf0984698e43b9aa2dd879f65951318ed410390 (patch)
treeccf2cd590a47d550152afc07129cb55c71a9ec35 /apps/web/src/hooks/use-editor-actions.ts
parent0173db99448d1c4c6415dcf15272e17551b48b04 (diff)
downloadopencut-7bf0984698e43b9aa2dd879f65951318ed410390.tar.gz
codebase overhaul (#697)
Diffstat (limited to 'apps/web/src/hooks/use-editor-actions.ts')
-rw-r--r--apps/web/src/hooks/use-editor-actions.ts241
1 files changed, 0 insertions, 241 deletions
diff --git a/apps/web/src/hooks/use-editor-actions.ts b/apps/web/src/hooks/use-editor-actions.ts
deleted file mode 100644
index 9287d2e0..00000000
--- a/apps/web/src/hooks/use-editor-actions.ts
+++ /dev/null
@@ -1,241 +0,0 @@
-"use client";
-
-import { useEffect } from "react";
-import { useActionHandler } from "@/constants/actions";
-import { useTimelineStore } from "@/stores/timeline-store";
-import { usePlaybackStore } from "@/stores/playback-store";
-import { DEFAULT_FPS, useProjectStore } from "@/stores/project-store";
-import { toast } from "sonner";
-
-export function useEditorActions() {
- const {
- tracks,
- selectedElements,
- clearSelectedElements,
- setSelectedElements,
- deleteSelected,
- splitSelected,
- addElementToTrack,
- snappingEnabled,
- toggleSnapping,
- undo,
- redo,
- } = useTimelineStore();
-
- const { currentTime, duration, isPlaying, toggle, seek } = usePlaybackStore();
- const { activeProject } = useProjectStore();
-
- // Playback actions
- useActionHandler(
- "toggle-play",
- () => {
- toggle();
- },
- undefined
- );
-
- useActionHandler(
- "stop-playback",
- () => {
- if (isPlaying) {
- toggle();
- }
- seek(0);
- },
- undefined
- );
-
- useActionHandler(
- "seek-forward",
- (args) => {
- const seconds = args?.seconds ?? 1;
- seek(Math.min(duration, currentTime + seconds));
- },
- undefined
- );
-
- useActionHandler(
- "seek-backward",
- (args) => {
- const seconds = args?.seconds ?? 1;
- seek(Math.max(0, currentTime - seconds));
- },
- undefined
- );
-
- useActionHandler(
- "frame-step-forward",
- () => {
- const projectFps = activeProject?.fps || DEFAULT_FPS;
- seek(Math.min(duration, currentTime + 1 / projectFps));
- },
- undefined
- );
-
- useActionHandler(
- "frame-step-backward",
- () => {
- const projectFps = activeProject?.fps || DEFAULT_FPS;
- seek(Math.max(0, currentTime - 1 / projectFps));
- },
- undefined
- );
-
- useActionHandler(
- "jump-forward",
- (args) => {
- const seconds = args?.seconds ?? 5;
- seek(Math.min(duration, currentTime + seconds));
- },
- undefined
- );
-
- useActionHandler(
- "jump-backward",
- (args) => {
- const seconds = args?.seconds ?? 5;
- seek(Math.max(0, currentTime - seconds));
- },
- undefined
- );
-
- useActionHandler(
- "goto-start",
- () => {
- seek(0);
- },
- undefined
- );
-
- useActionHandler(
- "goto-end",
- () => {
- seek(duration);
- },
- undefined
- );
-
- // Timeline editing actions
- useActionHandler(
- "split-element",
- () => {
- if (selectedElements.length !== 1) {
- toast.error("Select exactly one element to split");
- return;
- }
-
- const { trackId, elementId } = selectedElements[0];
- const track = tracks.find((t: any) => t.id === trackId);
- const element = track?.elements.find((el: any) => el.id === elementId);
-
- if (element) {
- const effectiveStart = element.startTime;
- const effectiveEnd =
- element.startTime +
- (element.duration - element.trimStart - element.trimEnd);
-
- if (currentTime > effectiveStart && currentTime < effectiveEnd) {
- splitSelected(currentTime, trackId, elementId);
- } else {
- toast.error("Playhead must be within selected element");
- }
- }
- },
- undefined
- );
-
- useActionHandler(
- "delete-selected",
- () => {
- if (selectedElements.length === 0) {
- return;
- }
- deleteSelected();
- },
- undefined
- );
-
- useActionHandler(
- "select-all",
- () => {
- const allElements = tracks.flatMap((track: any) =>
- track.elements.map((element: any) => ({
- trackId: track.id,
- elementId: element.id,
- }))
- );
- setSelectedElements(allElements);
- },
- undefined
- );
-
- useActionHandler(
- "duplicate-selected",
- () => {
- if (selectedElements.length !== 1) {
- toast.error("Select exactly one element to duplicate");
- return;
- }
-
- const { trackId, elementId } = selectedElements[0];
- const track = tracks.find((t: any) => t.id === trackId);
- const element = track?.elements.find((el: any) => el.id === elementId);
-
- if (element) {
- const newStartTime =
- element.startTime +
- (element.duration - element.trimStart - element.trimEnd) +
- 0.1;
- const { id, ...elementWithoutId } = element;
-
- addElementToTrack(trackId, {
- ...elementWithoutId,
- startTime: newStartTime,
- });
- }
- },
- undefined
- );
-
- useActionHandler(
- "copy-selected",
- () => {
- if (selectedElements.length === 0) return;
- useTimelineStore.getState().copySelected();
- },
- undefined
- );
-
- useActionHandler(
- "paste-selected",
- () => {
- useTimelineStore.getState().pasteAtTime(currentTime);
- },
- undefined
- );
-
- useActionHandler(
- "toggle-snapping",
- () => {
- toggleSnapping();
- },
- undefined
- );
-
- // History actions
- useActionHandler(
- "undo",
- () => {
- undo();
- },
- undefined
- );
-
- useActionHandler(
- "redo",
- () => {
- redo();
- },
- undefined
- );
-}