bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/audio/local-echo/component.jsx
prlanzarin 120bef5cc1 refactor(audio): improve audio settings' UI
We are missing a way to select transcription languages in some
scenarios, e.g.: listenOnlyMode=false. The audio settings UI is also not
handling item disposition very well on smaller devices.

This commit does the following to improve those blind spots:
  - Add the transcription language selector to it whenever applicable
  - Add proper styling to the transcription selector
  - Handle small screens by changing the disposition of elements to
    portrait mode
  - Improve how elements are disposed to a more familiar view: Mic ->
    Activity Indicator; Speaker -> Speaker test. This is more in line
    with how other platforms do audio configuration/pre flight screens.
2024-08-15 00:43:37 +00:00

90 lines
2.4 KiB
JavaScript

import React, { useState, useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import { defineMessages, injectIntl } from 'react-intl';
import Styled from './styles';
import { getSettingsSingletonInstance } from '/imports/ui/services/settings';
const propTypes = {
intl: PropTypes.shape({
formatMessage: PropTypes.func.isRequired,
}).isRequired,
stream: PropTypes.shape({
active: PropTypes.bool,
id: PropTypes.string,
}),
initialHearingState: PropTypes.bool,
playEchoStream: PropTypes.func.isRequired,
deattachEchoStream: PropTypes.func.isRequired,
shouldUseRTCLoopback: PropTypes.func.isRequired,
createAudioRTCLoopback: PropTypes.func.isRequired,
};
const intlMessages = defineMessages({
stopAudioFeedbackLabel: {
id: 'app.audio.stopAudioFeedback',
description: 'Stop audio feedback button label',
},
startAudioFeedback: {
id: 'app.audio.startAudioFeedback',
description: 'Start audio feedback button label',
},
});
const LocalEcho = ({
intl,
stream = null,
initialHearingState = false,
playEchoStream,
deattachEchoStream,
shouldUseRTCLoopback,
createAudioRTCLoopback,
}) => {
const loopbackAgent = useRef(null);
const [hearing, setHearing] = useState(initialHearingState);
const Settings = getSettingsSingletonInstance();
const { animations } = Settings.application;
const icon = hearing ? 'no_audio' : 'listen';
const label = hearing ? intlMessages.stopAudioFeedbackLabel : intlMessages.startAudioFeedback;
const applyHearingState = (_stream) => {
if (hearing) {
playEchoStream(_stream, loopbackAgent.current);
} else {
deattachEchoStream();
}
};
const cleanup = () => {
if (loopbackAgent.current) loopbackAgent.current.stop();
deattachEchoStream();
};
useEffect(() => {
if (shouldUseRTCLoopback()) {
loopbackAgent.current = createAudioRTCLoopback();
}
return cleanup;
}, []);
useEffect(() => {
applyHearingState(stream);
}, [stream, hearing]);
return (
<Styled.LocalEchoTestButton
data-test={hearing ? 'stopHearingButton' : 'testSpeakerButton'}
$hearing={hearing}
label={intl.formatMessage(label)}
icon={icon}
size="md"
color="primary"
onClick={() => setHearing(!hearing)}
animations={animations}
/>
);
};
LocalEcho.propTypes = propTypes;
export default injectIntl(React.memo(LocalEcho));