diff --git a/src/components/VideoPreview.tsx b/src/components/VideoPreview.tsx index b985f5cf..e8b6e111 100644 --- a/src/components/VideoPreview.tsx +++ b/src/components/VideoPreview.tsx @@ -5,9 +5,10 @@ import { useEffect, useRef, useState, useCallback, RefObject } from "react"; import { EditRecipe, TextOverlay, TimelineTrack, MultiTrackEditorState } from "@/lib/types"; import { getPresetById } from "@/lib/presets"; import { cn } from "@/lib/utils"; -import { Camera } from "lucide-react"; +import { Camera, Play } from "lucide-react"; import ComparisonPreview from "./ComparisonPreview"; import DraggableTextOverlays from "./DraggableTextOverlays"; +import { useCanvasPreview } from "@/hooks/useCanvasPreview"; interface Props { file: File | null; @@ -37,12 +38,25 @@ export default function VideoPreview({ const [showOverlay, setShowOverlay] = useState(false); const [showComparison, setShowComparison] = useState(false); const [showGridOverlay, setShowGridOverlay] = useState(false); + const [livePreview, setLivePreview] = useState(true); + const [isPaused, setIsPaused] = useState(false); const [containerDimensions, setContainerDimensions] = useState({ width: 0, height: 0, }); const previewContainerRef = useRef(null); + const canvasRef = useRef(null); const onLoadedRef = useRef<(() => void) | null>(null); + + // Canvas live preview: mirror the video frame with rotation/framing/colour + // applied so edits show instantly. Export stays FFmpeg-based (preview only). + useCanvasPreview({ + videoRef, + canvasRef, + containerRef: previewContainerRef, + recipe, + enabled: livePreview, + }); // Phase 1 MVP: Multi-track URL management const multiTrackUrlRefs = useRef>({}); @@ -167,6 +181,31 @@ export default function VideoPreview({ videoRef.current.playbackRate = recipe.speed; }, [recipe, videoRef]); + // Track play/pause so the live-preview overlay can show a play affordance + // (the native