Spaces:
Running
Running
import React from 'react'; | |
import PropTypes from 'prop-types'; | |
import classNames from 'classnames'; | |
import {FormattedMessage, defineMessages, injectIntl, intlShape} from 'react-intl'; | |
import DragConstants from '../../lib/drag-constants'; | |
import {ComingSoonTooltip} from '../coming-soon/coming-soon.jsx'; | |
import SpriteSelectorItem from '../../containers/sprite-selector-item.jsx'; | |
import styles from './backpack.css'; | |
// TODO make sprite selector item not require onClick | |
const noop = () => {}; | |
const dragTypeMap = { // Keys correspond with the backpack-server item types | |
costume: DragConstants.BACKPACK_COSTUME, | |
sound: DragConstants.BACKPACK_SOUND, | |
script: DragConstants.BACKPACK_CODE, | |
sprite: DragConstants.BACKPACK_SPRITE | |
}; | |
const labelMap = defineMessages({ | |
costume: { | |
id: 'gui.backpack.costumeLabel', | |
defaultMessage: 'costume', | |
description: 'Label for costume backpack item' | |
}, | |
sound: { | |
id: 'gui.backpack.soundLabel', | |
defaultMessage: 'sound', | |
description: 'Label for sound backpack item' | |
}, | |
script: { | |
id: 'gui.backpack.scriptLabel', | |
defaultMessage: 'script', | |
description: 'Label for script backpack item' | |
}, | |
sprite: { | |
id: 'gui.backpack.spriteLabel', | |
defaultMessage: 'sprite', | |
description: 'Label for sprite backpack item' | |
} | |
}); | |
const Backpack = ({ | |
blockDragOver, | |
containerRef, | |
contents, | |
dragOver, | |
error, | |
expanded, | |
intl, | |
loading, | |
showMore, | |
onToggle, | |
onDelete, | |
onExport, | |
onRename, | |
onMouseEnter, | |
onMouseLeave, | |
onMore | |
}) => ( | |
<div className={styles.backpackContainer}> | |
<div | |
className={styles.backpackHeader} | |
onClick={onToggle} | |
> | |
{onToggle ? ( | |
<FormattedMessage | |
defaultMessage="Backpack" | |
description="Button to open the backpack" | |
id="gui.backpack.header" | |
/> | |
) : ( | |
<ComingSoonTooltip | |
place="top" | |
tooltipId="backpack-tooltip" | |
> | |
<FormattedMessage | |
defaultMessage="Backpack" | |
description="Button to open the backpack" | |
id="gui.backpack.header" | |
/> | |
</ComingSoonTooltip> | |
)} | |
</div> | |
{expanded ? ( | |
<div | |
className={classNames(styles.backpackList, { | |
[styles.dragOver]: dragOver || blockDragOver | |
})} | |
ref={containerRef} | |
onMouseEnter={onMouseEnter} | |
onMouseLeave={onMouseLeave} | |
> | |
{/* eslint-disable-next-line no-negated-condition */} | |
{error !== false ? ( | |
<div className={styles.statusMessage}> | |
<FormattedMessage | |
defaultMessage="Error loading backpack" | |
description="Error backpack message" | |
id="gui.backpack.errorBackpack" | |
/> | |
<div className={styles.errorMessage}>{error}</div> | |
</div> | |
) : ( | |
loading ? ( | |
<div className={styles.statusMessage}> | |
<FormattedMessage | |
defaultMessage="Loading..." | |
description="Loading backpack message" | |
id="gui.backpack.loadingBackpack" | |
/> | |
</div> | |
) : ( | |
contents.length > 0 ? ( | |
<div className={styles.backpackListInner}> | |
{contents.map(item => ( | |
<SpriteSelectorItem | |
className={styles.backpackItem} | |
costumeURL={item.thumbnailUrl} | |
details={item.name} | |
dragPayload={item} | |
dragType={dragTypeMap[item.type]} | |
id={item.id} | |
key={item.id} | |
name={intl.formatMessage(labelMap[item.type])} | |
selected={false} | |
onClick={noop} | |
onExportButtonClick={item.type === 'script' ? null : onExport} | |
onDeleteButtonClick={onDelete} | |
// Currently, renaming sprites is not supported. | |
onRenameButtonClick={item.type === 'sprite' ? null : onRename} | |
/> | |
))} | |
{showMore && ( | |
<button | |
className={styles.more} | |
onClick={onMore} | |
> | |
<FormattedMessage | |
defaultMessage="More" | |
description="Load more from backpack" | |
id="gui.backpack.more" | |
/> | |
</button> | |
)} | |
</div> | |
) : ( | |
<div className={styles.statusMessage}> | |
<FormattedMessage | |
defaultMessage="Backpack is empty" | |
description="Empty backpack message" | |
id="gui.backpack.emptyBackpack" | |
/> | |
</div> | |
) | |
) | |
)} | |
</div> | |
) : null} | |
</div> | |
); | |
Backpack.propTypes = { | |
blockDragOver: PropTypes.bool, | |
containerRef: PropTypes.func, | |
contents: PropTypes.arrayOf(PropTypes.shape({ | |
id: PropTypes.string, | |
thumbnailUrl: PropTypes.string, | |
type: PropTypes.string, | |
name: PropTypes.string | |
})), | |
dragOver: PropTypes.bool, | |
error: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), | |
expanded: PropTypes.bool, | |
intl: intlShape, | |
loading: PropTypes.bool, | |
onDelete: PropTypes.func, | |
onExport: PropTypes.func, | |
onRename: PropTypes.func, | |
onMore: PropTypes.func, | |
onMouseEnter: PropTypes.func, | |
onMouseLeave: PropTypes.func, | |
onToggle: PropTypes.func, | |
showMore: PropTypes.bool | |
}; | |
Backpack.defaultProps = { | |
blockDragOver: false, | |
contents: [], | |
dragOver: false, | |
expanded: false, | |
loading: false, | |
showMore: false, | |
onMore: null, | |
onToggle: null | |
}; | |
export default injectIntl(Backpack); | |