summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/timeline/placement/apply.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-03-31 15:47:30 +0200
committerMaze Winther <mazewinther@gmail.com>2026-03-31 15:47:30 +0200
commit70a6d58b8432e455ab1443d45bc23dd70b363bea (patch)
treeb4bcdb88b87cbd2cd295c54cde013f38481c7f2a /apps/web/src/lib/timeline/placement/apply.ts
parent5cc6abc3a44c9d046a1cb71a8c916f1d35827e8f (diff)
downloadopencut-70a6d58b8432e455ab1443d45bc23dd70b363bea.tar.gz
refactor: centralize track placement into its own module
Diffstat (limited to 'apps/web/src/lib/timeline/placement/apply.ts')
-rw-r--r--apps/web/src/lib/timeline/placement/apply.ts45
1 files changed, 45 insertions, 0 deletions
diff --git a/apps/web/src/lib/timeline/placement/apply.ts b/apps/web/src/lib/timeline/placement/apply.ts
new file mode 100644
index 00000000..4ff5d50d
--- /dev/null
+++ b/apps/web/src/lib/timeline/placement/apply.ts
@@ -0,0 +1,45 @@
+import type { TimelineElement, TimelineTrack } from "@/lib/timeline";
+import { generateUUID } from "@/utils/id";
+import { buildEmptyTrack } from "./track-factory";
+import type { PlacementResult } from "./types";
+
+export function applyPlacement({
+ tracks,
+ placementResult,
+ elements,
+ newTrackInsertIndexOverride,
+}: {
+ tracks: TimelineTrack[];
+ placementResult: PlacementResult;
+ elements: TimelineElement[];
+ newTrackInsertIndexOverride?: number;
+}): { updatedTracks: TimelineTrack[]; targetTrackId: string } | null {
+ if (placementResult.kind === "existingTrack") {
+ const targetTrack = tracks[placementResult.trackIndex];
+ if (!targetTrack) {
+ return null;
+ }
+
+ const updatedTracks = tracks.map((track, trackIndex) =>
+ trackIndex === placementResult.trackIndex
+ ? {
+ ...track,
+ elements: [...track.elements, ...elements],
+ }
+ : track,
+ ) as TimelineTrack[];
+
+ return { updatedTracks, targetTrackId: targetTrack.id };
+ }
+
+ const newTrackId = generateUUID();
+ const newTrack = {
+ ...buildEmptyTrack({ id: newTrackId, type: placementResult.trackType }),
+ elements,
+ } as TimelineTrack;
+ const insertIndex =
+ newTrackInsertIndexOverride ?? placementResult.insertIndex;
+ const updatedTracks = [...tracks];
+ updatedTracks.splice(insertIndex, 0, newTrack);
+ return { updatedTracks, targetTrackId: newTrackId };
+}