import React, { useRef, useState, useEffect, MouseEventHandler } from 'react'; import classNames from 'classnames'; import { IconButton } from 'react-file-utils'; import { OGAPIResponse } from 'getstream'; import { sanitizeURL, smartRender, PropsWithElementAttributes } from '../utils'; import { CloseIcon, PlayCircleIcon, PauseCircleIcon } from './Icons'; type AudioProps = PropsWithElementAttributes<{ og: OGAPIResponse; handleClose?: (event: React.SyntheticEvent) => void; }>; export const Audio = ({ og: { audios = [], images = [], description, title }, handleClose, className, style, }: AudioProps) => { const audioReference = useRef(null); const intervalReference = useRef(); const [progress, setProgress] = useState(0); const [playing, setPlaying] = useState(false); const handleProgressBarClick: MouseEventHandler = ({ currentTarget: target, clientX }) => { if (!audioReference.current) return; const { width, x } = target.getBoundingClientRect(); const ratio = (clientX - x) / width; if (!playing) setProgress(ratio * 100); audioReference.current.currentTime = ratio * audioReference.current.duration; }; useEffect(() => { if (!audioReference.current || !playing) return; intervalReference.current = window.setInterval(() => { if (!audioReference.current) return; const { currentTime, duration } = audioReference.current; setProgress((currentTime / duration) * 100); if (currentTime === duration) setPlaying(false); }, 100); audioReference.current.play(); return () => { audioReference.current?.pause(); if (!intervalReference.current) return; window.clearInterval(intervalReference.current); intervalReference.current = undefined; }; }, [playing]); const [audio] = audios; const audioURL = sanitizeURL(audio.secure_url || audio.audio); const [{ image: imageURL }] = images; return (
setPlaying((pv) => !pv)} className="raf-audio__image--button"> {smartRender(playing ? PauseCircleIcon : PlayCircleIcon, { style: { width: '1em' } })}
{description
{title} {description ?? ''}
{handleClose && ( )}
); };