/* * Wire * Copyright (C) 2021 Wire Swiss GmbH * * 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 http://www.gnu.org/licenses/. * */ import React, {useEffect, useState} from 'react'; import * as Icon from 'Components/Icon'; import {MediaDeviceType} from 'src/script/media/MediaDeviceType'; import {useKoSubscribableChildren} from 'Util/ComponentUtil'; import {t} from 'Util/LocalizerUtil'; import {getLogger} from 'Util/Logger'; import {DeviceSelect} from './DeviceSelect'; import {InputLevel} from './InputLevel'; import {Config} from '../../../../../Config'; import {MediaDevicesHandler} from '../../../../../media/MediaDevicesHandler'; import {MediaStreamHandler} from '../../../../../media/MediaStreamHandler'; import {MediaType} from '../../../../../media/MediaType'; import {PreferencesSection} from '../components/PreferencesSection'; const logger = getLogger('MicrophonePreferences'); interface MicrophonePreferencesProps { devicesHandler: MediaDevicesHandler; refreshStream: () => Promise; streamHandler: MediaStreamHandler; hasActiveCall: boolean; } const MicrophonePreferences: React.FC = ({ devicesHandler, streamHandler, refreshStream, hasActiveCall, }) => { const [isRequesting, setIsRequesting] = useState(false); const [stream, setStream] = useState(); const {[MediaDeviceType.AUDIO_INPUT]: availableDevices} = useKoSubscribableChildren( devicesHandler?.availableDevices, [MediaDeviceType.AUDIO_INPUT], ); const {[MediaDeviceType.AUDIO_INPUT]: currentDeviceId} = useKoSubscribableChildren(devicesHandler?.currentDeviceId, [ MediaDeviceType.AUDIO_INPUT, ]); const {URL: urls} = Config.getConfig(); const requestStream = async () => { setIsRequesting(true); try { setStream(await refreshStream()); } catch (error) { logger.warn(`Requesting MediaStream for type "${MediaType.AUDIO}" failed: ${error.message}`, error); setStream(null); } finally { setIsRequesting(false); } }; useEffect(() => { requestStream(); }, [currentDeviceId]); useEffect( () => () => { if (stream && !hasActiveCall) { streamHandler.releaseTracksFromStream(stream); } }, [stream], ); return ( {!stream && !isRequesting && (
{t('preferencesAVPermissionDetail')}
)} devicesHandler.currentDeviceId[MediaDeviceType.AUDIO_INPUT](deviceId)} title={t('preferencesAVMicrophone')} /> {isRequesting ? (
) : ( )}
); }; export {MicrophonePreferences};