diff --git a/www/app/transcripts/new/page.tsx b/www/app/transcripts/new/page.tsx index a5e68f84..24134f57 100644 --- a/www/app/transcripts/new/page.tsx +++ b/www/app/transcripts/new/page.tsx @@ -30,6 +30,7 @@ const App = () => { const { loading, permissionOk, + permissionDenied, audioDevices, requestPermission, getAudioStream, @@ -71,13 +72,16 @@ const App = () => {

Reflector needs access to your microphone to work.
- Please grant permission to continue. + {permissionDenied + ? "Please reset microphone permissions to continue." + : "Please grant permission to continue."}

)} diff --git a/www/app/transcripts/useAudioDevice.ts b/www/app/transcripts/useAudioDevice.ts index da1dbe49..0b430adc 100644 --- a/www/app/transcripts/useAudioDevice.ts +++ b/www/app/transcripts/useAudioDevice.ts @@ -1,22 +1,57 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { Option } from "react-dropdown"; +const MIC_QUERY = { name: "microphone" as PermissionName }; + const useAudioDevice = () => { - const [permissionOk, setPermissionOk] = useState(false); + const [permissionOk, setPermissionOk] = useState(false); + const [permissionDenied, setPermissionDenied] = useState(false); const [audioDevices, setAudioDevices] = useState([]); const [loading, setLoading] = useState(true); + useEffect(() => { + checkPermission(); + }, []); + + useEffect(() => { + if (permissionOk) { + updateDevices(); + } + }, [permissionOk]); + + const checkPermission = (): void => { + navigator.permissions + .query(MIC_QUERY) + .then((permissionStatus) => { + setPermissionOk(permissionStatus.state === "granted"); + setPermissionDenied(permissionStatus.state === "denied"); + permissionStatus.onchange = () => { + setPermissionOk(permissionStatus.state === "granted"); + setPermissionDenied(permissionStatus.state === "denied"); + }; + }) + .catch(() => { + setPermissionOk(false); + setPermissionDenied(false); + }) + .finally(() => { + setLoading(false); + }); + }; + const requestPermission = () => { navigator.mediaDevices .getUserMedia({ audio: true, }) - .then(() => { + .then((stream) => { + if (!navigator.userAgent.includes("Firefox")) + stream.getTracks().forEach((track) => track.stop()); setPermissionOk(true); - updateDevices(); }) .catch(() => { + setPermissionDenied(true); setPermissionOk(false); }) .finally(() => { @@ -56,11 +91,12 @@ const useAudioDevice = () => { }; return { + loading, permissionOk, + permissionDenied, audioDevices, getAudioStream, requestPermission, - loading, }; };