/** * Composant VolumeControl * ContrĂ´le du volume avec slider, bouton mute, affichage valeur et persistance */ import React, { useState, useRef, useCallback, useEffect } from 'react'; import { Volume2, VolumeX, Volume1 } from 'lucide-react'; import { cn } from '@/lib/utils'; export interface VolumeControlProps { volume: number; // 0-100 muted: boolean; onVolumeChange: (volume: number) => void; onMuteToggle: () => void; className?: string; disabled?: boolean; showValue?: boolean; showSlider?: boolean; } export function VolumeControl({ volume, muted, onVolumeChange, onMuteToggle, className, disabled = false, showValue = false, showSlider = true, }: VolumeControlProps) { const [isDragging, setIsDragging] = useState(false); const sliderRef = useRef(null); const displayVolume = muted ? 0 : volume; const getTimeFromPosition = useCallback( (clientX: number): number => { if (!sliderRef.current) return volume; const rect = sliderRef.current.getBoundingClientRect(); const x = clientX - rect.left; const percentage = Math.max(0, Math.min(1, x / rect.width)); return Math.round(percentage * 100); }, [volume], ); const handleMouseDown = useCallback( (e: React.MouseEvent) => { if (disabled) return; setIsDragging(true); const newVolume = getTimeFromPosition(e.clientX); onVolumeChange(newVolume); }, [disabled, getTimeFromPosition, onVolumeChange], ); const handleMouseMove = useCallback( (e: MouseEvent) => { if (!isDragging || disabled) return; const newVolume = getTimeFromPosition(e.clientX); onVolumeChange(newVolume); }, [isDragging, disabled, getTimeFromPosition, onVolumeChange], ); const handleMouseUp = useCallback(() => { if (isDragging) { setIsDragging(false); } }, [isDragging]); useEffect(() => { if (isDragging) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; } return undefined; }, [isDragging, handleMouseMove, handleMouseUp]); const getVolumeIcon = () => { if (muted || displayVolume === 0) { return