'use client' import { useState, useEffect } from 'react' import { Drawer } from 'vaul' import { useMusicPlayer } from './music-provider' import { DownloadButton } from './download-button' import { PlaylistPicker } from './playlist-picker' import { Slider } from '@/components/ui/slider' import { Button } from '@/components/ui/button' import { Play, Pause, SkipBack, SkipForward, ListPlus, Share2, Volume2, VolumeX, ChevronDown, Speaker, } 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, outputDevices, currentOutputId, setOutputDevice } = useMusicPlayer() const [lyrics, setLyrics] = useState(null) const [loadingLyrics, setLoadingLyrics] = useState(false) const [playlistOpen, setPlaylistOpen] = useState(false) const track = state.currentTrack // Fetch lyrics when track changes useEffect(() => { if (!track) return setLyrics(null) setLoadingLyrics(true) fetch(`/api/music/lyrics?artist=${encodeURIComponent(track.artist)}&title=${encodeURIComponent(track.title)}`) .then((r) => r.json()) .then((d) => setLyrics(d.lyrics)) .catch(() => setLyrics(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 ( <>
Music Player Full-screen music player with controls, lyrics, and playlist management {track && (
{/* Close button */} {/* Album art */}
{track.coverArt ? ( {track.album} ) : (
)}
{/* Title / Artist */}

{track.title}

{track.artist}

{track.album}

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

Loading lyrics...

) : lyrics ? (

Lyrics

                      {lyrics}
                    
) : null}
)} ) }