From 0bebb60f19d2973b1d451fcf15084ded7c280911 Mon Sep 17 00:00:00 2001 From: C0ffeeCode Date: Tue, 4 Jan 2022 23:30:28 +0100 Subject: [PATCH] works or something like that disk 2 --- src/app/organisms/room/AttachmentFrame.jsx | 5 +- src/app/organisms/room/VoiceMailRecorder.jsx | 116 +++++++++++-------- src/util/Timer.js | 26 +++++ 3 files changed, 96 insertions(+), 51 deletions(-) create mode 100644 src/util/Timer.js diff --git a/src/app/organisms/room/AttachmentFrame.jsx b/src/app/organisms/room/AttachmentFrame.jsx index 72fd75ee..1da895ce 100644 --- a/src/app/organisms/room/AttachmentFrame.jsx +++ b/src/app/organisms/room/AttachmentFrame.jsx @@ -48,9 +48,10 @@ function AttachmentFrame({ const fnRequestResult = (func) => { requestResult = func; }; - let howToSubmit; + let submission; const fnHowToSubmit = (func) => { - howToSubmit = func; + submission = func; + console.log(submission); }; // If there already is an attachment, show it diff --git a/src/app/organisms/room/VoiceMailRecorder.jsx b/src/app/organisms/room/VoiceMailRecorder.jsx index 22073123..2a1c2728 100644 --- a/src/app/organisms/room/VoiceMailRecorder.jsx +++ b/src/app/organisms/room/VoiceMailRecorder.jsx @@ -1,68 +1,83 @@ -import React, { useRef } from 'react'; +import React, { useEffect, useRef } from 'react'; import PropTypes, { func } from 'prop-types'; import Text from '../../atoms/text/Text'; import RawIcon from '../../atoms/system-icons/RawIcon'; import VolumeFullIC from '../../../../public/res/ic/outlined/volume-full.svg'; +import SendIC from '../../../../public/res/ic/outlined/send.svg'; +import ArrowIC from '../../../../public/res/ic/outlined/leave-arrow.svg'; +import PauseIC from '../../../../public/res/ic/outlined/pause.svg'; +import PlayIC from '../../../../public/res/ic/outlined/play.svg'; import IconButton from '../../atoms/button/IconButton'; +import Timer from '../../../util/Timer'; let _stream; let _mediaRecorder; const audioChunks = []; -console.log('record voice, new recorder'); // TODO: Check if supported -navigator.mediaDevices.getUserMedia({ audio: true }) - .then((stream) => { - _stream = stream; - _mediaRecorder = new MediaRecorder(_stream); +async function init() { + if (_mediaRecorder) return; + console.log('record voice, new recorder'); + _stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + + _mediaRecorder = new MediaRecorder(_stream); + + // Remove previous recording + audioChunks.length = 0; + + _mediaRecorder.ondataavailable = (event) => { + audioChunks.push(event.data); + console.log('ondataavailable'); + }; + _mediaRecorder.onerror = (error) => { + console.log(error); + _mediaRecorder.stop(); + }; +} + +function pauseRec() { + if (_mediaRecorder.state === 'recording') { + _mediaRecorder.pause(); + console.log('pause'); + } +} +function startOrResumeRec() { + if (_mediaRecorder.state === 'paused') { + _mediaRecorder.resume(); + console.log('resume'); + } else if (_mediaRecorder.state === 'inactive') { + audioChunks.length = 0; _mediaRecorder.start(); - - _mediaRecorder.ondataavailable = (event) => audioChunks.push(event.data); - _mediaRecorder.onerror = (error) => { - console.log(error); - _mediaRecorder.stop(); - }; - }) - .catch(console.log); + console.log('start'); + } +} +function restartRec() { + if (_mediaRecorder.state !== 'inactive') _mediaRecorder.stop(); + audioChunks.length = 0; + startOrResumeRec(); +} // TODO: Handle turning off the recorder to remove the browser indicator function VoiceMailRecorder({ fnCancel, fnRequestResult, fnHowToSubmit }) { const [state, setState] = React.useState('unknown'); + const [duration, setDuraction] = React.useState('unknown'); - while (!_mediaRecorder) { - // Blocking - } - - _mediaRecorder.onstop = () => setState('stopped'); - _mediaRecorder.onstart = () => setState('started'); - _mediaRecorder.onpause = () => setState('paused'); - _mediaRecorder.onresume = () => setState('resumed'); - - function pauseRec() { - if (_mediaRecorder.state === 'recording') { - _mediaRecorder.pause(); - console.log('pause'); + async function initiateInitiation() { + if (!_mediaRecorder) { + await init(); + startOrResumeRec(); } + _mediaRecorder.onstop = () => setState('stopped'); + _mediaRecorder.onstart = () => setState('started'); + _mediaRecorder.onpause = () => setState('paused'); + _mediaRecorder.onresume = () => setState('resumed'); } - function startOrResumeRec() { - if (_mediaRecorder.state === 'paused') { - _mediaRecorder.resume(); - console.log('resume'); - } else if (_mediaRecorder.state === 'inactive') { - audioChunks.length = 0; - _mediaRecorder.start(); - console.log('start'); - } - } - function restartRec() { - _mediaRecorder.stop(); - startOrResumeRec(); - } + initiateInitiation(); function stopAndSubmit() { - _mediaRecorder.stop(); + if (_mediaRecorder.state !== 'inactive') _mediaRecorder.stop(); _stream.getTracks().forEach((track) => track.stop()); @@ -73,6 +88,7 @@ function VoiceMailRecorder({ fnCancel, fnRequestResult, fnHowToSubmit }) { fnHowToSubmit(audioFile); } fnCancel(stopAndSubmit); + fnRequestResult(stopAndSubmit); return (
@@ -80,13 +96,15 @@ function VoiceMailRecorder({ fnCancel, fnRequestResult, fnHowToSubmit }) {
- Recording...{state} - {`for: ${'some time '}`} - - - - - + + Recording... + {state} + + {`for: ${duration}`} + Pause + Start + Reset + stopAndSubmit()} src={SendIC} type="submit">Submit
); diff --git a/src/util/Timer.js b/src/util/Timer.js new file mode 100644 index 00000000..4a811fbf --- /dev/null +++ b/src/util/Timer.js @@ -0,0 +1,26 @@ +class Timer { + constructor() { + this.savedTime = 0; + this.timeStarted = new Date().getTime(); + } + + esume() { + this.timeStarted = new Date().getTime(); + } + + pause() { + this.savedTime += this.timeStarted - new Date().getTime(); + this.timeStarted = null; + } + + get gett() { + return this.savedTime + (this.timeStarted - new Date().getTime()); + } + + stop() { + this.pause(); + return this.savedTime; + } +} + +export default Timer;