import React, { useState, useEffect, useRef } from 'react'; import PlaySvg from '../../../../icons/toggle/play.svg?react'; import PauseSvg from '../../../../icons/toggle/pause.svg?react'; import './AudioBubble.scss'; interface AudioBubbleProps { type: 'outgoing' | 'incoming'; title?: string; href?: string; fileUid?: string; audioFileType?: string; } export default function AudioBubble({ type, // eslint-disable-next-line @typescript-eslint/no-unused-vars title, href, fileUid, audioFileType, }: AudioBubbleProps) { const [isPlaying, setIsPlaying] = useState(false); const audioRef = useRef(null); // eslint-disable-next-line @typescript-eslint/no-unused-vars const [secondsElapsed, setSecondsElapsed] = useState(0); const handleAudioEnd = () => { setIsPlaying(false); setSecondsElapsed(0); }; // eslint-disable-next-line @typescript-eslint/no-unsafe-call,consistent-return useEffect(() => { const audio = audioRef.current; if (audio) { audio.addEventListener('ended', handleAudioEnd); return () => { audio.removeEventListener('ended', handleAudioEnd); }; } }, []); useEffect(() => { let intervalId: NodeJS.Timeout; if (isPlaying) { intervalId = setInterval(() => { setSecondsElapsed((prevSeconds) => prevSeconds + 1); }, 100); } return () => { clearInterval(intervalId); }; }, [isPlaying]); const playPauseHandler = () => { const audio = audioRef.current as HTMLAudioElement; if (audio) { if (isPlaying) { // eslint-disable-next-line @typescript-eslint/no-unsafe-call audio.pause(); } else { // eslint-disable-next-line @typescript-eslint/no-unsafe-call audio.play(); } setIsPlaying(!isPlaying); } else { console.error('Audio element not found'); } }; const generateUniqueNumbers = ( inputString: string, count: number, ): number[] => { const uniqueNumbers: number[] = []; for (let i = 0; i < count; i += 1) { uniqueNumbers.push(Math.abs(inputString.charCodeAt(i) % 11) + 2); } return uniqueNumbers; }; const renderRandomEqualizer = () => { const divElements: JSX.Element[] = []; for (let i = 0; i < 30; i += 1) { const randomHeight = Math.floor(Math.random() * 12) + 1; const divStyle = { height: `${randomHeight}px`, }; divElements.push(
, ); } return divElements; }; const renderEqualizer = (uid: string) => { const divElements: JSX.Element[] = []; const nums = generateUniqueNumbers(uid, 30); for (let i = 0; i < 30; i += 1) { const divStyle = { height: `${nums[i]}px`, }; divElements.push(
, ); } return divElements; }; const formatTime = (time: number): string => { const minutes = Math.floor((time % 3600) / 60); const seconds = Math.floor(time % 60); const formattedMinutes = minutes.toString().padStart(2, '0'); const formattedSeconds = seconds.toString().padStart(2, '0'); return `${formattedMinutes}:${formattedSeconds}`; }; return (
{isPlaying ? ( ) : ( )}
{isPlaying ? renderRandomEqualizer() : renderEqualizer(fileUid!)}
{formatTime(secondsElapsed)}
); }