/** * Composant QualitySelector * Sélecteur de qualité audio avec dropdown */ import { useState, useRef, useEffect } from 'react'; import { ChevronDown, Check } from 'lucide-react'; import { cn } from '@/lib/utils'; export type AudioQuality = 'auto' | 'low' | 'medium' | 'high' | 'lossless'; export interface QualityOption { value: AudioQuality; label: string; description?: string; } export interface QualitySelectorProps { currentQuality: AudioQuality; availableQualities?: AudioQuality[]; onQualityChange: (quality: AudioQuality) => void; className?: string; disabled?: boolean; } const DEFAULT_QUALITIES: QualityOption[] = [ { value: 'auto', label: 'Auto', description: 'Qualité automatique' }, { value: 'low', label: 'Faible', description: '128 kbps' }, { value: 'medium', label: 'Moyenne', description: '256 kbps' }, { value: 'high', label: 'Haute', description: '320 kbps' }, { value: 'lossless', label: 'Sans perte', description: 'FLAC / WAV' }, ]; export function QualitySelector({ currentQuality, availableQualities, onQualityChange, className, disabled = false, }: QualitySelectorProps) { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); // Filtrer les qualités disponibles const qualities = availableQualities ? DEFAULT_QUALITIES.filter((q) => availableQualities.includes(q.value)) : DEFAULT_QUALITIES; const currentQualityOption = qualities.find((q) => q.value === currentQuality) ?? qualities[0] ?? { value: currentQuality, label: currentQuality }; // Fermer le dropdown quand on clique en dehors useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; } return undefined; }, [isOpen]); const handleSelect = (quality: AudioQuality) => { onQualityChange(quality); setIsOpen(false); }; return (
{/* Button */} {/* Dropdown */} {isOpen && !disabled && (
{qualities.map((quality) => ( ))}
)}
); } export default QualitySelector;