From 9cf4bf71849b1224160cb3b2e6f5bedd971364f8 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Wed, 14 Jun 2023 17:18:22 +0100 Subject: [PATCH] Improved the appearance of the Waveform --- src/components/Waveform.tsx | 62 +++++++++++++++++++++++-------------- src/pages/test.tsx | 15 +-------- 2 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/components/Waveform.tsx b/src/components/Waveform.tsx index 34df9d5c..8fc66081 100644 --- a/src/components/Waveform.tsx +++ b/src/components/Waveform.tsx @@ -1,15 +1,17 @@ -import React, {useEffect, useRef} from "react"; +import React, {useEffect, useRef, useState} from "react"; +import {BsPauseFill, BsPlayFill} from "react-icons/bs"; import WaveSurfer from "wavesurfer.js"; interface Props { audio: string; - isPlaying: boolean; - onEnd: () => void; + waveColor: string; + progressColor: string; } -const Waveform = ({audio, isPlaying, onEnd}: Props) => { +const Waveform = ({audio, waveColor, progressColor}: Props) => { const containerRef = useRef(null); - const waveSurferRef = useRef(null); + const waveSurferRef = useRef(); + const [isPlaying, setIsPlaying] = useState(false); useEffect(() => { const waveSurfer = WaveSurfer.create({ @@ -17,38 +19,52 @@ const Waveform = ({audio, isPlaying, onEnd}: Props) => { responsive: true, cursorWidth: 0, height: 24, - waveColor: "#FCDDEC", - progressColor: "#EF5DA8", - barGap: 4, - barWidth: 4, - barRadius: 2, + waveColor, + progressColor, + barGap: 5, + barWidth: 8, + barRadius: 4, fillParent: true, hideScrollbar: true, - normalize: true, + normalize: false, + autoCenter: true, + ignoreSilenceMode: true, + barMinHeight: 4, }); waveSurfer.load(audio); + waveSurfer.on("ready", () => { waveSurferRef.current = waveSurfer; }); - waveSurfer.on("finish", onEnd); + + waveSurfer.on("finish", () => setIsPlaying(false)); return () => { waveSurfer.destroy(); }; - }, [audio, onEnd]); - - useEffect(() => { - if (isPlaying) waveSurferRef.current?.play(); - if (!isPlaying) waveSurferRef.current?.pause(); - }, [isPlaying]); + }, [audio, progressColor, waveColor]); return ( <> - -
+ {isPlaying && ( + { + setIsPlaying((prev) => !prev); + waveSurferRef.current?.playPause(); + }} + /> + )} + {!isPlaying && ( + { + setIsPlaying((prev) => !prev); + waveSurferRef.current?.playPause(); + }} + /> + )} +
); }; diff --git a/src/pages/test.tsx b/src/pages/test.tsx index ea6a2f98..7d3881dc 100644 --- a/src/pages/test.tsx +++ b/src/pages/test.tsx @@ -39,7 +39,6 @@ export default function Page() { const {user} = useUser({redirectTo: "/login"}); const [recordingDuration, setRecordingDuration] = useState(0); const [isRecording, setIsRecording] = useState(false); - const [isPlaying, setIsPlaying] = useState(false); useEffect(() => { let recordingInterval: NodeJS.Timer | undefined = undefined; @@ -159,19 +158,7 @@ export default function Page() { )} {status === "stopped" && mediaBlobUrl && ( <> - {isPlaying && ( - setIsPlaying(false)} - /> - )} - {!isPlaying && ( - setIsPlaying(true)} - /> - )} - setIsPlaying(false)} /> +