UNPKG

scratch-gui

Version:

GraphicaL User Interface for creating and running Scratch 3.0 projects

144 lines (132 loc) • 4.39 kB
import bindAll from 'lodash.bindall'; import classNames from 'classnames'; import {defineMessages, injectIntl, intlShape, FormattedMessage} from 'react-intl'; import PropTypes from 'prop-types'; import React from 'react'; import ReactTooltip from 'react-tooltip'; import styles from './coming-soon.css'; import awwCatIcon from './aww-cat.png'; import coolCatIcon from './cool-cat.png'; const messages = defineMessages({ message1: { defaultMessage: 'Don\'t worry, we\'re on it {emoji}', description: 'One of the "coming soon" random messages for yet-to-be-done features', id: 'gui.comingSoon.message1' }, message2: { defaultMessage: 'Coming Soon...', description: 'One of the "coming soon" random messages for yet-to-be-done features', id: 'gui.comingSoon.message2' }, message3: { defaultMessage: 'We\'re working on it {emoji}', description: 'One of the "coming soon" random messages for yet-to-be-done features', id: 'gui.comingSoon.message3' } }); class ComingSoonContent extends React.Component { constructor (props) { super(props); bindAll(this, [ 'setHide', 'setShow', 'getRandomMessage' ]); this.state = { isShowing: false }; } setShow () { // needed to set the opacity to 1, since the default is .9 on show this.setState({isShowing: true}); } setHide () { this.setState({isShowing: false}); } getRandomMessage () { // randomly chooses a messages from `messages` to display in the tooltip. const images = [awwCatIcon, coolCatIcon]; const messageNumber = Math.floor(Math.random() * Object.keys(messages).length) + 1; const imageNumber = Math.floor(Math.random() * Object.keys(images).length); return ( <FormattedMessage {...messages[`message${messageNumber}`]} values={{ emoji: ( <img className={styles.comingSoonImage} src={images[imageNumber]} /> ) }} /> ); } render () { return ( <ReactTooltip afterHide={this.setHide} afterShow={this.setShow} className={classNames( styles.comingSoon, this.props.className, { [styles.show]: (this.state.isShowing), [styles.left]: (this.props.place === 'left'), [styles.right]: (this.props.place === 'right'), [styles.top]: (this.props.place === 'top'), [styles.bottom]: (this.props.place === 'bottom') } )} getContent={this.getRandomMessage} id={this.props.tooltipId} /> ); } } ComingSoonContent.propTypes = { className: PropTypes.string, intl: intlShape, place: PropTypes.oneOf(['top', 'right', 'bottom', 'left']), tooltipId: PropTypes.string.isRequired }; ComingSoonContent.defaultProps = { place: 'bottom' }; const ComingSoon = injectIntl(ComingSoonContent); const ComingSoonTooltip = props => ( <div className={props.className}> <div data-delay-hide={props.delayHide} data-delay-show={props.delayShow} data-effect="solid" data-for={props.tooltipId} data-place={props.place} data-tip="tooltip" > {props.children} </div> <ComingSoon className={props.tooltipClassName} place={props.place} tooltipId={props.tooltipId} /> </div> ); ComingSoonTooltip.propTypes = { children: PropTypes.node.isRequired, className: PropTypes.string, delayHide: PropTypes.number, delayShow: PropTypes.number, place: PropTypes.oneOf(['top', 'right', 'bottom', 'left']), tooltipClassName: PropTypes.string, tooltipId: PropTypes.string.isRequired }; ComingSoonTooltip.defaultProps = { delayHide: 0, delayShow: 0 }; export { ComingSoon as ComingSoonComponent, ComingSoonTooltip };