import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { connectState } from "../../../redux/connector"; import { voiceState, VoiceStatus } from "../../../lib/vortex/VoiceState"; import { TextReact } from "../../../lib/i18n"; import ComboBox from "../../../components/ui/ComboBox"; import Overline from "../../../components/ui/Overline"; import Tip from "../../../components/ui/Tip"; import {useEffect, useState} from "preact/hooks"; import { stopPropagation } from "../../../lib/stopPropagation"; const constraints = { audio: true } export function Component() { const [mediaStream, setMediaStream] = useState(undefined) const [mediaDevices, setMediaDevices] = useState(undefined); const [permission, setPermission] = useState(undefined); const [error, setError] = useState(undefined) const askOrGetPermission = async () => { try { const mediaStream = await navigator.mediaDevices.getUserMedia(constraints) setMediaStream(mediaStream) } catch (err) { // The user has blocked the permission setError(err) } try { const { state } = await navigator.permissions.query({ name: 'microphone' }) setPermission(state) } catch (err) { // the browser might not support `query` functionnality setError(err); } } useEffect(() => { askOrGetPermission() }, []); useEffect(() => { if (!mediaStream) { return; } navigator .mediaDevices .enumerateDevices() .then( devices => { setMediaDevices(devices) }, err => { setError(err) }) }, [mediaStream]) const handleAskForPermission = (ev: JSX.TargetedMouseEvent) => { stopPropagation(ev) setError(undefined) askOrGetPermission() } return ( <>

changeAudioDevice(e.currentTarget.value, "input")}> { mediaDevices?.filter(device => device.kind === "audioinput").map(device => { return ( ) }) } {error && error.name === 'NotAllowedError' && } {error && permission === 'prompt' && ), }}/> }
); } function changeAudioDevice(deviceId: string, deviceType: string) { if(deviceType === "input") { window.localStorage.setItem("audioInputDevice", deviceId) if(voiceState.isProducing("audio")) { voiceState.stopProducing("audio"); voiceState.startProducing("audio"); } }else if(deviceType === "output") { window.localStorage.setItem("audioOutputDevice", deviceId) } } export const Audio = connectState(Component, () => { return; });