bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/error-screen/component.jsx
prlanzarin 4dcc77968b fix: remove spurious getUserMedia in ErrorScreen
There's a very odd getUserMedia call tucked into the base ErrorScreen.
There's no rationale in either the commit or PR that added them, but the
intention seems to be stopping audio on client crash.
Using getUserMedia like that will have no effect other than an odd
permission prompt on iframe-based environments or a webcam activation
flash after the client crashes.

Remove ErrorScreen's getUserMedia call as well as the HTMLMedia pause
call - both should be handled gracefully by AudioManager's forceExitAudio
triggered by the StopAudioTracks event (also ErrorScreen). If there's an
edge case where it isn't properly stopped, we'll have to tackle it
there.
2024-08-09 19:24:33 +00:00

174 lines
4.0 KiB
JavaScript

import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { defineMessages, injectIntl } from 'react-intl';
import Session from '/imports/ui/services/storage/in-memory';
import Styled from './styles';
const intlMessages = defineMessages({
503: {
id: 'app.error.503',
},
500: {
id: 'app.error.500',
defaultMessage: 'Oops, something went wrong',
},
410: {
id: 'app.error.410',
},
409: {
id: 'app.error.409',
},
408: {
id: 'app.error.408',
},
404: {
id: 'app.error.404',
defaultMessage: 'Not found',
},
403: {
id: 'app.error.403',
},
401: {
id: 'app.error.401',
},
400: {
id: 'app.error.400',
},
meeting_ended: {
id: 'app.meeting.endedMessage',
},
user_logged_out_reason: {
id: 'app.error.userLoggedOut',
},
validate_token_failed_eject_reason: {
id: 'app.error.ejectedUser',
},
banned_user_rejoining_reason: {
id: 'app.error.userBanned',
},
joined_another_window_reason: {
id: 'app.error.joinedAnotherWindow',
},
user_inactivity_eject_reason: {
id: 'app.meeting.logout.userInactivityEjectReason',
},
user_requested_eject_reason: {
id: 'app.meeting.logout.ejectedFromMeeting',
},
max_participants_reason: {
id: 'app.meeting.logout.maxParticipantsReached',
},
guest_deny: {
id: 'app.guest.guestDeny',
},
duplicate_user_in_meeting_eject_reason: {
id: 'app.meeting.logout.duplicateUserEjectReason',
},
not_enough_permission_eject_reason: {
id: 'app.meeting.logout.permissionEjectReason',
},
able_to_rejoin_user_disconnected_reason: {
id: 'app.error.disconnected.rejoin',
},
});
const propTypes = {
code: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
]),
error: PropTypes.object,
errorInfo: PropTypes.object,
};
const defaultProps = {
code: '500',
callback: () => {},
endedReason: null,
error: {},
errorInfo: null,
};
class ErrorScreen extends PureComponent {
componentDidMount() {
const { code, callback, endedReason } = this.props;
// stop audio
window.dispatchEvent(new Event('StopAudioTracks'));
callback(endedReason, () => {});
console.error({ logCode: 'startup_client_usercouldnotlogin_error' }, `User could not log in HTML5, hit ${code}`);
}
render() {
const {
intl,
code,
children,
error,
errorInfo,
} = this.props;
let formatedMessage = 'Oops, something went wrong';
let errorMessageDescription = Session.getItem('errorMessageDescription');
if (intl) {
formatedMessage = intl.formatMessage(intlMessages[defaultProps.code]);
if (code in intlMessages) {
formatedMessage = intl.formatMessage(intlMessages[code]);
}
errorMessageDescription = Session.getItem('errorMessageDescription');
if (errorMessageDescription in intlMessages) {
errorMessageDescription = intl.formatMessage(intlMessages[errorMessageDescription]);
}
}
if (error) {
errorMessageDescription = error.message;
}
return (
<Styled.Background>
<Styled.Message data-test="errorScreenMessage">
{formatedMessage}
</Styled.Message>
{
!errorMessageDescription
|| formatedMessage === errorMessageDescription
|| (
<Styled.SessionMessage>
{errorMessageDescription}
</Styled.SessionMessage>
)
}
{
errorInfo
? (
<textarea
rows="5"
cols="33"
disabled
>
{JSON.stringify(errorInfo)}
</textarea>
)
: null
}
<Styled.Separator />
<Styled.CodeError>
{code}
</Styled.CodeError>
<div>
{children}
</div>
</Styled.Background>
);
}
}
export default injectIntl(ErrorScreen);
export { ErrorScreen };
ErrorScreen.propTypes = propTypes;
ErrorScreen.defaultProps = defaultProps;