Skip to content

Commit a4092d9

Browse files
Merge pull request #2437 from interactivellama/datepicker-componentDidUpdate
Datepicker: Remove componentDidUpdate
2 parents b0e7d42 + 3d7a936 commit a4092d9

File tree

3 files changed

+40
-30
lines changed

3 files changed

+40
-30
lines changed

components/date-picker/__examples__/default.jsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@ import Datepicker from '~/components/date-picker';
88
class Example extends React.Component {
99
static displayName = 'DatepickerExample';
1010

11+
constructor() {
12+
super();
13+
this.state = {
14+
value: undefined,
15+
};
16+
}
17+
18+
handleChange = (event, data) => {
19+
this.setState({ value: data.date });
20+
};
21+
1122
render() {
1223
return (
1324
<IconSettings iconPath="/assets/icons">
@@ -16,6 +27,8 @@ class Example extends React.Component {
1627
label: 'Date',
1728
}}
1829
onChange={(event, data) => {
30+
this.handleChange(event, data);
31+
1932
if (this.props.action) {
2033
const dataAsArray = Object.keys(data).map((key) => data[key]);
2134
this.props.action('onChange')(event, data, ...dataAsArray);
@@ -37,6 +50,7 @@ class Example extends React.Component {
3750
parser={(dateString) => {
3851
return moment(dateString, 'MM-DD-YYYY').toDate();
3952
}}
53+
value={this.state.value}
4054
/>
4155
</IconSettings>
4256
);

components/date-picker/__tests__/date-picker.browser-test.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,6 @@ describe('SLDSDatepicker', function describeFunction() {
161161
menuPosition="relative"
162162
onChange={(event, data) => {
163163
setTimeout(() => {
164-
const input = wrapper.find('input');
165-
expect(input).to.have.value('1/1/2007');
166-
167164
// test callback parameters
168165
expect(data.date.getTime()).to.equal(
169166
new Date('1/1/2007').getTime()
@@ -446,12 +443,15 @@ describe('SLDSDatepicker', function describeFunction() {
446443
afterEach(() => wrapper.unmount());
447444

448445
it('disable weekends', (done) => {
446+
// this only tests if onChange fires
447+
const handleChangeSpy = sinon.spy();
449448
wrapper = mount(
450449
<DemoComponent
451450
isOpen
452451
menuPosition="relative"
453452
value={new Date(2007, 0, 5)}
454453
dateDisabled={({ date }) => date.getDay() > 5 || date.getDay() < 1}
454+
onChange={handleChangeSpy}
455455
/>
456456
);
457457

@@ -463,14 +463,14 @@ describe('SLDSDatepicker', function describeFunction() {
463463
.first();
464464
disabledDay.simulate('click', {});
465465

466-
expect(input).to.have.value('1/5/2007');
466+
expect(handleChangeSpy.calledOnce).to.equal(false);
467467

468468
const day = wrapper
469469
.find('.datepicker__month [aria-disabled=false]')
470470
.first();
471471
day.simulate('click', {});
472472

473-
expect(input).to.have.value('1/1/2007');
473+
expect(handleChangeSpy.calledOnce).to.equal(true);
474474
done();
475475

476476
const trigger = wrapper.find(triggerClassSelector);

components/date-picker/date-picker.jsx

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -274,26 +274,18 @@ class Datepicker extends React.Component {
274274
checkProps(DATE_PICKER, props, componentDoc);
275275
}
276276

277-
componentDidUpdate(nextProps) {
278-
if (nextProps.value && this.props.value) {
279-
const currentDate = this.props.value.getTime();
280-
const nextDate = nextProps.value.getTime();
281-
282-
if (currentDate !== nextDate) {
283-
// eslint-disable-next-line react/no-did-update-set-state
284-
this.setState({
285-
value: nextProps.value,
286-
formattedValue: this.props.formatter(nextProps.value),
287-
inputValue: this.props.formatter(nextProps.value),
288-
});
289-
}
290-
}
291-
}
292-
293277
getDatePicker = ({ labels, assistiveText }) => {
294-
const date = this.state.formattedValue
295-
? this.parseDate(this.state.formattedValue)
296-
: this.state.value;
278+
let date;
279+
// Use props if present. Otherwise, use state.
280+
if (this.props.value) {
281+
date = this.props.formatter(this.props.value)
282+
? this.parseDate(this.props.formatter(this.props.value))
283+
: this.props.value;
284+
} else {
285+
date = this.state.formattedValue
286+
? this.parseDate(this.state.formattedValue)
287+
: this.state.value;
288+
}
297289

298290
return (
299291
<CalendarWrapper
@@ -419,7 +411,9 @@ class Datepicker extends React.Component {
419411
this.openDialog();
420412
},
421413
onKeyDown: this.handleKeyDown,
422-
value: this.state.inputValue,
414+
value: this.props.value
415+
? this.props.formatter(this.props.value)
416+
: this.state.inputValue,
423417
};
424418

425419
// eslint-disable react/prop-types
@@ -467,11 +461,13 @@ class Datepicker extends React.Component {
467461
};
468462

469463
handleCalendarChange = (event, { date }) => {
470-
this.setState({
471-
value: date,
472-
formattedValue: this.props.formatter(date),
473-
inputValue: this.props.formatter(date),
474-
});
464+
if (!this.props.value) {
465+
this.setState({
466+
value: date,
467+
formattedValue: this.props.formatter(date),
468+
inputValue: this.props.formatter(date),
469+
});
470+
}
475471

476472
this.handleRequestClose();
477473

0 commit comments

Comments
 (0)