forked from aerx-dev/aerx-mvp-interface
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuseAudio.js
56 lines (44 loc) · 1.43 KB
/
useAudio.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// copied from here: https://codesandbox.io/s/5wwj02qy7k?file=/src/useAudioPlayer.js
import { useState, useEffect } from "react";
function useAudioPlayer(audio) {
const [duration, setDuration] = useState();
const [curTime, setCurTime] = useState();
const [playing, setPlaying] = useState(false);
const [clickedTime, setClickedTime] = useState();
useEffect(() => {
// state setters wrappers
const setAudioData = () => {
setDuration(audio.duration);
setCurTime(audio.currentTime);
}
const setAudioTime = () => setCurTime(audio.currentTime);
// DOM listeners: update React state on DOM events
audio.addEventListener("loadeddata", setAudioData);
audio.addEventListener("timeupdate", setAudioTime);
// React state listeners: update DOM on React state changes
playing ? audio.play() : audio.pause();
if (clickedTime && clickedTime !== curTime) {
audio.currentTime = clickedTime;
setClickedTime(null);
}
// effect cleanup
return () => {
audio.removeEventListener("loadeddata", setAudioData);
audio.removeEventListener("timeupdate", setAudioTime);
}
});
useEffect(() => {
audio.addEventListener("ended", () => setPlaying(false));
return () => {
audio.removeEventListener("ended", () => setPlaying(false));
};
});
return {
curTime,
duration,
playing,
setPlaying,
setClickedTime
}
}
export default useAudioPlayer;