import React, {useEffect, useRef, useState} from "react"; import {BsPauseFill, BsPlayFill} from "react-icons/bs"; import WaveSurfer from "wavesurfer.js"; interface Props { audio: string; waveColor: string; progressColor: string; } const Waveform = ({audio, waveColor, progressColor}: Props) => { const containerRef = useRef(null); const waveSurferRef = useRef(); const [isPlaying, setIsPlaying] = useState(false); useEffect(() => { const waveSurfer = WaveSurfer.create({ container: containerRef?.current || "", responsive: true, cursorWidth: 0, height: 24, waveColor, progressColor, barGap: 5, barWidth: 8, barRadius: 4, fillParent: true, hideScrollbar: true, normalize: true, autoCenter: true, ignoreSilenceMode: true, barMinHeight: 4, }); waveSurfer.load(audio); waveSurfer.on("ready", () => { waveSurferRef.current = waveSurfer; }); waveSurfer.on("finish", () => setIsPlaying(false)); return () => { waveSurfer.destroy(); }; }, [audio, progressColor, waveColor]); return ( <> {isPlaying && ( { setIsPlaying((prev) => !prev); waveSurferRef.current?.playPause(); }} /> )} {!isPlaying && ( { setIsPlaying((prev) => !prev); waveSurferRef.current?.playPause(); }} /> )}
); }; export default Waveform;