/** * Composant AudioPlayer - Intégration complète * Assemble tous les composants du player pour une expérience complète */ import { useRef, useEffect, useState } from 'react'; import { usePlayer } from '../hooks/usePlayer'; import { useStreamSync } from '../hooks/useStreamSync'; import { usePlayerStore } from '../store/playerStore'; import { useKeyboardShortcuts } from '../hooks/useKeyboardShortcuts'; import { TrackInfo } from './TrackInfo'; import { PlayPauseButton } from './PlayPauseButton'; import { NextPreviousButtons } from './NextPreviousButtons'; import { ProgressBar } from './ProgressBar'; import { TimeDisplay } from './TimeDisplay'; import { VolumeControl } from './VolumeControl'; import { RepeatShuffleButtons } from './RepeatShuffleButtons'; import { QualitySelector } from './QualitySelector'; import { PlaybackSpeedControl } from './PlaybackSpeedControl'; import { PlayerError } from './PlayerError'; import { PlayerLoading } from './PlayerLoading'; import { cn } from '@/lib/utils'; import { Badge } from '@/components/ui/badge'; import { Wifi, WifiOff } from 'lucide-react'; import type { AudioQuality } from './QualitySelector'; import type { PlaybackSpeed } from './PlaybackSpeedControl'; export interface AudioPlayerProps { className?: string; autoPlay?: boolean; preload?: 'none' | 'metadata' | 'auto'; showQualitySelector?: boolean; showSpeedControl?: boolean; compact?: boolean; } export function AudioPlayer({ className, autoPlay = false, preload = 'metadata', showQualitySelector = true, showSpeedControl = true, compact = false, }: AudioPlayerProps) { const audioRef = useRef(null); const player = usePlayer(audioRef); const [error, setError] = useState(null); const [isLoading, setIsLoading] = useState(false); const [quality, setQuality] = useState('auto'); const [playbackSpeed, setPlaybackSpeed] = useState(1); const currentTrack = usePlayerStore(state => state.currentTrack); // Intégration de la synchronisation (Session ID mocké pour l'instant ou via props) // Dans le futur, ça viendra du contexte de "Room" ou "Session" // On utilise l'ID de la track comme session ID temporaire pour le dev const sessionId = currentTrack?.id ? `session_${currentTrack.id}` : null; const { isSynced } = useStreamSync({ sessionId, trackId: currentTrack?.id ?? null, }); // Activer les raccourcis clavier useKeyboardShortcuts(player, { enabled: true, seekStep: 5, volumeStep: 5, }); // Gérer le lifecycle de l'élément audio useEffect(() => { const audio = audioRef.current; if (!audio) return; // Configuration initiale audio.preload = preload; audio.autoplay = autoPlay; // Gérer les erreurs const handleError = () => { const error = new Error('Erreur de lecture audio'); setError(error); setIsLoading(false); }; // Gérer le chargement const handleLoadStart = () => { setIsLoading(true); setError(null); }; const handleCanPlay = () => { setIsLoading(false); setError(null); }; // Gérer la vitesse de lecture const updatePlaybackRate = () => { if (audio) { audio.playbackRate = playbackSpeed; } }; audio.addEventListener('error', handleError); audio.addEventListener('loadstart', handleLoadStart); audio.addEventListener('canplay', handleCanPlay); updatePlaybackRate(); return () => { audio.removeEventListener('error', handleError); audio.removeEventListener('loadstart', handleLoadStart); audio.removeEventListener('canplay', handleCanPlay); }; }, [preload, autoPlay, playbackSpeed]); // Mettre à jour la vitesse de lecture quand elle change useEffect(() => { const audio = audioRef.current; if (audio) { audio.playbackRate = playbackSpeed; } }, [playbackSpeed]); const handlePlayPause = () => { if (player.isPlaying) { player.pause(); } else { player.resume(); } }; const handleRetry = () => { setError(null); if (player.currentTrack) { player.play(player.currentTrack); } }; const canGoNext = player.queue.length > 0 && player.currentIndex < player.queue.length - 1; const canGoPrevious = player.queue.length > 0 && player.currentIndex > 0; if (compact) { return (
); } return (
{/* Élément audio HTML - invisible mais nécessaire pour la lecture */}
); } export default AudioPlayer;