import { EditorCore } from "@/core"; import { Command, type CommandResult } from "@/lib/commands/base-command"; import type { TimelineElement, TimelineTrack } from "@/lib/timeline"; import { updateElementInTracks } from "@/lib/timeline"; import { applyElementUpdate } from "@/lib/timeline/update-pipeline"; export class UpdateElementsCommand extends Command { private savedState: TimelineTrack[] | null = null; private readonly updates: Array<{ trackId: string; elementId: string; patch: Partial; }>; constructor({ updates, }: { updates: Array<{ trackId: string; elementId: string; patch: Partial; }>; }) { super(); this.updates = updates; } execute(): CommandResult | undefined { const editor = EditorCore.getInstance(); this.savedState = editor.timeline.getTracks(); let updatedTracks = this.savedState; for (const updateEntry of this.updates) { const currentTrack = updatedTracks.find( (track) => track.id === updateEntry.trackId, ); const currentElement = currentTrack?.elements.find( (element) => element.id === updateEntry.elementId, ); if (!currentTrack || !currentElement) { continue; } const nextElement = applyElementUpdate({ element: currentElement, patch: updateEntry.patch, context: { tracks: updatedTracks, trackId: updateEntry.trackId, }, }); updatedTracks = updateElementInTracks({ tracks: updatedTracks, trackId: updateEntry.trackId, elementId: updateEntry.elementId, update: () => nextElement, }); } editor.timeline.updateTracks(updatedTracks); return undefined; } undo(): void { if (this.savedState) { const editor = EditorCore.getInstance(); editor.timeline.updateTracks(this.savedState); } } }