import React, { ReactElement } from 'react'; import { Text, View } from 'react-native'; import { getConferenceName } from '../../../base/conference/functions'; import { translate } from '../../../base/i18n'; import JitsiScreen from '../../../base/modal/components/JitsiScreen'; import { LoadingIndicator } from '../../../base/react'; import { connect } from '../../../base/redux'; import { ASPECT_RATIO_NARROW } from '../../../base/responsive-ui'; import BaseTheme from '../../../base/ui/components/BaseTheme.native'; import Button from '../../../base/ui/components/native/Button'; import Input from '../../../base/ui/components/native/Input'; import { BUTTON_TYPES } from '../../../base/ui/constants.native'; import { BrandingImageBackground } from '../../../dynamic-branding/components/native'; import { LargeVideo } from '../../../large-video/components'; import { navigate } from '../../../mobile/navigation/components/lobby/LobbyNavigationContainerRef'; import { screen } from '../../../mobile/navigation/routes'; import AudioMuteButton from '../../../toolbox/components/AudioMuteButton'; import VideoMuteButton from '../../../toolbox/components/VideoMuteButton'; import AbstractLobbyScreen, { Props as AbstractProps, _mapStateToProps as abstractMapStateToProps } from '../AbstractLobbyScreen'; import styles from './styles'; type Props = AbstractProps & { /** * The current aspect ratio of the screen. */ _aspectRatio: Symbol, /** * The room name. */ _roomName: string } /** * Implements a waiting screen that represents the participant being in the lobby. */ class LobbyScreen extends AbstractLobbyScreen { /** * Implements {@code PureComponent#render}. * * @inheritdoc */ render() { const { _aspectRatio } = this.props; let contentWrapperStyles; let contentContainerStyles; let largeVideoContainerStyles; if (_aspectRatio === ASPECT_RATIO_NARROW) { contentWrapperStyles = styles.contentWrapper; largeVideoContainerStyles = styles.largeVideoContainer; contentContainerStyles = styles.contentContainer; } else { contentWrapperStyles = styles.contentWrapperWide; largeVideoContainerStyles = styles.largeVideoContainerWide; contentContainerStyles = styles.contentContainerWide; } return ( { this._renderContent() } { this._renderToolbarButtons() } ); } _getScreenTitleKey: () => string; _onAskToJoin: () => void; _onCancel: () => boolean; _onChangeDisplayName: Object => void; _onChangeEmail: Object => void; _onChangePassword: Object => void; _onEnableEdit: () => void; _onJoinWithPassword: () => void; _onSwitchToKnockMode: () => void; _onSwitchToPasswordMode: () => void; _renderContent: () => ReactElement; _renderToolbarButtons: () => ReactElement; _onNavigateToLobbyChat: () => void; /** * Navigates to the lobby chat screen. * * @private * @returns {void} */ _onNavigateToLobbyChat() { navigate(screen.lobby.chat); } /** * Renders the joining (waiting) fragment of the screen. * * @inheritdoc */ _renderJoining() { return ( { this.props.t('lobby.joiningTitle') } { this.props._roomName } { this.props.t('lobby.joiningMessage') } { this._renderStandardButtons() } ); } /** * Renders the participant form to let the knocking participant enter its details. * * @inheritdoc */ _renderParticipantForm() { const { t } = this.props; const { displayName } = this.state; return ( ); } /** * Renders the participant info fragment when we have all the required details of the user. * * @inheritdoc */ _renderParticipantInfo() { return this._renderParticipantForm(); } /** * Renders the password form to let the participant join by using a password instead of knocking. * * @inheritdoc */ _renderPasswordForm() { const { _passwordJoinFailed, t } = this.props; return ( { _passwordJoinFailed && { t('lobby.invalidPassword') } } ); } /** * Renders the password join button (set). * * @inheritdoc */ _renderPasswordJoinButtons() { return (