/** * Composant PlaybackSpeedControl * ContrĂ´le de la vitesse de lecture avec dropdown */ import { useState, useRef, useEffect } from 'react'; import { ChevronDown, Check } from 'lucide-react'; import { cn } from '@/lib/utils'; export type PlaybackSpeed = 0.5 | 0.75 | 1 | 1.25 | 1.5 | 1.75 | 2; export interface PlaybackSpeedOption { value: PlaybackSpeed; label: string; } export interface PlaybackSpeedControlProps { currentSpeed: PlaybackSpeed; onSpeedChange: (speed: PlaybackSpeed) => void; className?: string; disabled?: boolean; availableSpeeds?: PlaybackSpeed[]; } const DEFAULT_SPEEDS: PlaybackSpeedOption[] = [ { value: 0.5, label: '0.5x' }, { value: 0.75, label: '0.75x' }, { value: 1, label: '1x' }, { value: 1.25, label: '1.25x' }, { value: 1.5, label: '1.5x' }, { value: 1.75, label: '1.75x' }, { value: 2, label: '2x' }, ]; export function PlaybackSpeedControl({ currentSpeed, onSpeedChange, className, disabled = false, availableSpeeds, }: PlaybackSpeedControlProps) { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); // Filtrer les vitesses disponibles const speeds = availableSpeeds ? DEFAULT_SPEEDS.filter((s) => availableSpeeds.includes(s.value)) : DEFAULT_SPEEDS; const currentSpeedOption = speeds.find((s) => s.value === currentSpeed) || speeds.find((s) => s.value === 1) || speeds[0]; // 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 = (speed: PlaybackSpeed) => { onSpeedChange(speed); setIsOpen(false); }; return (
{/* Button */} {/* Dropdown */} {isOpen && !disabled && (
{speeds.map((speed) => ( ))}
)}
); } export default PlaybackSpeedControl;