From 3701a4fb44079d0f3a3d3828d4402afa328ce836 Mon Sep 17 00:00:00 2001 From: Chris Garrity <chrisg@media.mit.edu> Date: Wed, 31 Jul 2019 16:14:42 -0400 Subject: [PATCH] Refactor to separate container/component Also noticed that Delete aria label was not localized. --- .../delete-button/delete-button.jsx | 93 +++++++++---------- .../sprite-selector-item.jsx | 2 +- src/containers/delete-button.jsx | 52 +++++++++++ .../components/sprite-selector-item.test.jsx | 2 +- 4 files changed, 97 insertions(+), 52 deletions(-) create mode 100644 src/containers/delete-button.jsx diff --git a/src/components/delete-button/delete-button.jsx b/src/components/delete-button/delete-button.jsx index 62dfcc08a..c4618d43f 100644 --- a/src/components/delete-button/delete-button.jsx +++ b/src/components/delete-button/delete-button.jsx @@ -1,67 +1,60 @@ import PropTypes from 'prop-types'; import React from 'react'; -import bindAll from 'lodash.bindall'; import classNames from 'classnames'; +import {defineMessages, injectIntl, intlShape} from 'react-intl'; import styles from './delete-button.css'; import deleteIcon from './icon--delete.svg'; -class DeleteButton extends React.Component { - constructor (props) { - super(props); - bindAll(this, [ - 'handleKeyPress', - 'setRef' - ]); +const messages = defineMessages({ + delete: { + id: 'gui.deleteButton.delete', + description: 'Title of the button to delete a sprite, costume or sound', + defaultMessage: 'Delete' } - componentDidMount () { - document.addEventListener('keydown', this.handleKeyPress); - } - componentWillUnmount () { - document.removeEventListener('keydown', this.handleKeyPress); - } - setRef (ref) { - this.ref = ref; - } - handleKeyPress (event) { - if (this.ref === event.currentTarget.activeElement && (event.key === 'Enter' || event.key === ' ')) { - this.props.onClick(event); - event.preventDefault(); - } - } - render () { - return ( - <div - aria-label="Delete" - className={classNames( - styles.deleteButton, - this.props.className - )} - ref={this.setRef} - role="button" - tabIndex={this.props.tabIndex} - onClick={this.props.onClick} - > - <div className={styles.deleteButtonVisible}> - <img - className={styles.deleteIcon} - draggable={false} - src={deleteIcon} - /> - </div> - </div> - ); - } -} +}); + +const DeleteButtonComponent = ({ + className, + intl, + onClick, + setRef, + tabIndex, + ...props +}) => ( + <div + aria-label={intl.formatMessage(messages.delete)} + className={classNames( + styles.deleteButton, + className + )} + ref={setRef} + role="button" + tabIndex={tabIndex} + onClick={onClick} + {...props} + > + <div className={styles.deleteButtonVisible}> + <img + className={styles.deleteIcon} + draggable={false} + src={deleteIcon} + /> + </div> + </div> +); + -DeleteButton.propTypes = { +DeleteButtonComponent.propTypes = { className: PropTypes.string, + intl: intlShape, onClick: PropTypes.func.isRequired, + setRef: PropTypes.func.isRequired, tabIndex: PropTypes.number }; -DeleteButton.defaultProps = { +DeleteButtonComponent.defaultProps = { tabIndex: 0 }; -export default DeleteButton; +export default injectIntl(DeleteButtonComponent); diff --git a/src/components/sprite-selector-item/sprite-selector-item.jsx b/src/components/sprite-selector-item/sprite-selector-item.jsx index 458df186f..e3ed71735 100644 --- a/src/components/sprite-selector-item/sprite-selector-item.jsx +++ b/src/components/sprite-selector-item/sprite-selector-item.jsx @@ -2,7 +2,7 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; -import DeleteButton from '../delete-button/delete-button.jsx'; +import DeleteButton from '../../containers/delete-button.jsx'; import styles from './sprite-selector-item.css'; import {ContextMenuTrigger} from 'react-contextmenu'; import {DangerousMenuItem, ContextMenu, MenuItem} from '../context-menu/context-menu.jsx'; diff --git a/src/containers/delete-button.jsx b/src/containers/delete-button.jsx new file mode 100644 index 000000000..600fbcdee --- /dev/null +++ b/src/containers/delete-button.jsx @@ -0,0 +1,52 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import bindAll from 'lodash.bindall'; + +import DeleteButtonComponent from '../components/delete-button/delete-button.jsx'; + +class DeleteButton extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleKeyPress', + 'setRef' + ]); + } + componentDidMount () { + document.addEventListener('keydown', this.handleKeyPress); + } + componentWillUnmount () { + document.removeEventListener('keydown', this.handleKeyPress); + } + setRef (ref) { + this.ref = ref; + } + handleKeyPress (event) { + if (this.ref === event.currentTarget.activeElement && (event.key === 'Enter' || event.key === ' ')) { + this.props.onClick(event); + event.preventDefault(); + } + } + render () { + return ( + <DeleteButtonComponent + className={this.props.className} + setRef={this.setRef} + tabIndex={this.props.tabIndex} + onClick={this.props.onClick} + /> + ); + } +} + +DeleteButton.propTypes = { + className: PropTypes.string, + onClick: PropTypes.func.isRequired, + tabIndex: PropTypes.number +}; + +DeleteButton.defaultProps = { + tabIndex: 0 +}; + +export default DeleteButton; diff --git a/test/unit/components/sprite-selector-item.test.jsx b/test/unit/components/sprite-selector-item.test.jsx index fb103b4ef..b274d967b 100644 --- a/test/unit/components/sprite-selector-item.test.jsx +++ b/test/unit/components/sprite-selector-item.test.jsx @@ -1,7 +1,7 @@ import React from 'react'; import {mountWithIntl, shallowWithIntl, componentWithIntl} from '../../helpers/intl-helpers.jsx'; import SpriteSelectorItemComponent from '../../../src/components/sprite-selector-item/sprite-selector-item'; -import DeleteButton from '../../../src/components/delete-button/delete-button'; +import DeleteButton from '../../../src/containers/delete-button.jsx'; describe('SpriteSelectorItemComponent', () => { let className; -- GitLab