import React, { PureComponent } from 'react'; import { defineMessages, injectIntl, intlShape } from 'react-intl'; import _ from 'lodash'; import PropTypes from 'prop-types'; import { withModalMounter } from '/imports/ui/components/modal/service'; import EndMeetingConfirmationContainer from '/imports/ui/components/end-meeting-confirmation/container'; import { makeCall } from '/imports/ui/services/api'; import AboutContainer from '/imports/ui/components/about/container'; import SettingsMenuContainer from '/imports/ui/components/settings/container'; import Button from '/imports/ui/components/button/component'; import Dropdown from '/imports/ui/components/dropdown/component'; import DropdownTrigger from '/imports/ui/components/dropdown/trigger/component'; import DropdownContent from '/imports/ui/components/dropdown/content/component'; import DropdownList from '/imports/ui/components/dropdown/list/component'; import DropdownListItem from '/imports/ui/components/dropdown/list/item/component'; import DropdownListSeparator from '/imports/ui/components/dropdown/list/separator/component'; import ShortcutHelpComponent from '/imports/ui/components/shortcut-help/component'; import withShortcutHelper from '/imports/ui/components/shortcut-help/service'; import { styles } from '../styles'; const intlMessages = defineMessages({ optionsLabel: { id: 'app.navBar.settingsDropdown.optionsLabel', description: 'Options button label', }, fullscreenLabel: { id: 'app.navBar.settingsDropdown.fullscreenLabel', description: 'Make fullscreen option label', }, settingsLabel: { id: 'app.navBar.settingsDropdown.settingsLabel', description: 'Open settings option label', }, aboutLabel: { id: 'app.navBar.settingsDropdown.aboutLabel', description: 'About option label', }, aboutDesc: { id: 'app.navBar.settingsDropdown.aboutDesc', description: 'Describes about option', }, leaveSessionLabel: { id: 'app.navBar.settingsDropdown.leaveSessionLabel', description: 'Leave session button label', }, fullscreenDesc: { id: 'app.navBar.settingsDropdown.fullscreenDesc', description: 'Describes fullscreen option', }, settingsDesc: { id: 'app.navBar.settingsDropdown.settingsDesc', description: 'Describes settings option', }, leaveSessionDesc: { id: 'app.navBar.settingsDropdown.leaveSessionDesc', description: 'Describes leave session option', }, exitFullscreenDesc: { id: 'app.navBar.settingsDropdown.exitFullscreenDesc', description: 'Describes exit fullscreen option', }, exitFullscreenLabel: { id: 'app.navBar.settingsDropdown.exitFullscreenLabel', description: 'Exit fullscreen option label', }, hotkeysLabel: { id: 'app.navBar.settingsDropdown.hotkeysLabel', description: 'Hotkeys options label', }, hotkeysDesc: { id: 'app.navBar.settingsDropdown.hotkeysDesc', description: 'Describes hotkeys option', }, helpLabel: { id: 'app.navBar.settingsDropdown.helpLabel', description: 'Help options label', }, helpDesc: { id: 'app.navBar.settingsDropdown.helpDesc', description: 'Describes help option', }, endMeetingLabel: { id: 'app.navBar.settingsDropdown.endMeetingLabel', description: 'End meeting options label', }, endMeetingDesc: { id: 'app.navBar.settingsDropdown.endMeetingDesc', description: 'Describes settings option closing the current meeting', }, }); const propTypes = { intl: intlShape.isRequired, handleToggleFullscreen: PropTypes.func.isRequired, mountModal: PropTypes.func.isRequired, isFullscreen: PropTypes.bool, noIOSFullscreen: PropTypes.bool, amIModerator: PropTypes.bool, shortcuts: PropTypes.string, isBreakoutRoom: PropTypes.bool, }; const defaultProps = { isFullscreen: false, noIOSFullscreen: true, amIModerator: false, shortcuts: '', isBreakoutRoom: false, }; class SettingsDropdown extends PureComponent { constructor(props) { super(props); this.state = { isSettingOpen: false, }; this.onActionsShow = this.onActionsShow.bind(this); this.onActionsHide = this.onActionsHide.bind(this); } onActionsShow() { this.setState({ isSettingOpen: true, }); } onActionsHide() { this.setState({ isSettingOpen: false, }); } getFullscreenItem() { const { intl, isFullscreen, noIOSFullscreen, handleToggleFullscreen, } = this.props; let fullscreenLabel = intl.formatMessage(intlMessages.fullscreenLabel); let fullscreenDesc = intl.formatMessage(intlMessages.fullscreenDesc); let fullscreenIcon = 'fullscreen'; if (isFullscreen) { fullscreenLabel = intl.formatMessage(intlMessages.exitFullscreenLabel); fullscreenDesc = intl.formatMessage(intlMessages.exitFullscreenDesc); fullscreenIcon = 'exit_fullscreen'; } if (noIOSFullscreen) return null; return ( ); } leaveSession() { document.dispatchEvent(new Event('exitVideo')); const LOGOUT_CODE = '403'; makeCall('userLeftMeeting'); // we don't check askForFeedbackOnLogout here, // it is checked in meeting-ended component Session.set('codeError', LOGOUT_CODE); // mountModal(); } renderMenuItems() { const { intl, mountModal, amIModerator, isBreakoutRoom, } = this.props; const allowedToEndMeeting = amIModerator && !isBreakoutRoom; const { showHelpButton: helpButton, helpLink } = Meteor.settings.public.app; return _.compact([ this.getFullscreenItem(), ( mountModal()} />), ( mountModal()} />), !helpButton ? null : ( window.open(`${helpLink}`)} /> ), ( mountModal()} />), (), allowedToEndMeeting ? ( mountModal()} /> ) : null, ( this.leaveSession()} />), ]); } render() { const { intl, shortcuts: OPEN_OPTIONS_AK, } = this.props; const { isSettingOpen } = this.state; return (