import { cn } from '@/lib/utils' import mediaManager from '@/services/media-manager.service' import { YouTubePlayer } from '@/types/youtube' import { useEffect, useMemo, useRef } from 'react' export default function YoutubeEmbeddedPlayer({ url, className }: { url: string className?: string }) { const videoId = useMemo(() => extractVideoId(url), [url]) const playerRef = useRef(null) const containerRef = useRef(null) useEffect(() => { if (!videoId || !containerRef.current) return if (!window.YT) { const script = document.createElement('script') script.src = 'https://www.youtube.com/iframe_api' document.body.appendChild(script) window.onYouTubeIframeAPIReady = () => { initPlayer() } } else { initPlayer() } function initPlayer() { try { if (!videoId || !containerRef.current || !window.YT.Player) return playerRef.current = new window.YT.Player(containerRef.current, { videoId: videoId, events: { onStateChange: (event: any) => { if (event.data === window.YT.PlayerState.PLAYING) { mediaManager.play(playerRef.current) } else if (event.data === window.YT.PlayerState.PAUSED) { mediaManager.pause(playerRef.current) } } } }) } catch (error) { console.error('Failed to initialize YouTube player:', error) return } } return () => { if (playerRef.current) { playerRef.current.destroy() } } }, [videoId]) if (!videoId) { return ( {url} ) } return (
) } function extractVideoId(url: string) { const patterns = [ /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([^&\n?#]+)/, /youtube\.com\/watch\?.*v=([^&\n?#]+)/ ] for (const pattern of patterns) { const match = url.match(pattern) if (match) return match[1] } return null }