import React, { useRef, useState, useEffect } from 'react'; import { Play, Pause, Volume2, VolumeX, Maximize, Minimize } from 'lucide-react'; interface VideoPlayerProps { src: string; poster?: string; className?: string; autoPlay?: boolean; muted?: boolean; loop?: boolean; controls?: boolean; width?: string | number; height?: string | number; } export const VideoPlayer: React.FC = ({ src, poster, className = '', autoPlay = false, muted = false, loop = false, controls = true, width = '100%', height = 'auto' }) => { const videoRef = useRef(null); const [isPlaying, setIsPlaying] = useState(false); const [isMuted, setIsMuted] = useState(muted); const [isFullscreen, setIsFullscreen] = useState(false); const [progress, setProgress] = useState(0); const [currentTime, setCurrentTime] = useState(0); const [duration, setDuration] = useState(0); const [showControls, setShowControls] = useState(true); const controlsTimeoutRef = useRef(); useEffect(() => { const video = videoRef.current; if (!video) return; const handleTimeUpdate = () => { setCurrentTime(video.currentTime); setProgress((video.currentTime / video.duration) * 100 || 0); }; const handleLoadedMetadata = () => { setDuration(video.duration); }; const handlePlay = () => setIsPlaying(true); const handlePause = () => setIsPlaying(false); const handleEnded = () => setIsPlaying(false); video.addEventListener('timeupdate', handleTimeUpdate); video.addEventListener('loadedmetadata', handleLoadedMetadata); video.addEventListener('play', handlePlay); video.addEventListener('pause', handlePause); video.addEventListener('ended', handleEnded); return () => { video.removeEventListener('timeupdate', handleTimeUpdate); video.removeEventListener('loadedmetadata', handleLoadedMetadata); video.removeEventListener('play', handlePlay); video.removeEventListener('pause', handlePause); video.removeEventListener('ended', handleEnded); }; }, []); const togglePlayPause = () => { 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 = !video.muted; setIsMuted(!isMuted); }; const toggleFullscreen = async () => { const video = videoRef.current; if (!video) return; try { if (!isFullscreen) { if (video.requestFullscreen) { await video.requestFullscreen(); } setIsFullscreen(true); } else { if (document.exitFullscreen) { await document.exitFullscreen(); } setIsFullscreen(false); } } catch (error) { console.error('Error toggling fullscreen:', error); } }; const handleProgressClick = (e: React.MouseEvent) => { const video = videoRef.current; if (!video) return; const rect = e.currentTarget.getBoundingClientRect(); const pos = (e.clientX - rect.left) / rect.width; video.currentTime = pos * video.duration; }; const formatTime = (seconds: number): string => { if (!seconds || isNaN(seconds)) return '0:00'; const mins = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); return `${mins}:${secs.toString().padStart(2, '0')}`; }; const handleMouseMove = () => { setShowControls(true); if (controlsTimeoutRef.current) { clearTimeout(controlsTimeoutRef.current); } controlsTimeoutRef.current = setTimeout(() => { if (isPlaying) { setShowControls(false); } }, 3000); }; useEffect(() => { return () => { if (controlsTimeoutRef.current) { clearTimeout(controlsTimeoutRef.current); } }; }, []); return (
isPlaying && setShowControls(false)} >