diff --git a/client/pages/viewerpage/audioplayer.js b/client/pages/viewerpage/audioplayer.js index 6d22a14d..340f85b0 100644 --- a/client/pages/viewerpage/audioplayer.js +++ b/client/pages/viewerpage/audioplayer.js @@ -1,25 +1,18 @@ -import React from "react"; +import React, { useState, useEffect, useLayoutEffect } from "react"; import WaveSurfer from "wavesurfer.js"; import { MenuBar } from "./menubar"; import { NgIf, Icon } from "../../components/"; import "./audioplayer.scss"; -export class AudioPlayer extends React.Component { - constructor(props) { - super(props); - this.state = { - wafesurfer: null, - loading: true, - isPlaying: true, - error: null, - }; - this.toggle = this.toggle.bind(this); - window.addEventListener("keypress", this.toggle); - } +export function AudioPlayer({ filename, data }) { + const [isPlaying, setIsPlaying] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [wavesurfer, setWavesurfer] = useState(null); + const [error, setError] = useState(null); - componentDidMount() { - const wavesurfer = WaveSurfer.create({ + useLayoutEffect(() => { + const _ws = WaveSurfer.create({ container: "#waveform", waveColor: "#323639", progressColor: "#6f6f6f", @@ -28,81 +21,75 @@ export class AudioPlayer extends React.Component { height: 250, barWidth: 1, }); - this.setState({ wavesurfer: wavesurfer }); - wavesurfer.on("ready", () => { - this.setState({ loading: false }); - if (this.state.isPlaying === true) { - wavesurfer.play(); - } + + _ws.on("ready", () => { + setIsLoading(false); }); - wavesurfer.on("error", (err) => { - this.setState({ error: err, loading: false }); + _ws.on("error", (err) => { + setIsLoading(false); + setError(err) }); - wavesurfer.load(this.props.data); - } + _ws.load(data); + setWavesurfer(_ws); + return () => _ws.destroy(); + }, []); - componentWillUnmount() { - if (this.state.wavesurfer) { - this.state.wavesurfer.destroy(); + useEffect(() => { + if(wavesurfer === null) return; + window.addEventListener("keypress", onKeyPressHandler); + return () => window.removeEventListener("keypress", onKeyPressHandler); + }, [wavesurfer, isPlaying]) + + const onKeyPressHandler = (e) => { + if(e.code !== "Space") { + return } - window.removeEventListener("keypress", this.toggle); - } + isPlaying ? onPause(e) : onPlay(e); + }; - toggle() { - if (this.state.isPlaying === true) { - this.setState({ isPlaying: false }); - this.state.wavesurfer.pause(); - } else { - this.setState({ isPlaying: true }); - this.state.wavesurfer.play(); - } - } - - onPlay(e) { + const onPlay = (e) => { e.preventDefault(); e.stopPropagation(); - this.setState({ isPlaying: true }); - this.state.wavesurfer.play(); + wavesurfer.play(); + setIsPlaying(true); } - onPause(e) { + const onPause = (e) => { e.preventDefault(); e.stopPropagation(); - this.setState({ isPlaying: false }); - this.state.wavesurfer.pause(); + wavesurfer.pause(); + setIsPlaying(false); } - render() { - return ( -