"use client"; import { useRef, useEffect, useState, useCallback } from "react"; interface AudioPlayerProps { audioUrl: string; duration: number; currentTime: number; onTimeUpdate: (time: number) => void; onPlayingChange: (playing: boolean) => void; } function formatTime(seconds: number): string { const mins = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); return `${mins}:${secs.toString().padStart(2, "0")}`; } export default function AudioPlayer({ audioUrl, duration, currentTime, onTimeUpdate, onPlayingChange, }: AudioPlayerProps) { const audioRef = useRef(null); const [isPlaying, setIsPlaying] = useState(false); const [internalTime, setInternalTime] = useState(0); useEffect(() => { const audio = audioRef.current; if (!audio) return; const handleTimeUpdate = () => { setInternalTime(audio.currentTime); onTimeUpdate(audio.currentTime); }; const handlePlay = () => { setIsPlaying(true); onPlayingChange(true); }; const handlePause = () => { setIsPlaying(false); onPlayingChange(false); }; const handleEnded = () => { setIsPlaying(false); onPlayingChange(false); }; audio.addEventListener("timeupdate", handleTimeUpdate); audio.addEventListener("play", handlePlay); audio.addEventListener("pause", handlePause); audio.addEventListener("ended", handleEnded); return () => { audio.removeEventListener("timeupdate", handleTimeUpdate); audio.removeEventListener("play", handlePlay); audio.removeEventListener("pause", handlePause); audio.removeEventListener("ended", handleEnded); }; }, [onTimeUpdate, onPlayingChange]); // Seek to currentTime when it changes externally useEffect(() => { const audio = audioRef.current; if (!audio) return; // Only seek if the difference is significant (user clicked timeline) if (Math.abs(audio.currentTime - currentTime) > 0.5) { audio.currentTime = currentTime; } }, [currentTime]); const togglePlay = useCallback(() => { const audio = audioRef.current; if (!audio) return; if (isPlaying) { audio.pause(); } else { audio.play(); } }, [isPlaying]); const handleSeek = useCallback((e: React.ChangeEvent) => { const audio = audioRef.current; if (!audio) return; const newTime = parseFloat(e.target.value); audio.currentTime = newTime; setInternalTime(newTime); onTimeUpdate(newTime); }, [onTimeUpdate]); return (
); }