"use client"; import { useEffect, useRef, useCallback } from "react"; import { PanelView } from "@/components/editor/panels/assets/views/base-panel"; import { DraggableItem } from "@/components/editor/panels/assets/draggable-item"; import { effectsRegistry, EFFECT_TARGET_ELEMENT_TYPES } from "@/effects"; import { effectPreviewService } from "@/services/renderer/effect-preview"; import { useEditor } from "@/editor/use-editor"; import { buildEffectElement } from "@/timeline/element-utils"; import type { EffectDefinition } from "@/effects/types"; export function EffectsView() { const effects = effectsRegistry.getAll(); return ( ); } function EffectsGrid({ effects }: { effects: EffectDefinition[] }) { return (
{effects.map((effect) => ( ))}
); } function EffectPreviewCanvas({ effectType }: { effectType: string }) { const canvasRef = useRef(null); useEffect(() => { const render = () => { if (canvasRef.current) { effectPreviewService.renderPreview({ effectType, params: {}, targetCanvas: canvasRef.current, }); } }; render(); return effectPreviewService.onPreviewImageReady({ callback: render }); }, [effectType]); return ; } function EffectItem({ effect }: { effect: EffectDefinition }) { const editor = useEditor(); const handleAddToTimeline = useCallback(() => { const currentTime = editor.playback.getCurrentTime(); const element = buildEffectElement({ effectType: effect.type, startTime: currentTime, }); editor.timeline.insertElement({ placement: { mode: "auto", trackType: "effect" }, element, }); }, [editor, effect.type]); const preview = ; return ( ); }