'use client' import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import { Drawer } from 'vaul' import { useMusicPlayer, isRadioTrack } from './music-provider' import { DownloadButton } from './download-button' import { PlaylistPicker } from './playlist-picker' import { SyncedLyrics } from './synced-lyrics' import { QueueView } from './queue-view' import { Slider } from '@/components/ui/slider' import { Button } from '@/components/ui/button' import { Play, Pause, SkipBack, SkipForward, ListPlus, ListMusic, Share2, Volume2, VolumeX, ChevronDown, Speaker, Shuffle, Radio, } from 'lucide-react' function formatTime(secs: number) { if (!secs || !isFinite(secs)) return '0:00' const m = Math.floor(secs / 60) const s = Math.floor(secs % 60) return `${m}:${s.toString().padStart(2, '0')}` } export function FullScreenPlayer() { const { state, togglePlay, seek, setVolume, nextTrack, prevTrack, setFullScreen, toggleShuffle, outputDevices, currentOutputId, setOutputDevice } = useMusicPlayer() const router = useRouter() const [lyrics, setLyrics] = useState(null) const [syncedLyrics, setSyncedLyrics] = useState(null) const [loadingLyrics, setLoadingLyrics] = useState(false) const [playlistOpen, setPlaylistOpen] = useState(false) const [queueOpen, setQueueOpen] = useState(false) const track = state.currentTrack const isRadio = track ? isRadioTrack(track) : false // Fetch lyrics when track changes (skip for radio) useEffect(() => { if (!track || isRadioTrack(track)) { setLyrics(null) setSyncedLyrics(null) setLoadingLyrics(false) return } setLyrics(null) setSyncedLyrics(null) setLoadingLyrics(true) fetch(`/api/music/lyrics?artist=${encodeURIComponent(track.artist)}&title=${encodeURIComponent(track.title)}`) .then((r) => r.json()) .then((d) => { setLyrics(d.lyrics) setSyncedLyrics(d.synced || null) }) .catch(() => { setLyrics(null); setSyncedLyrics(null) }) .finally(() => setLoadingLyrics(false)) }, [track?.id]) // eslint-disable-line react-hooks/exhaustive-deps const handleShare = async () => { if (!track) return const text = `${track.title} - ${track.artist}` if (navigator.share) { try { await navigator.share({ title: text, text }) } catch {} } else { await navigator.clipboard.writeText(text) } } return ( <>
{isRadio ? 'Radio Player' : 'Music Player'} {isRadio ? 'Live radio player with station controls' : 'Full-screen music player with controls, lyrics, and playlist management'} {track && (
{/* Close button */} {/* Album art */}
{track.coverArt ? ( {track.album} ) : (
{isRadio ? : }
)}
{/* Title / Artist */}

{track.title}

{track.album}

{/* Progress */}
{isRadio ? ( <>
LIVE
) : ( <> seek(v)} className="mb-2" />
{formatTime(state.progress)} {formatTime(state.duration)}
)}
{/* Controls */}
{!isRadio && ( )}
{/* Volume */}
setVolume(v / 100)} />
{/* Audio output selector */} {outputDevices.length > 1 && (
)} {/* Actions */}
{!isRadio && } {!isRadio && ( )}
{/* Lyrics (hidden for radio) */} {!isRadio && ( loadingLyrics ? (

Loading lyrics...

) : syncedLyrics ? ( ) : lyrics ? (

Lyrics

                        {lyrics}
                      
) : null )}
)} setQueueOpen(false)} /> ) }