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 ( { this._renderPrimaryToolbar() } { this._renderSecondaryToolbar() } ); } /** * 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 ( ); /* 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 */ return ( {/* FIXME There are multiple issues with the toggling of the * camera facing more. For example, switching from the user * facing camera to the environment facing camera on iOS may be * very slow or may not work at all. On Android the toggling * either works or does not. The causes of the various problems * have been identified to lie within either * react-native-webrtc or Google's native WebRTC API. * */} ); /* 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);