import { Command } from "@/lib/commands/base-command"; import { EditorCore } from "@/core"; import { isVisualElement, updateElementInTracks } from "@/lib/timeline"; import type { TimelineTrack, VisualElement } from "@/lib/timeline"; export function toggleEffectOnElement({ element, effectId, }: { element: VisualElement; effectId: string; }): VisualElement { const currentEffects = element.effects ?? []; const updated = currentEffects.map((effect) => effect.id === effectId ? { ...effect, enabled: !effect.enabled } : effect, ); return { ...element, effects: updated }; } export class ToggleClipEffectCommand extends Command { private savedState: TimelineTrack[] | null = null; private readonly trackId: string; private readonly elementId: string; private readonly effectId: string; constructor({ trackId, elementId, effectId, }: { trackId: string; elementId: string; effectId: string; }) { super(); this.trackId = trackId; this.elementId = elementId; this.effectId = effectId; } execute(): void { const editor = EditorCore.getInstance(); this.savedState = editor.timeline.getTracks(); const updatedTracks = updateElementInTracks({ tracks: this.savedState, trackId: this.trackId, elementId: this.elementId, elementPredicate: isVisualElement, update: (element) => { return toggleEffectOnElement({ element: element as VisualElement, effectId: this.effectId, }); }, }); editor.timeline.updateTracks(updatedTracks); } undo(): void { if (this.savedState) { const editor = EditorCore.getInstance(); editor.timeline.updateTracks(this.savedState); } } }