import { FC, useEffect, useRef, useState } from "react"; interface AudioPlayerProps { src: string; } export const AudioPlayer: FC = ({ src }) => { const [isPlaying, setIsPlaying] = useState(false); const [currentTime, setCurrentTime] = useState(0); const [duration, setDuration] = useState(0); const audioRef = useRef(null); const rangeRef = useRef(null); useEffect(() => { const audio = audioRef.current; if (!audio) return; const handleLoadedMetadata = () => { setDuration(audio.duration); }; const handleTimeUpdate = () => { setCurrentTime(audio.currentTime); updateRangeBackground(audio.currentTime); }; audio.addEventListener("loadedmetadata", handleLoadedMetadata); audio.addEventListener("timeupdate", handleTimeUpdate); return () => { audio.removeEventListener("loadedmetadata", handleLoadedMetadata); audio.removeEventListener("timeupdate", handleTimeUpdate); }; }, []); const togglePlayPause = () => { const audio = audioRef.current; if (!audio) return; if (isPlaying) { audio.pause(); } else { audio.play(); } setIsPlaying(!isPlaying); }; const handleSliderChange = (e: React.ChangeEvent) => { const audio = audioRef.current; if (!audio) return; const newTime = parseFloat(e.target.value); audio.currentTime = newTime; setCurrentTime(newTime); updateRangeBackground(newTime); }; const formatTime = (time: number): string => { const minutes = Math.floor(time / 60); const seconds = Math.floor(time % 60); return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`; }; const updateRangeBackground = (currentTime: number) => { if (rangeRef.current) { const percentage = (currentTime / duration) * 100; rangeRef.current.style.setProperty( "--value-percentage", `${percentage}%`, ); } }; return (
); };