import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { translate } from '../../../base/i18n'; /** * Displays a table with phone numbers to dial in to a conference. * * @extends Component */ class NumbersList extends Component { /** * {@code NumbersList} component's property types. * * @static */ static propTypes = { /** * Whether or not numbers should include links with the telephone * protocol. */ clickableNumbers: PropTypes.bool, /** * The conference ID for dialing in. */ conferenceID: PropTypes.number, /** * The phone numbers to display. Can be an array of numbers * or an object with countries as keys and an array of numbers * as values. */ numbers: PropTypes.oneOfType([ PropTypes.array, PropTypes.object ]), /** * Invoked to obtain translated strings. */ t: PropTypes.func }; /** * Implements React's {@link Component#render()}. * * @inheritdoc * @returns {ReactElement} */ render() { const { numbers, t } = this.props; const showWithoutCountries = Array.isArray(numbers); return ( { showWithoutCountries ? null : } { showWithoutCountries ? numbers.map(this._renderNumberRow) : this._renderWithCountries() }
{ t('info.country') }{ t('info.numbers') }
); } /** * Renders rows of countries and associated phone numbers. * * @private * @returns {ReactElement[]} */ _renderWithCountries() { const rows = []; for (const [ country, numbers ] of Object.entries(this.props.numbers)) { const formattedNumbers = numbers.map( number => this._renderNumberDiv(number)); rows.push( { country } { formattedNumbers } ); } return rows; } /** * Renders a table row for a phone number. * * @param {string} number - The phone number to display. * @private * @returns {ReactElement[]} */ _renderNumberRow(number) { return ( { this._renderNumberLink(number) } ); } /** * Renders a div container for a phone number. * * @param {string} number - The phone number to display. * @private * @returns {ReactElement[]} */ _renderNumberDiv(number) { return (
{ this._renderNumberLink(number) }
); } /** * Renders a ReactElement for displaying a telephone number. If the * component prop {@code clickableNumbers} is true, then the number will * have a link with the telephone protocol. * * @param {string} number - The phone number to display. * @private * @returns {ReactElement} */ _renderNumberLink(number) { if (this.props.clickableNumbers) { return ( { number } ); } return number; } } export default translate(NumbersList);