diff options
author | V <vendicated@riseup.net> | 2023-07-26 01:27:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-26 01:27:04 +0200 |
commit | 8620a1d86d302c23d51c1f6795f32cc8eb5e9207 (patch) | |
tree | d3144c2c84173c3d614499080505395f8b64352f /src/plugins/voiceMessages/WebRecorder.tsx | |
parent | 198b35ffdce1ca7ba316409774bc816ac5b58e57 (diff) | |
download | Vencord-8620a1d86d302c23d51c1f6795f32cc8eb5e9207.tar.gz Vencord-8620a1d86d302c23d51c1f6795f32cc8eb5e9207.tar.bz2 Vencord-8620a1d86d302c23d51c1f6795f32cc8eb5e9207.zip |
New plugin: VoiceMessages (#1380)
Co-authored-by: V <vendicated@riseup.net>
Co-authored-by: Justice Almanzar <superdash993@gmail.com>
Diffstat (limited to 'src/plugins/voiceMessages/WebRecorder.tsx')
-rw-r--r-- | src/plugins/voiceMessages/WebRecorder.tsx | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/plugins/voiceMessages/WebRecorder.tsx b/src/plugins/voiceMessages/WebRecorder.tsx new file mode 100644 index 0000000..423a269 --- /dev/null +++ b/src/plugins/voiceMessages/WebRecorder.tsx @@ -0,0 +1,87 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2023 Vendicated and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +import { Button, useState } from "@webpack/common"; + +import type { VoiceRecorder } from "."; +import { settings } from "./settings"; + +export const VoiceRecorderWeb: VoiceRecorder = ({ setAudioBlob, onRecordingChange }) => { + const [recording, setRecording] = useState(false); + const [paused, setPaused] = useState(false); + const [recorder, setRecorder] = useState<MediaRecorder>(); + const [chunks, setChunks] = useState<Blob[]>([]); + + const changeRecording = (recording: boolean) => { + setRecording(recording); + onRecordingChange?.(recording); + }; + + function toggleRecording() { + const nowRecording = !recording; + + if (nowRecording) { + navigator.mediaDevices.getUserMedia({ + audio: { + echoCancellation: settings.store.echoCancellation, + noiseSuppression: settings.store.noiseSuppression, + } + }).then(stream => { + const chunks = [] as Blob[]; + setChunks(chunks); + + const recorder = new MediaRecorder(stream); + setRecorder(recorder); + recorder.addEventListener("dataavailable", e => { + chunks.push(e.data); + }); + recorder.start(); + + changeRecording(true); + }); + } else { + if (recorder) { + recorder.addEventListener("stop", () => { + setAudioBlob(new Blob(chunks, { type: "audio/ogg; codecs=opus" })); + + changeRecording(false); + }); + recorder.stop(); + } + } + } + + return ( + <> + <Button onClick={toggleRecording}> + {recording ? "Stop" : "Start"} recording + </Button> + + <Button + disabled={!recording} + onClick={() => { + setPaused(!paused); + if (paused) recorder?.resume(); + else recorder?.pause(); + }} + > + {paused ? "Resume" : "Pause"} recording + </Button> + </> + ); +}; |