Skip to content

Commit 70cf26f

Browse files
authored
fix: refine toggle component (#319)
1 parent edb71ca commit 70cf26f

4 files changed

Lines changed: 47 additions & 9 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@
4040
"react-syntax-highlighter": "^9.0.1"
4141
},
4242
"devDependencies": {
43-
"annotated-prop-types": "^0.3.0",
4443
"@babel/cli": "^7.1.5",
4544
"@babel/core": "7.1.0",
4645
"@babel/polyfill": "^7.1.5",
4746
"@svgr/webpack": "2.4.1",
47+
"annotated-prop-types": "^0.3.0",
4848
"babel-core": "7.0.0-bridge.0",
4949
"babel-eslint": "9.0.0",
5050
"babel-jest": "23.6.0",

src/Toggle/Toggle.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@ import {TOGGLE_SIZES} from '../utils/constants';
66
export class Toggle extends React.Component {
77
constructor(props) {
88
super(props);
9-
this.state = { checked: props.checked };
9+
this.state = { checked: props.checked ? props.checked : false };
1010
}
1111

12-
handleChange = () => {
13-
this.setState({ checked: !this.state.checked });
14-
};
12+
handleChange = (e) => {
13+
this.setState({
14+
checked: !this.state.checked
15+
}, () => {
16+
this.props.onChange(e);
17+
});
18+
}
1519

1620
render() {
17-
const { size, id, disabled, children, className, labelProps, inputProps, ...rest } = this.props;
21+
const { size, id, checked, disabled, children, className, labelProps, inputProps, onChange, ...rest } = this.props;
1822

1923
const toggleClasses = classnames(
2024
'fd-form__item',
@@ -58,10 +62,20 @@ export class Toggle extends React.Component {
5862
}
5963

6064
Toggle.propTypes = {
65+
checked: PropTypes.bool,
6166
className: PropTypes.string,
6267
disabled: PropTypes.bool,
6368
id: PropTypes.string,
6469
inputProps: PropTypes.object,
6570
labelProps: PropTypes.object,
66-
size: PropTypes.oneOf(TOGGLE_SIZES)
71+
size: PropTypes.oneOf(TOGGLE_SIZES),
72+
onChange: PropTypes.func
73+
};
74+
75+
Toggle.defaultProps = {
76+
onChange: () => {}
77+
};
78+
79+
Toggle.propDescriptions = {
80+
checked: 'Set to true for component to be checked on render.'
6781
};

src/Toggle/Toggle.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,30 @@ describe('<Toggle />', () => {
5353
expect(wrapper.state(['checked'])).toBeTruthy();
5454
});
5555

56+
describe('Toggle default rendering', () => {
57+
test('should default to a not checked state', () => {
58+
const element = mount(<Toggle />);
59+
60+
expect(element.state(['checked'])).toBe(false);
61+
});
62+
test('should have truthy checked state when passed checked prop', () => {
63+
const element = mount(<Toggle checked />);
64+
65+
expect(element.state(['checked'])).toBe(true);
66+
});
67+
});
68+
69+
describe('onChange handler', () => {
70+
test('should dispatch the onChange callback with the event', () => {
71+
let f = jest.fn();
72+
const element = mount(<Toggle data-sample='Sample' onChange={f} />);
73+
74+
element.find('input[type="checkbox"]').simulate('change');
75+
76+
expect(f).toHaveBeenCalledTimes(1);
77+
});
78+
});
79+
5680
describe('Prop spreading', () => {
5781
test('should allow props to be spread to the Toggle component', () => {
5882
const element = mount(<Toggle data-sample='Sample' />);

src/Toggle/__snapshots__/Toggle.test.js.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ exports[`<Toggle /> create toggle component 1`] = `
1111
className="fd-toggle fd-form__control"
1212
>
1313
<input
14+
checked={false}
1415
onChange={[Function]}
1516
type="checkbox"
1617
/>
@@ -26,7 +27,6 @@ exports[`<Toggle /> create toggle component 1`] = `
2627

2728
exports[`<Toggle /> create toggle component 2`] = `
2829
<div
29-
checked={true}
3030
className="fd-form__item fd-form__item--check blue"
3131
>
3232
<label
@@ -61,6 +61,7 @@ exports[`<Toggle /> create toggle component 3`] = `
6161
className="fd-toggle fd-form__control"
6262
>
6363
<input
64+
checked={false}
6465
disabled={true}
6566
onChange={[Function]}
6667
type="checkbox"
@@ -77,7 +78,6 @@ exports[`<Toggle /> create toggle component 3`] = `
7778

7879
exports[`<Toggle /> create toggle component 4`] = `
7980
<div
80-
checked={true}
8181
className="fd-form__item fd-form__item--check"
8282
>
8383
<label

0 commit comments

Comments
 (0)