Files
OpenCut/apps/web/src/lib/scenes.ts
T

104 lines
2.2 KiB
TypeScript
Raw Normal View History

2026-01-31 00:20:04 +01:00
import type { TScene } from "@/types/timeline";
import { generateUUID } from "@/utils/id";
import { calculateTotalDuration } from "@/lib/timeline";
import { ensureMainTrack } from "@/lib/timeline/track-utils";
export function getMainScene({ scenes }: { scenes: TScene[] }): TScene | null {
return scenes.find((scene) => scene.isMain) || null;
}
export function ensureMainScene({ scenes }: { scenes: TScene[] }): TScene[] {
const hasMain = scenes.some((scene) => scene.isMain);
if (!hasMain) {
const mainScene = buildDefaultScene({ name: "Main scene", isMain: true });
return [mainScene, ...scenes];
}
return scenes;
}
export function buildDefaultScene({
name,
isMain,
}: {
name: string;
isMain: boolean;
}): TScene {
const tracks = ensureMainTrack({ tracks: [] });
return {
id: generateUUID(),
name,
isMain,
tracks,
bookmarks: [],
createdAt: new Date(),
updatedAt: new Date(),
};
}
export function canDeleteScene({ scene }: { scene: TScene }): {
canDelete: boolean;
reason?: string;
} {
if (scene.isMain) {
return { canDelete: false, reason: "Cannot delete main scene" };
}
return { canDelete: true };
}
export function getFallbackSceneAfterDelete({
scenes,
deletedSceneId,
currentSceneId,
}: {
scenes: TScene[];
deletedSceneId: string;
currentSceneId: string | null;
}): TScene | null {
if (currentSceneId !== deletedSceneId) {
return scenes.find((s) => s.id === currentSceneId) || null;
}
return getMainScene({ scenes });
}
export function findCurrentScene({
scenes,
currentSceneId,
}: {
scenes: TScene[];
currentSceneId: string;
}): TScene | null {
return (
scenes.find((s) => s.id === currentSceneId) ||
getMainScene({ scenes }) ||
scenes[0] ||
null
);
}
export function getProjectDurationFromScenes({
scenes,
}: {
scenes: TScene[];
}): number {
const mainScene = getMainScene({ scenes }) ?? scenes[0] ?? null;
if (!mainScene) {
return 0;
}
return calculateTotalDuration({ tracks: mainScene.tracks });
}
export function updateSceneInArray({
scenes,
sceneId,
updates,
}: {
scenes: TScene[];
sceneId: string;
updates: Partial<TScene>;
}): TScene[] {
return scenes.map((scene) =>
scene.id === sceneId ? { ...scene, ...updates } : scene,
);
}