'use client'; import { useEffect, useRef, useState } from 'react'; import { usePlayerStore } from '@/store/usePlayerStore'; import { Play, Pause, Volume2, VolumeX, Radio, Music, Maximize2, Minimize2, Video, X } from 'lucide-react'; import { StreamOverlays } from './StreamOverlays'; import videojs from 'video.js'; import 'video.js/dist/video-js.css'; export const GlobalPlayer = ({ initialConfig }: { initialConfig?: any }) => { const { audioUrl, isAudioPlaying, audioVolume, toggleAudio, setAudioUrl, setAudioVolume, isVideoActive, videoUrl, videoType, setVideoActive, setVideoUrl, setVideoType } = usePlayerStore(); const audioRef = useRef(null); const videoRef = useRef(null); const playerRef = useRef(null); const [isMuted, setIsMuted] = useState(false); const [lastVolume, setLastVolume] = useState(audioVolume); const [isExpanded, setIsExpanded] = useState(false); const [hasHydrated, setHasHydrated] = useState(false); // Sync from Layout Config on First Load useEffect(() => { if (initialConfig) { if (initialConfig.radio_url && audioUrl === '') { setAudioUrl(initialConfig.radio_url); } if (initialConfig.tv_url && videoUrl === '') { setVideoUrl(initialConfig.tv_url); setVideoType(initialConfig.tv_url.includes('youtube.com') || initialConfig.tv_url.includes('youtu.be') ? 'youtube' : 'm3u8'); } } setHasHydrated(true); }, [initialConfig, setAudioUrl, setVideoUrl, setVideoType]); // Sync Audio State useEffect(() => { if (!audioRef.current) return; if (isAudioPlaying) { audioRef.current.play().catch(e => { console.error("Audio playback error:", e); toggleAudio(false); }); } else { audioRef.current.pause(); } }, [isAudioPlaying, audioUrl, toggleAudio]); // Handle Video Player Initialization useEffect(() => { if (isVideoActive && videoRef.current && videoType === 'm3u8') { // Cleanup previous if exists if (playerRef.current) { playerRef.current.dispose(); playerRef.current = null; } const videoElement = document.createElement('video-js'); videoElement.classList.add('vjs-big-play-centered', 'vjs-almeira'); videoRef.current.innerHTML = ''; videoRef.current.appendChild(videoElement); const player = playerRef.current = videojs(videoElement, { autoplay: true, controls: true, responsive: true, fluid: true, sources: [{ src: videoUrl || 'https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8', type: 'application/x-mpegURL' }] }); // Cuando el video está activo, bajamos el volumen de la radio if (isAudioPlaying) setAudioVolume(0.1); } return () => { if (playerRef.current) { playerRef.current.dispose(); playerRef.current = null; } }; }, [isVideoActive, videoUrl, videoType]); // Sync Volume useEffect(() => { if (audioRef.current) { audioRef.current.volume = isMuted ? 0 : audioVolume; } }, [audioVolume, isMuted]); const handleToggleMute = () => { if (isMuted) { setIsMuted(false); setAudioVolume(lastVolume); } else { setLastVolume(audioVolume); setIsMuted(true); setAudioVolume(0); } }; return ( <> {/* Hidden Audio Element */}