import React, { useEffect, useMemo, useState } from 'react'; import ReactPlayer from 'react-player'; import { getThumb, safeTitle } from './utils.js'; import { useToasts } from './Toasts.jsx'; export default function Player({ socket, roomId, state, isHost }) { const { push } = useToasts(); const [useProxy, setUseProxy] = useState(false); const mediaUrl = useMemo(() => { if (!state?.track?.url) return ''; return useProxy ? `/api/proxy?url=${encodeURIComponent(state.track.url)}` : state.track.url; }, [state?.track?.url, useProxy]); const title = state?.track ? safeTitle(state.track) : 'No track selected'; const thumb = state?.track?.thumb || getThumb(state?.track?.meta); // Auto-advance when ended (host only) const handleEnded = () => { if (isHost) socket.emit('ended', { roomId }); }; const handleError = (e) => { console.warn('ReactPlayer error', e); if (!useProxy) { setUseProxy(true); push('CORS blocked direct URL, retrying via proxy…', 'warn', 3000); } else { push('Playback failed (even via proxy)', 'bad', 4000); } }; return (
{title}
{state?.track?.meta?.artists?.join?.(', ') || state?.track?.meta?.artist || state?.track?.meta?.album || state?.track?.kind?.toUpperCase()}
{!isHost &&
Listener
}
{state?.track?.url ? ( ) : (
No track selected
)} {useProxy && (
Using proxy due to CORS on the original media URL.
)}
); }