import { useState, useRef, useCallback } from 'react'; import { createPortal } from 'react-dom'; import { usePlayer } from '@/features/player/hooks/usePlayer'; import { useKeyboardShortcuts } from '@/features/player/hooks/useKeyboardShortcuts'; import { useAudioAnalyser } from '@/features/player/hooks/useAudioAnalyser'; import { useMediaSession } from '@/features/player/hooks/useMediaSession'; import { useUIStore } from '@/stores/ui'; import { formatTime } from '@/features/player/services/playerService'; import { PlayerControls } from './PlayerControls'; import { PlayerQueue } from './PlayerQueue'; import { PlayerExpanded } from './PlayerExpanded'; import { PlayerBarGlass, PlayerBarTrackInfo, PlayerBarProgress, PlayerBarRight, } from './player-bar'; import { PlaybackSpeedControl } from './PlaybackSpeedControl'; import { cn } from '@/lib/utils'; const IDLE_TRACK = { id: 'idle', title: 'System Online', artist: 'Select a track to play', cover: '', duration: 0, url: '', }; export function GlobalPlayer() { const audioRef = useRef(null); const [audioEl, setAudioEl] = useState(null); const setAudioRef = useCallback((el: HTMLAudioElement | null) => { (audioRef as React.MutableRefObject).current = el; setAudioEl(el); }, []); const { sidebarOpen } = useUIStore(); const player = usePlayer(audioRef); useKeyboardShortcuts(player); useMediaSession({ track: currentTrack ?? null, isPlaying: player.isPlaying, onPlay: () => !isIdle && player.resume(), onPause: player.pause, onPrevious: player.previous, onNext: player.next, }); const [isHovered, setIsHovered] = useState(false); const [isExpanded, setIsExpanded] = useState(false); const [showQueue, setShowQueue] = useState(false); const waveformLevels = useAudioAnalyser(audioEl, player.isPlaying); const currentTrack = player.currentTrack; const displayTrack = currentTrack || IDLE_TRACK; const isIdle = !currentTrack; return ( <>