Skip to content

Commit 3701a4f

Browse files
committed
Refactor to separate container/component
Also noticed that Delete aria label was not localized.
1 parent 1b4b50b commit 3701a4f

File tree

4 files changed

+97
-52
lines changed

4 files changed

+97
-52
lines changed
Lines changed: 43 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,60 @@
11
import PropTypes from 'prop-types';
22
import React from 'react';
3-
import bindAll from 'lodash.bindall';
43
import classNames from 'classnames';
4+
import {defineMessages, injectIntl, intlShape} from 'react-intl';
55

66
import styles from './delete-button.css';
77
import deleteIcon from './icon--delete.svg';
88

9-
class DeleteButton extends React.Component {
10-
constructor (props) {
11-
super(props);
12-
bindAll(this, [
13-
'handleKeyPress',
14-
'setRef'
15-
]);
9+
const messages = defineMessages({
10+
delete: {
11+
id: 'gui.deleteButton.delete',
12+
description: 'Title of the button to delete a sprite, costume or sound',
13+
defaultMessage: 'Delete'
1614
}
17-
componentDidMount () {
18-
document.addEventListener('keydown', this.handleKeyPress);
19-
}
20-
componentWillUnmount () {
21-
document.removeEventListener('keydown', this.handleKeyPress);
22-
}
23-
setRef (ref) {
24-
this.ref = ref;
25-
}
26-
handleKeyPress (event) {
27-
if (this.ref === event.currentTarget.activeElement && (event.key === 'Enter' || event.key === ' ')) {
28-
this.props.onClick(event);
29-
event.preventDefault();
30-
}
31-
}
32-
render () {
33-
return (
34-
<div
35-
aria-label="Delete"
36-
className={classNames(
37-
styles.deleteButton,
38-
this.props.className
39-
)}
40-
ref={this.setRef}
41-
role="button"
42-
tabIndex={this.props.tabIndex}
43-
onClick={this.props.onClick}
44-
>
45-
<div className={styles.deleteButtonVisible}>
46-
<img
47-
className={styles.deleteIcon}
48-
draggable={false}
49-
src={deleteIcon}
50-
/>
51-
</div>
52-
</div>
53-
);
54-
}
55-
}
15+
});
16+
17+
const DeleteButtonComponent = ({
18+
className,
19+
intl,
20+
onClick,
21+
setRef,
22+
tabIndex,
23+
...props
24+
}) => (
25+
<div
26+
aria-label={intl.formatMessage(messages.delete)}
27+
className={classNames(
28+
styles.deleteButton,
29+
className
30+
)}
31+
ref={setRef}
32+
role="button"
33+
tabIndex={tabIndex}
34+
onClick={onClick}
35+
{...props}
36+
>
37+
<div className={styles.deleteButtonVisible}>
38+
<img
39+
className={styles.deleteIcon}
40+
draggable={false}
41+
src={deleteIcon}
42+
/>
43+
</div>
44+
</div>
45+
);
46+
5647

57-
DeleteButton.propTypes = {
48+
DeleteButtonComponent.propTypes = {
5849
className: PropTypes.string,
50+
intl: intlShape,
5951
onClick: PropTypes.func.isRequired,
52+
setRef: PropTypes.func.isRequired,
6053
tabIndex: PropTypes.number
6154
};
6255

63-
DeleteButton.defaultProps = {
56+
DeleteButtonComponent.defaultProps = {
6457
tabIndex: 0
6558
};
6659

67-
export default DeleteButton;
60+
export default injectIntl(DeleteButtonComponent);

src/components/sprite-selector-item/sprite-selector-item.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import classNames from 'classnames';
22
import PropTypes from 'prop-types';
33
import React from 'react';
44

5-
import DeleteButton from '../delete-button/delete-button.jsx';
5+
import DeleteButton from '../../containers/delete-button.jsx';
66
import styles from './sprite-selector-item.css';
77
import {ContextMenuTrigger} from 'react-contextmenu';
88
import {DangerousMenuItem, ContextMenu, MenuItem} from '../context-menu/context-menu.jsx';

src/containers/delete-button.jsx

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import PropTypes from 'prop-types';
2+
import React from 'react';
3+
import bindAll from 'lodash.bindall';
4+
5+
import DeleteButtonComponent from '../components/delete-button/delete-button.jsx';
6+
7+
class DeleteButton extends React.Component {
8+
constructor (props) {
9+
super(props);
10+
bindAll(this, [
11+
'handleKeyPress',
12+
'setRef'
13+
]);
14+
}
15+
componentDidMount () {
16+
document.addEventListener('keydown', this.handleKeyPress);
17+
}
18+
componentWillUnmount () {
19+
document.removeEventListener('keydown', this.handleKeyPress);
20+
}
21+
setRef (ref) {
22+
this.ref = ref;
23+
}
24+
handleKeyPress (event) {
25+
if (this.ref === event.currentTarget.activeElement && (event.key === 'Enter' || event.key === ' ')) {
26+
this.props.onClick(event);
27+
event.preventDefault();
28+
}
29+
}
30+
render () {
31+
return (
32+
<DeleteButtonComponent
33+
className={this.props.className}
34+
setRef={this.setRef}
35+
tabIndex={this.props.tabIndex}
36+
onClick={this.props.onClick}
37+
/>
38+
);
39+
}
40+
}
41+
42+
DeleteButton.propTypes = {
43+
className: PropTypes.string,
44+
onClick: PropTypes.func.isRequired,
45+
tabIndex: PropTypes.number
46+
};
47+
48+
DeleteButton.defaultProps = {
49+
tabIndex: 0
50+
};
51+
52+
export default DeleteButton;

test/unit/components/sprite-selector-item.test.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22
import {mountWithIntl, shallowWithIntl, componentWithIntl} from '../../helpers/intl-helpers.jsx';
33
import SpriteSelectorItemComponent from '../../../src/components/sprite-selector-item/sprite-selector-item';
4-
import DeleteButton from '../../../src/components/delete-button/delete-button';
4+
import DeleteButton from '../../../src/containers/delete-button.jsx';
55

66
describe('SpriteSelectorItemComponent', () => {
77
let className;

0 commit comments

Comments
 (0)