import React, { Component } from 'react'; import { injectIntl, defineMessages } from 'react-intl'; import PropTypes from 'prop-types'; import Styled from './styles'; const propTypes = { intl: PropTypes.shape({ formatMessage: PropTypes.func.isRequired, }).isRequired, isListenOnly: PropTypes.bool.isRequired, isConnected: PropTypes.bool.isRequired, audioErr: PropTypes.shape({ code: PropTypes.number, message: PropTypes.string, MIC_ERROR: PropTypes.shape({ NO_SSL: PropTypes.number, MAC_OS_BLOCK: PropTypes.number, NO_PERMISSION: PropTypes.number, }), }).isRequired, handleBack: PropTypes.func.isRequired, handleRetryMic: PropTypes.func.isRequired, handleJoinListenOnly: PropTypes.func.isRequired, troubleshootingLink: PropTypes.string, }; const defaultProps = { troubleshootingLink: '', }; const intlMessages = defineMessages({ helpSubtitleMic: { id: 'app.audioModal.helpSubtitleMic', description: 'Text description for the audio help subtitle (microphones)', }, helpSubtitlePermission: { id: 'app.audioModal.helpSubtitlePermission', description: 'Text description for the audio help subtitle (permission)', }, helpSubtitleGeneric: { id: 'app.audioModal.helpSubtitleGeneric', description: 'Text description for the audio help subtitle (generic)', }, helpPermissionStep1: { id: 'app.audioModal.helpPermissionStep1', description: 'Text description for the audio permission help step 1', }, helpPermissionStep2: { id: 'app.audioModal.helpPermissionStep2', description: 'Text description for the audio permission help step 2', }, helpPermissionStep3: { id: 'app.audioModal.helpPermissionStep3', description: 'Text description for the audio permission help step 3', }, backLabel: { id: 'app.audio.backLabel', description: 'audio settings back button label', }, retryMicLabel: { id: 'app.audio.audioSettings.retryMicLabel', description: 'audio settings retry button label', }, listenOnlyLabel: { id: 'app.audioModal.listenOnlyLabel', description: 'audio settings listen only button label', }, noSSL: { id: 'app.audioModal.help.noSSL', description: 'Text description for domain not using https', }, macNotAllowed: { id: 'app.audioModal.help.macNotAllowed', description: 'Text description for mac needed to enable OS setting', }, helpTroubleshoot: { id: 'app.audioModal.help.troubleshoot', description: 'Text description for help troubleshoot', }, unknownError: { id: 'app.audioModal.help.unknownError', description: 'Text description for unknown error', }, errorCode: { id: 'app.audioModal.help.errorCode', description: 'Text description for error code', }, }); class Help extends Component { getSubtitle() { const { audioErr, intl, isListenOnly } = this.props; const { MIC_ERROR } = audioErr; if (audioErr.code === MIC_ERROR.NO_PERMISSION) { return intl.formatMessage(intlMessages.helpSubtitlePermission); } return !isListenOnly ? intl.formatMessage(intlMessages.helpSubtitleMic) : intl.formatMessage(intlMessages.helpSubtitleGeneric); } renderNoSSL() { const { intl } = this.props; return ( {intl.formatMessage(intlMessages.noSSL)} ); } renderMacNotAllowed() { const { intl } = this.props; return ( {intl.formatMessage(intlMessages.macNotAllowed)} ); } renderPermissionHelp() { const { intl } = this.props; return ( <> {this.getSubtitle()}
  • {intl.formatMessage(intlMessages.helpPermissionStep1)}
  • {intl.formatMessage(intlMessages.helpPermissionStep2)}
  • {intl.formatMessage(intlMessages.helpPermissionStep3)}
  • ); } renderGenericErrorHelp() { const { intl, audioErr } = this.props; const { code, message } = audioErr; return ( <> {this.getSubtitle()} {intl.formatMessage(intlMessages.unknownError)} {intl.formatMessage(intlMessages.errorCode, { 0: code, 1: message || 'UnknownError' })} ); } renderHelpMessage() { const { audioErr } = this.props; const { MIC_ERROR } = audioErr; switch (audioErr.code) { case MIC_ERROR.NO_SSL: return this.renderNoSSL(); case MIC_ERROR.MAC_OS_BLOCK: return this.renderMacNotAllowed(); case MIC_ERROR.NO_PERMISSION: return this.renderPermissionHelp(); default: return this.renderGenericErrorHelp(); } } render() { const { intl, isConnected, handleBack, handleRetryMic, handleJoinListenOnly, troubleshootingLink, } = this.props; return ( {this.renderHelpMessage()} { troubleshootingLink && ( {intl.formatMessage(intlMessages.helpTroubleshoot)} )} {!isConnected ? ( ) : ( )} ); } } Help.propTypes = propTypes; Help.defaultProps = defaultProps; export default injectIntl(Help);