// @flow import React from 'react'; import { View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { ColorSchemeRegistry } from '../../../base/color-scheme'; import { Platform } from '../../../base/react'; import { connect } from '../../../base/redux'; import { StyleType } from '../../../base/styles'; import { ChatButton } from '../../../chat'; import { ReactionsMenuButton } from '../../../reactions/components'; import { isReactionsEnabled } from '../../../reactions/functions.any'; import { TileViewButton } from '../../../video-layout'; import { iAmVisitor } from '../../../visitors/functions'; import { getMovableButtons, isToolboxVisible } from '../../functions.native'; import AudioMuteButton from '../AudioMuteButton'; import HangupButton from '../HangupButton'; import VideoMuteButton from '../VideoMuteButton'; import HangupMenuButton from './HangupMenuButton'; import OverflowMenuButton from './OverflowMenuButton'; import RaiseHandButton from './RaiseHandButton'; import ScreenSharingButton from './ScreenSharingButton'; import styles from './styles'; /** * The type of {@link Toolbox}'s React {@code Component} props. */ type Props = { /** * Whether the end conference feature is supported. */ _endConferenceSupported: boolean, /** * Whether or not the reactions feature is enabled. */ _reactionsEnabled: boolean, /** * The color-schemed stylesheet of the feature. */ _styles: StyleType, /** * The indicator which determines whether the toolbox is visible. */ _visible: boolean, /** * Whether we are in visitors mode. */ _visitorsModeEnabled: boolean, /** * The width of the screen. */ _width: number }; /** * Implements the conference Toolbox on React Native. * * @param {Object} props - The props of the component. * @returns {React$Element}. */ function Toolbox(props: Props) { const { _endConferenceSupported, _reactionsEnabled, _styles, _visible, _visitorsModeEnabled, _width } = props; if (!_visible) { return null; } const bottomEdge = Platform.OS === 'ios' && _visible; const { buttonStylesBorderless, hangupButtonStyles, hangupMenuButtonStyles, toggledButtonStyles } = _styles; const additionalButtons = getMovableButtons(_width); const backgroundToggledStyle = { ...toggledButtonStyles, style: [ toggledButtonStyles.style, _styles.backgroundToggle ] }; return ( {!_visitorsModeEnabled && } {!_visitorsModeEnabled && } {!_visitorsModeEnabled && additionalButtons.has('chat') && } {!_visitorsModeEnabled && additionalButtons.has('screensharing') && } { !_visitorsModeEnabled && additionalButtons.has('raisehand') && (_reactionsEnabled ? : )} {additionalButtons.has('tileview') && } {!_visitorsModeEnabled && } { _endConferenceSupported ? : } ); } /** * Maps parts of the redux state to {@link Toolbox} (React {@code Component}) * props. * * @param {Object} state - The redux state of which parts are to be mapped to * {@code Toolbox} props. * @private * @returns {Props} */ function _mapStateToProps(state: Object): Object { const { conference } = state['features/base/conference']; const endConferenceSupported = conference?.isEndConferenceSupported(); return { _endConferenceSupported: Boolean(endConferenceSupported), _styles: ColorSchemeRegistry.get(state, 'Toolbox'), _visible: isToolboxVisible(state), _visitorsModeEnabled: iAmVisitor(state), _width: state['features/base/responsive-ui'].clientWidth, _reactionsEnabled: isReactionsEnabled(state) }; } export default connect(_mapStateToProps)(Toolbox);