soiz1's picture
Upload 2891 files
6bcb42f verified
import classNames from 'classnames';
import { defineMessages, FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';
import React from 'react';
import Box from '../box/box.jsx';
import Modal from '../../containers/modal.jsx';
import styles from './prompt.css';
import { SCRATCH_MAX_CLOUD_VARIABLES } from '../../lib/tw-cloud-limits.js';
const messages = defineMessages({
forAllSpritesMessage: {
defaultMessage: 'For all sprites',
description: 'Option message when creating a variable for making it available to all sprites',
id: 'gui.gui.variableScopeOptionAllSprites'
},
forThisSpriteMessage: {
defaultMessage: 'For this sprite only',
description: 'Option message when creating a varaible for making it only available to the current sprite',
id: 'gui.gui.variableScopeOptionSpriteOnly'
},
cloudVarOptionMessage: {
defaultMessage: 'Cloud variable (stored on server)',
description: 'Option message when creating a variable for making it a cloud variable, a variable that is stored on the server', /* eslint-disable-line max-len */
id: 'gui.gui.cloudVariableOption'
},
availableToAllSpritesMessage: {
defaultMessage: 'This variable will be available to all sprites.',
description: 'A message that displays in a variable modal when the stage is selected indicating ' +
'that the variable being created will available to all sprites.',
id: 'gui.gui.variablePromptAllSpritesMessage'
},
listAvailableToAllSpritesMessage: {
defaultMessage: 'This list will be available to all sprites.',
description: 'A message that displays in a list modal when the stage is selected indicating ' +
'that the list being created will available to all sprites.',
id: 'gui.gui.listPromptAllSpritesMessage'
}
});
const PromptComponent = props => (
<Modal
className={styles.modalContent}
contentLabel={props.title}
id="variableModal"
onRequestClose={props.onCancel}
>
<Box className={styles.body}>
<Box className={styles.label}>
{props.label}
</Box>
<Box>
<input
autoFocus
className={styles.variableNameTextInput}
defaultValue={props.defaultValue}
name={props.label}
onChange={props.onChange}
onFocus={props.onFocus}
onKeyPress={props.onKeyPress}
/>
</Box>
{props.showVariableOptions ?
<div>
{props.isStage ?
<div className={styles.infoMessage}>
{props.showListMessage ? (
<FormattedMessage
{...messages.listAvailableToAllSpritesMessage}
/>
) : (
<FormattedMessage
{...messages.availableToAllSpritesMessage}
/>
)}
</div> :
<Box className={styles.optionsRow}>
<label>
<input
checked={props.globalSelected}
name="variableScopeOption"
type="radio"
value="global"
onChange={props.onScopeOptionSelection}
/>
<FormattedMessage
{...messages.forAllSpritesMessage}
/>
</label>
<label
className={classNames({ [styles.disabledLabel]: props.cloudSelected })}
>
<input
checked={!props.globalSelected}
disabled={props.cloudSelected}
name="variableScopeOption"
type="radio"
value="local"
onChange={props.onScopeOptionSelection}
/>
<FormattedMessage
{...messages.forThisSpriteMessage}
/>
</label>
</Box>}
{props.showCloudOption ?
<Box className={classNames(styles.cloudOption)}>
<label
className={classNames({ [styles.disabledLabel]: !props.canAddCloudVariable })}
>
<input
checked={props.cloudSelected && props.canAddCloudVariable}
disabled={!props.canAddCloudVariable}
type="checkbox"
onChange={props.onCloudVarOptionChange}
/>
<FormattedMessage
{...messages.cloudVarOptionMessage}
/>
</label>
</Box> : null}
</div> : null}
{props.cloudSelected && !props.isAddingCloudVariableScratchSafe && (
<Box className={styles.infoMessage}>
<FormattedMessage
// eslint-disable-next-line max-len
defaultMessage="If you make this cloud variable, the project will exceed Scratch's limit of {number} variables, and some variables will not function if you upload the project to Scratch."
// eslint-disable-next-line max-len
description="Warning that appears when adding a new cloud variable will make it exceeded Scratch's cloud variable limit. number will be 10."
id="tw.scratchUnsafeCloud"
values={{
number: SCRATCH_MAX_CLOUD_VARIABLES
}}
/>
</Box>
)}
{props.cloudSelected && props.canAddCloudVariable && (
<Box className={styles.infoMessage}>
<FormattedMessage
/* eslint-disable-next-line max-len */
defaultMessage="Although you can create cloud variables, they won't work until this project is uploaded or until this project is converted using a tool like the {packager}."
description="Reminder that cloud variables may not work when the editor is open"
values={{
packager: (
<a
href="https://studio.penguinmod.com/PenguinMod-Packager"
target="_blank"
rel="noopener noreferrer"
>
{/* Should not be translated */}
{'PenguinMod Packager'}
</a>
)
}}
id="tw.cantUseCloud"
/>
</Box>
)}
<Box className={styles.buttonRow}>
<button
className={styles.cancelButton}
onClick={props.onCancel}
>
<FormattedMessage
defaultMessage="Cancel"
description="Button in prompt for cancelling the dialog"
id="gui.prompt.cancel"
/>
</button>
<button
className={styles.okButton}
onClick={props.onOk}
>
<FormattedMessage
defaultMessage="OK"
description="Button in prompt for confirming the dialog"
id="gui.prompt.ok"
/>
</button>
</Box>
</Box>
</Modal>
);
PromptComponent.propTypes = {
isAddingCloudVariableScratchSafe: PropTypes.bool.isRequired,
canAddCloudVariable: PropTypes.bool.isRequired,
cloudSelected: PropTypes.bool.isRequired,
defaultValue: PropTypes.string,
globalSelected: PropTypes.bool.isRequired,
isStage: PropTypes.bool.isRequired,
showListMessage: PropTypes.bool.isRequired,
label: PropTypes.string.isRequired,
onCancel: PropTypes.func.isRequired,
onChange: PropTypes.func.isRequired,
onCloudVarOptionChange: PropTypes.func,
onFocus: PropTypes.func.isRequired,
onKeyPress: PropTypes.func.isRequired,
onOk: PropTypes.func.isRequired,
onScopeOptionSelection: PropTypes.func.isRequired,
showCloudOption: PropTypes.bool.isRequired,
showVariableOptions: PropTypes.bool.isRequired,
title: PropTypes.string.isRequired
};
export default PromptComponent;