import classNames from 'classnames'; import {defineMessages, injectIntl, intlShape} from 'react-intl'; import PropTypes from 'prop-types'; import React from 'react'; import {connect} from 'react-redux'; import VM from 'scratch-vm'; import Box from '../box/box.jsx'; import Button from '../button/button.jsx'; import ToggleButtons from '../toggle-buttons/toggle-buttons.jsx'; import Controls from '../../containers/controls.jsx'; import {getStageDimensions} from '../../lib/screen-utils'; import {STAGE_DISPLAY_SIZES, STAGE_SIZE_MODES} from '../../lib/layout-constants'; import fullScreenIcon from './icon--fullscreen.svg'; import unFullScreenIcon from './icon--unfullscreen.svg'; import largeStageIcon from '!../../lib/tw-recolor/build!./icon--large-stage.svg'; import smallStageIcon from '!../../lib/tw-recolor/build!./icon--small-stage.svg'; import fullStageIcon from '!../../lib/tw-recolor/build!./icon--full-stage.svg'; import settingsIcon from './icon--settings.svg'; import styles from './stage-header.css'; import FullscreenAPI from '../../lib/tw-fullscreen-api'; const messages = defineMessages({ largeStageSizeMessage: { defaultMessage: 'Switch to large stage', description: 'Button to change stage size to large', id: 'gui.stageHeader.stageSizeLarge' }, smallStageSizeMessage: { defaultMessage: 'Switch to small stage', description: 'Button to change stage size to small', id: 'gui.stageHeader.stageSizeSmall' }, fullStageSizeMessage: { defaultMessage: 'Switch to full stage', description: 'Button to change stage size to its full size', id: 'tw.stageHeader.full' }, fullScreenMessage: { defaultMessage: 'Enter full screen mode', description: 'Button to change stage size to full screen', id: 'gui.stageHeader.stageSizeFull' }, unFullScreenMessage: { defaultMessage: 'Exit full screen mode', description: 'Button to get out of full screen mode', id: 'gui.stageHeader.stageSizeUnFull' }, fullscreenControl: { defaultMessage: 'Full Screen Control', description: 'Button to enter/exit full screen mode', id: 'gui.stageHeader.fullscreenControl' }, openSettingsMessage: { defaultMessage: 'Open advanced settings', description: 'Button to open advanced settings in embeds', id: 'tw.openAdvanced' } }); const enableSettingsButton = new URLSearchParams(location.search).has('settings-button'); const StageHeaderComponent = function (props) { const { customStageSize, showFixedLargeSize, isFullScreen, isPlayerOnly, onKeyPress, onSetStageFullScreen, onSetStageUnFullScreen, onSetStageLarge, onSetStageSmall, onSetStageFull, onOpenSettings, isEmbedded, stageSize, stageSizeMode, vm } = props; let header = null; const stageDimensions = getStageDimensions(stageSize, customStageSize, isFullScreen || isEmbedded); if (isFullScreen || isEmbedded) { const settingsButton = isEmbedded && enableSettingsButton ? (
) : null; const fullscreenButton = isFullScreen ? (
) : FullscreenAPI.available() ? (
) : null; header = (
{settingsButton} {fullscreenButton}
); } else { const stageControls = isPlayerOnly ? ( [] ) : (
); header = (
{stageControls}
); } return header; }; const mapStateToProps = state => ({ // This is the button's mode, as opposed to the actual current state stageSizeMode: state.scratchGui.stageSize.stageSize }); StageHeaderComponent.propTypes = { intl: intlShape, customStageSize: PropTypes.shape({ width: PropTypes.number, height: PropTypes.number }), showFixedLargeSize: PropTypes.bool, isFullScreen: PropTypes.bool.isRequired, isPlayerOnly: PropTypes.bool.isRequired, onKeyPress: PropTypes.func.isRequired, onSetStageFullScreen: PropTypes.func.isRequired, onSetStageUnFullScreen: PropTypes.func.isRequired, onSetStageLarge: PropTypes.func.isRequired, onSetStageSmall: PropTypes.func.isRequired, onSetStageFull: PropTypes.func.isRequired, onOpenSettings: PropTypes.func.isRequired, isEmbedded: PropTypes.bool.isRequired, stageSize: PropTypes.oneOf(Object.keys(STAGE_DISPLAY_SIZES)), stageSizeMode: PropTypes.oneOf(Object.keys(STAGE_SIZE_MODES)), vm: PropTypes.instanceOf(VM).isRequired }; StageHeaderComponent.defaultProps = { stageSizeMode: STAGE_SIZE_MODES.large }; export default injectIntl(connect( mapStateToProps )(StageHeaderComponent));