import { Audio } from "cloudinary-react"; import { AnimatePresence, motion } from "framer-motion"; import React, { useRef, useState, useMemo } from "react"; import CTAIconWrapper from "../../globals/CTAIconWrapper"; import MessageReadStatus from "./MessageReadStatus"; function VoiceMessage({ voiceDuration, messageReceived, deliveredStatus, readStatus, time, voiceNoteUrl, }) { const audioRef = useRef(); const seekBarRef = useRef(); const [playing, setPlaying] = useState(false); const [seeking, setSeeking] = useState(false); const [currentDuration, setCurrentDuration] = useState(); const [totalDuration, setTotalDuration] = useState(); const [audioAvailable, setAudioAvailable] = useState(); const formatDuration = (seconds) => { const minutes = "" + (seconds / 60).toFixed(0); const remainingSeconds = "" + (seconds % 60); return `${minutes.padStart(2, 0)}:${remainingSeconds.padStart(2, 0)}`; }; const currentDurationString = useMemo( () => formatDuration(currentDuration), [currentDuration] ); const percentageCovered = useMemo( () => ((currentDuration / audioRef.current?.duration) * 100).toFixed(0), [currentDuration, totalDuration] ); const playVoiceMessage = () => { if (!audioAvailable) return; audioRef.current.play(); setPlaying(true); }; const pauseVoiceMessage = () => { audioRef.current.pause(); setPlaying(false); }; const handleCanPlayThrough = () => { setTotalDuration(voiceDuration); setAudioAvailable(true); }; const handleTimeUpdate = (event) => { setCurrentDuration(event.target.currentTime.toFixed(0)); }; const handleSeeking = (event) => { if (!seeking) return; const clickPositionX = event.clientX; const { width: seekBarWidth, left: seekBarPositionX } = seekBarRef.current.getBoundingClientRect(); const difference = clickPositionX - seekBarPositionX; const percentage = (difference / seekBarWidth) * 100; audioRef.current.currentTime = (percentage / 100) * totalDuration.split(":").reduce((curr, digit, index) => { if (index) { return curr + Number(digit); } return curr + 60 * digit; }, 0); }; const handleEnding = (event) => { event.target.pause(); event.target.currentTime = 0; setPlaying(false); setCurrentDuration(); }; return (
{/* Audio Player */}
); } export default VoiceMessage;