scratch-gui
Version:
GraphicaL User Interface for creating and running Scratch 3.0 projects
170 lines (159 loc) • 6.35 kB
JSX
import classNames from 'classnames';
import {defineMessages, injectIntl, intlShape} from 'react-intl';
import PropTypes from 'prop-types';
import React from 'react';
import VM from 'scratch-vm';
import Box from '../box/box.jsx';
import Button from '../button/button.jsx';
import {ComingSoonTooltip} from '../coming-soon/coming-soon.jsx';
import Controls from '../../containers/controls.jsx';
import {getStageSize} from '../../lib/screen-utils.js';
import fullScreenIcon from './icon--fullscreen.svg';
import largeStageIcon from './icon--large-stage.svg';
import smallStageIcon from './icon--small-stage.svg';
import unFullScreenIcon from './icon--unfullscreen.svg';
import styles from './stage-header.css';
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: 'Enter full screen mode',
description: 'Button to change stage size to full screen',
id: 'gui.stageHeader.stageSizeFull'
},
unFullStageSizeMessage: {
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'
}
});
const StageHeaderComponent = function (props) {
const {
isFullScreen,
isPlayerOnly,
onKeyPress,
onSetStageLarge,
onSetStageFull,
onSetStageUnFull,
vm
} = props;
let header = null;
const stageSize = getStageSize(isFullScreen);
if (isFullScreen) {
header = (
<Box className={styles.stageHeaderWrapperOverlay}>
<Box
className={styles.stageMenuWrapper}
style={{width: stageSize.width}}
>
<Controls vm={vm} />
<Button
className={styles.stageButton}
onClick={onSetStageUnFull}
onKeyPress={onKeyPress}
>
<img
alt={props.intl.formatMessage(messages.unFullStageSizeMessage)}
className={styles.stageButtonIcon}
draggable={false}
src={unFullScreenIcon}
title={props.intl.formatMessage(messages.fullscreenControl)}
/>
</Button>
</Box>
</Box>
);
} else {
const stageControls =
isPlayerOnly ? (
[]
) : (
<div className={styles.stageSizeToggleGroup}>
<ComingSoonTooltip
place="left"
tooltipId="small-stage-button"
>
<div
disabled
className={classNames(
styles.stageButton,
styles.stageButtonLeft,
styles.stageButtonDisabled
)}
role="button"
>
<img
disabled
alt={props.intl.formatMessage(messages.smallStageSizeMessage)}
className={styles.stageButtonIcon}
draggable={false}
src={smallStageIcon}
/>
</div>
</ComingSoonTooltip>
<div>
<Button
className={classNames(styles.stageButton, styles.stageButtonRight)}
onClick={onSetStageLarge}
>
<img
alt={props.intl.formatMessage(messages.largeStageSizeMessage)}
className={styles.stageButtonIcon}
draggable={false}
src={largeStageIcon}
/>
</Button>
</div>
</div>
);
header = (
<Box className={styles.stageHeaderWrapper}>
<Box className={styles.stageMenuWrapper}>
<Controls vm={vm} />
<div className={styles.stageSizeRow}>
{stageControls}
<div>
<Button
className={styles.stageButton}
onClick={onSetStageFull}
>
<img
alt={props.intl.formatMessage(messages.fullStageSizeMessage)}
className={styles.stageButtonIcon}
draggable={false}
src={fullScreenIcon}
title={props.intl.formatMessage(messages.fullscreenControl)}
/>
</Button>
</div>
</div>
</Box>
</Box>
);
}
return header;
};
StageHeaderComponent.propTypes = {
intl: intlShape,
isFullScreen: PropTypes.bool.isRequired,
isPlayerOnly: PropTypes.bool.isRequired,
onKeyPress: PropTypes.func.isRequired,
onSetStageFull: PropTypes.func.isRequired,
onSetStageLarge: PropTypes.func.isRequired,
onSetStageUnFull: PropTypes.func.isRequired,
vm: PropTypes.instanceOf(VM).isRequired
};
export default injectIntl(StageHeaderComponent);