"use client" import { useState, useRef, useEffect } from "react" import { Button } from "@/components/ui/button" import { Play, Pause, Volume2, VolumeX, Maximize2, Minimize2, Loader2, RefreshCw, AlertCircle, FileVideo, SkipBack, SkipForward, } from "lucide-react" import { Slider } from "@/components/ui/slider" import { formatDuration } from "./media-api" interface VideoPreviewProps { src: string poster?: string filename?: string transcript?: string frameUrls?: string[] className?: string showTranscript?: boolean autoPlay?: boolean } export function VideoPreview({ src, poster, filename, transcript, frameUrls, className = "", showTranscript = true, autoPlay = false, }: VideoPreviewProps) { const videoRef = useRef(null) const containerRef = useRef(null) const [isPlaying, setIsPlaying] = useState(false) const [isMuted, setIsMuted] = useState(false) const [isFullscreen, setIsFullscreen] = useState(false) const [currentTime, setCurrentTime] = useState(0) const [duration, setDuration] = useState(0) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(false) const [volume, setVolume] = useState(1) const [showControls, setShowControls] = useState(true) const [showFrames, setShowFrames] = useState(false) const controlsTimeoutRef = useRef(null) useEffect(() => { const video = videoRef.current if (!video) return const handleLoadedMetadata = () => { setDuration(video.duration) setIsLoading(false) } const handleTimeUpdate = () => { setCurrentTime(video.currentTime) } const handleEnded = () => { setIsPlaying(false) } const handleError = () => { setError(true) setIsLoading(false) } const handleCanPlay = () => { setIsLoading(false) } const handlePlay = () => setIsPlaying(true) const handlePause = () => setIsPlaying(false) video.addEventListener("loadedmetadata", handleLoadedMetadata) video.addEventListener("timeupdate", handleTimeUpdate) video.addEventListener("ended", handleEnded) video.addEventListener("error", handleError) video.addEventListener("canplay", handleCanPlay) video.addEventListener("play", handlePlay) video.addEventListener("pause", handlePause) return () => { video.removeEventListener("loadedmetadata", handleLoadedMetadata) video.removeEventListener("timeupdate", handleTimeUpdate) video.removeEventListener("ended", handleEnded) video.removeEventListener("error", handleError) video.removeEventListener("canplay", handleCanPlay) video.removeEventListener("play", handlePlay) video.removeEventListener("pause", handlePause) } }, [src]) // Handle fullscreen changes useEffect(() => { const handleFullscreenChange = () => { setIsFullscreen(!!document.fullscreenElement) } document.addEventListener("fullscreenchange", handleFullscreenChange) return () => { document.removeEventListener("fullscreenchange", handleFullscreenChange) } }, []) // Auto-hide controls const resetControlsTimeout = () => { if (controlsTimeoutRef.current) { clearTimeout(controlsTimeoutRef.current) } setShowControls(true) if (isPlaying) { controlsTimeoutRef.current = setTimeout(() => { setShowControls(false) }, 3000) } } const togglePlay = () => { const video = videoRef.current if (!video) return if (isPlaying) { video.pause() } else { video.play() } } const toggleMute = () => { const video = videoRef.current if (!video) return video.muted = !isMuted setIsMuted(!isMuted) } const toggleFullscreen = async () => { const container = containerRef.current if (!container) return if (!document.fullscreenElement) { await container.requestFullscreen() } else { await document.exitFullscreen() } } const handleSeek = (value: number[]) => { const video = videoRef.current if (!video) return video.currentTime = value[0] setCurrentTime(value[0]) } const handleVolumeChange = (value: number[]) => { const video = videoRef.current if (!video) return const newVolume = value[0] video.volume = newVolume setVolume(newVolume) setIsMuted(newVolume === 0) } const skip = (seconds: number) => { const video = videoRef.current if (!video) return video.currentTime = Math.max(0, Math.min(duration, video.currentTime + seconds)) } const handleRetry = () => { setError(false) setIsLoading(true) const video = videoRef.current if (video) { video.load() } } if (error) { return (

Failed to load video

) } return (
{/* Header with filename */} {filename && (
{filename}
)} {/* Video container */}
setShowControls(true)} onMouseLeave={() => isPlaying && setShowControls(false)} >
{/* Extracted frames preview */} {frameUrls && frameUrls.length > 0 && (
{showFrames && (
{frameUrls.map((url, idx) => ( {`Frame ))}
)}
)} {/* Transcript section */} {showTranscript && transcript && (

Audio Transcript:

“{transcript}”

)}
) }