120bef5cc1
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.
90 lines
2.4 KiB
JavaScript
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));
|