import {Module} from "@/interfaces"; import {formatTimeInMinutes} from "@/utils/string"; import clsx from "clsx"; import {useEffect, useRef, useState} from "react"; import {BsPauseFill, BsPlayFill} from "react-icons/bs"; import ProgressBar from "./ProgressBar"; interface Props { src: string; color: "red" | "rose" | "purple" | Module; autoPlay?: boolean; disabled?: boolean; onEnd?: () => void; disablePause?: boolean; } export default function AudioPlayer({src, color, autoPlay = false, disabled = false, onEnd, disablePause = false}: Props) { const [isPlaying, setIsPlaying] = useState(false); const [duration, setDuration] = useState(0); const [currentTime, setCurrentTime] = useState(0); const audioPlayerRef = useRef(null); useEffect(() => { const durationInterval = setInterval(() => { if (duration > 0) clearInterval(durationInterval); const seconds = Math.floor(audioPlayerRef?.current?.duration || 0); if (seconds > 0) setDuration(seconds); }, 300); if (duration > 0) clearInterval(durationInterval); return () => { clearInterval(durationInterval); }; }, [duration]); useEffect(() => { let playingInterval: NodeJS.Timer | undefined = undefined; if (isPlaying) { playingInterval = setInterval(() => setCurrentTime((prev) => prev + 1), 1000); } else if (playingInterval) { clearInterval(playingInterval); } return () => { if (playingInterval) clearInterval(playingInterval); }; }, [isPlaying]); const togglePlayPause = () => { const prevValue = isPlaying; setIsPlaying(!prevValue); if (!prevValue) { audioPlayerRef?.current?.play(); } else { audioPlayerRef?.current?.pause(); } }; return (
{isPlaying && ( )} {!isPlaying && ( )}
); }