123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- import React from 'react';
- import { View } from 'react-native';
- import { connect } from 'react-redux';
-
- import { MEDIA_TYPE, toggleCameraFacingMode } from '../../base/media';
- import { Container } from '../../base/react';
- import { ColorPalette } from '../../base/styles';
-
- import { AbstractToolbar, _mapStateToProps } from './AbstractToolbar';
- import { styles } from './styles';
- import ToolbarButton from './ToolbarButton';
-
- /**
- * Implements the conference toolbar on React Native.
- *
- * @extends AbstractToolbar
- */
- class Toolbar extends AbstractToolbar {
- /**
- * Toolbar component's property types.
- *
- * @static
- */
- static propTypes = AbstractToolbar.propTypes
-
- /**
- * Initializes a new Toolbar instance.
- *
- * @param {Object} props - The read-only React Component props with which
- * the new instance is to be initialized.
- */
- constructor(props) {
- super(props);
-
- // Bind event handlers so they are only bound once for every instance.
- this._toggleCameraFacingMode
- = this._toggleCameraFacingMode.bind(this);
- }
-
- /**
- * Implements React's {@link Component#render()}.
- *
- * @inheritdoc
- * @returns {ReactElement}
- */
- render() {
- return (
- <Container
- style = { styles.toolbarContainer }
- visible = { this.props.visible }>
- {
- this._renderPrimaryToolbar()
- }
- {
- this._renderSecondaryToolbar()
- }
- </Container>
- );
- }
-
- /**
- * Renders the toolbar which contains the primary buttons such as hangup,
- * audio and video mute.
- *
- * @private
- * @returns {ReactElement}
- */
- _renderPrimaryToolbar() {
- const audioButtonStyles = this._getMuteButtonStyles(MEDIA_TYPE.AUDIO);
- const videoButtonStyles = this._getMuteButtonStyles(MEDIA_TYPE.VIDEO);
-
- /* eslint-disable react/jsx-handler-names */
-
- return (
- <View style = { styles.primaryToolbar }>
- <ToolbarButton
- iconName = { audioButtonStyles.iconName }
- iconStyle = { audioButtonStyles.iconStyle }
- onClick = { this._toggleAudio }
- style = { audioButtonStyles.style } />
- <ToolbarButton
- iconName = 'hangup'
- iconStyle = { styles.whiteIcon }
- onClick = { this._onHangup }
- style = {{
- ...styles.primaryToolbarButton,
- backgroundColor: ColorPalette.red
- }}
- underlayColor = { ColorPalette.buttonUnderlay } />
- <ToolbarButton
- iconName = { videoButtonStyles.iconName }
- iconStyle = { videoButtonStyles.iconStyle }
- onClick = { this._toggleVideo }
- style = { videoButtonStyles.style } />
- </View>
- );
-
- /* eslint-enable react/jsx-handler-names */
- }
-
- /**
- * Renders the toolbar which contains the secondary buttons such as toggle
- * camera facing mode.
- *
- * @private
- * @returns {ReactElement}
- */
- _renderSecondaryToolbar() {
- const iconStyle = styles.secondaryToolbarIcon;
- const style = styles.secondaryToolbarButton;
- const underlayColor = 'transparent';
-
- /* eslint-disable react/jsx-curly-spacing,react/jsx-handler-names */
-
- // TODO Use an appropriate icon for toggle camera facing mode.
- return (
- <View style = { styles.secondaryToolbar }>
- <ToolbarButton
- iconName = 'switch-camera'
- iconStyle = { iconStyle }
- onClick = { this._toggleCameraFacingMode }
- style = { style }
- underlayColor = { underlayColor } />
- <ToolbarButton
- iconName = {
- this.props._locked ? 'security-locked' : 'security'
- }
- iconStyle = { iconStyle }
- onClick = { this._onRoomLock }
- style = { style }
- underlayColor = { underlayColor } />
- </View>
- );
-
- /* eslint-enable react/jsx-curly-spacing,react/jsx-handler-names */
- }
-
- /**
- * Switches between the front/user-facing and rear/environment-facing
- * cameras.
- *
- * @private
- * @returns {void}
- */
- _toggleCameraFacingMode() {
- this.props.dispatch(toggleCameraFacingMode());
- }
- }
-
- /**
- * Additional properties for various icons, which are now platform-dependent.
- * This is done to have common logic of generating styles for web and native.
- * TODO As soon as we have common font sets for web and native, this will no
- * longer be required.
- */
- Object.assign(Toolbar.prototype, {
- audioIcon: 'microphone',
- audioMutedIcon: 'mic-disabled',
- videoIcon: 'camera',
- videoMutedIcon: 'camera-disabled'
- });
-
- export default connect(_mapStateToProps)(Toolbar);
|