From 033bbaa347ebd73d7badfbd1f12aa11ed80b4e55 Mon Sep 17 00:00:00 2001 From: Jose B Date: Tue, 8 Aug 2023 15:12:06 -0500 Subject: [PATCH] clock element --- www/app/components/record.js | 37 ++++++++++++++++++++++++++++++++++-- www/app/utils.js | 12 ++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/www/app/components/record.js b/www/app/components/record.js index de27b7d3..0ad807c0 100644 --- a/www/app/components/record.js +++ b/www/app/components/record.js @@ -9,6 +9,7 @@ import Dropdown from "react-dropdown"; import "react-dropdown/style.css"; import CustomRecordPlugin from "./CustomRecordPlugin"; +import { formatTime } from "../utils"; const AudioInputsDropdown = (props) => { const [ddOptions, setDdOptions] = useState([]); @@ -54,6 +55,9 @@ export default function Recorder(props) { const [isRecording, setIsRecording] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [deviceId, setDeviceId] = useState(null); + const [currentTime, setCurrentTime] = useState(0); + const [timeInterval, setTimeInterval] = useState(null); + const [duration, setDuration] = useState(0); useEffect(() => { document.getElementById("play-btn").disabled = true; @@ -79,6 +83,7 @@ export default function Recorder(props) { _wavesurfer.on("pause", () => { setIsPlaying(false); }); + _wavesurfer.on("timeupdate", setCurrentTime); setRecord(_wavesurfer.registerPlugin(CustomRecordPlugin.create())); setWavesurfer(_wavesurfer); @@ -101,6 +106,22 @@ export default function Recorder(props) { } }, [record]); + useEffect(() => { + if (isRecording) { + const interval = setInterval(() => { + setCurrentTime((prev) => prev + 1); + }, 1000); + setTimeInterval(interval); + return () => clearInterval(interval); + } else { + clearInterval(timeInterval); + setCurrentTime((prev) => { + setDuration(prev); + return 0; + }); + } + }, [isRecording]); + const handleRecClick = async () => { if (!record) return console.log("no record"); @@ -127,8 +148,15 @@ export default function Recorder(props) { wavesurfer?.playPause(); }; + const timeLabel = () => { + if (isRecording) return formatTime(currentTime); + else if (duration) + return `${formatTime(currentTime)}/${formatTime(duration)}`; + else ""; + }; + return ( -
+
  @@ -158,7 +186,12 @@ export default function Recorder(props) {
- {/* TODO: current time / audio duration */} +
+ {isRecording && ( +
+ )} + {timeLabel()} +
); } diff --git a/www/app/utils.js b/www/app/utils.js index 37c4dee7..79e8ceae 100644 --- a/www/app/utils.js +++ b/www/app/utils.js @@ -17,3 +17,15 @@ export function Mulberry32(seed) { return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; } + +export const formatTime = (seconds) => { + let hours = Math.floor(seconds / 3600); + let minutes = Math.floor((seconds % 3600) / 60); + let secs = Math.floor(seconds % 60); + + let timeString = `${hours > 0 ? hours + ":" : ""}${minutes + .toString() + .padStart(2, "0")}:${secs.toString().padStart(2, "0")}`; + + return timeString; +};