From 6c0e8d12ea47a8e641e19ad65ee79f481ee3a2fb Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Mon, 28 Oct 2019 14:48:55 -0300 Subject: [PATCH] [FIX] Use Media Devices API to guess if a microphone is not available (#15636) --- .../messageBox/messageBoxAudioMessage.js | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/app/ui-message/client/messageBox/messageBoxAudioMessage.js b/app/ui-message/client/messageBox/messageBoxAudioMessage.js index 2f4a3af5c05..1bcf4f8c7df 100644 --- a/app/ui-message/client/messageBox/messageBoxAudioMessage.js +++ b/app/ui-message/client/messageBox/messageBoxAudioMessage.js @@ -86,19 +86,36 @@ const uploadRecord = async ({ rid, tmid, blob }) => { const recordingInterval = new ReactiveVar(null); const recordingRoomId = new ReactiveVar(null); -Template.messageBoxAudioMessage.onCreated(function() { +Template.messageBoxAudioMessage.onCreated(async function() { this.state = new ReactiveVar(null); this.time = new ReactiveVar('00:00'); this.isMicrophoneDenied = new ReactiveVar(false); if (navigator.permissions) { - navigator.permissions.query({ name: 'microphone' }) - .then((permissionStatus) => { + try { + const permissionStatus = await navigator.permissions.query({ name: 'microphone' }); + this.isMicrophoneDenied.set(permissionStatus.state === 'denied'); + permissionStatus.onchange = () => { this.isMicrophoneDenied.set(permissionStatus.state === 'denied'); - permissionStatus.onchange = () => { - this.isMicrophoneDenied.set(permissionStatus.state === 'denied'); - }; - }); + }; + return; + } catch (error) { + console.warn(error); + } + } + + if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { + this.isMicrophoneDenied.set(true); + return; + } + + try { + if (!(await navigator.mediaDevices.enumerateDevices()).some(({ kind }) => kind === 'audioinput')) { + this.isMicrophoneDenied.set(true); + return; + } + } catch (error) { + console.warn(error); } }); @@ -149,6 +166,8 @@ Template.messageBoxAudioMessage.events({ }, 1000)); recordingRoomId.set(this.rid); } catch (error) { + console.log(error); + instance.isMicrophoneDenied.set(true); instance.state.set(null); } },