summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/timeline/placement/apply.ts
blob: 4ff5d50daf97ae5271c3d5d660574c422389eb15 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 };
}