import { cn, isInViewport } from '@/lib/utils' import { useContentPolicy } from '@/providers/ContentPolicyProvider' import mediaManager from '@/services/media-manager.service' import { useEffect, useRef, useState } from 'react' import ExternalLink from '../ExternalLink' import { MediaErrorBoundary } from '../MediaErrorBoundary' export default function VideoPlayer({ src, className }: { src: string; className?: string }) { const { autoplay } = useContentPolicy() const [error, setError] = useState(false) const videoRef = useRef(null) const containerRef = useRef(null) useEffect(() => { if (!autoplay) return const video = videoRef.current const container = containerRef.current if (!video || !container) return const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { setTimeout(() => { if (isInViewport(container)) { mediaManager.autoPlay(video) } }, 200) } else { mediaManager.pause(video) } }, { threshold: 1 } ) observer.observe(container) return () => { observer.unobserve(container) } }, [autoplay]) if (error) { return } return ( } onError={(error) => { // Don't log expected media errors if (error.name !== 'AbortError' && !error.message.includes('play() request was interrupted')) { console.warn('Video player error:', error) } setError(true) }} >
) }