@@ -14,10 +14,17 @@ import {
1414} from './shared/dates' ;
1515import { setLocale } from './shared/locales' ;
1616import { isMaxDate , isMinDate } from './shared/propTypes' ;
17+ import { between } from './shared/utils' ;
1718
1819const allViews = [ 'century' , 'decade' , 'year' , 'month' ] ;
1920const allValueTypes = [ ...allViews . slice ( 1 ) , 'day' ] ;
2021
22+ const datesAreDifferent = ( date1 , date2 ) => (
23+ ( date1 && ! date2 ) ||
24+ ( ! date1 && date2 ) ||
25+ ( date1 && date2 && date1 . getTime ( ) !== date2 . getTime ( ) )
26+ ) ;
27+
2128const updateInputWidth = ( element ) => {
2229 const span = document . createElement ( 'span' ) ;
2330 span . innerHTML = element . value || element . placeholder ;
@@ -70,30 +77,38 @@ const max = (...args) => Math.max(...args.filter(a => typeof a === 'number'));
7077export default class DateInput extends Component {
7178 getValueFrom ( value ) {
7279 if ( ! value ) {
73- return value ;
80+ return null ;
7481 }
75- const { minDate } = this . props ;
82+
83+ const { minDate, maxDate } = this . props ;
7684 const rawValueFrom = value instanceof Array ? value [ 0 ] : value ;
77- const valueFrom = getBegin ( this . valueType , rawValueFrom ) ;
78- return (
79- minDate && minDate > valueFrom ?
80- minDate :
81- valueFrom
82- ) ;
85+ const valueFromDate = new Date ( rawValueFrom ) ;
86+
87+ if ( Number . isNaN ( valueFromDate . getTime ( ) ) ) {
88+ throw new Error ( `Invalid date: ${ value } ` ) ;
89+ }
90+
91+ const valueFrom = getBegin ( this . valueType , valueFromDate ) ;
92+
93+ return between ( valueFrom , minDate , maxDate ) ;
8394 }
8495
8596 getValueTo ( value ) {
8697 if ( ! value ) {
87- return value ;
98+ return null ;
8899 }
89- const { maxDate } = this . props ;
90- const rawValueFrom = value instanceof Array ? value [ 1 ] : value ;
91- const valueTo = getEnd ( this . valueType , rawValueFrom ) ;
92- return (
93- maxDate && maxDate < valueTo ?
94- maxDate :
95- valueTo
96- ) ;
100+
101+ const { minDate, maxDate } = this . props ;
102+ const rawValueTo = value instanceof Array ? value [ 1 ] : value ;
103+ const valueToDate = new Date ( rawValueTo ) ;
104+
105+ if ( Number . isNaN ( valueToDate . getTime ( ) ) ) {
106+ throw new Error ( `Invalid date: ${ value } ` ) ;
107+ }
108+
109+ const valueTo = getEnd ( this . valueType , valueToDate ) ;
110+
111+ return between ( valueTo , minDate , maxDate ) ;
97112 }
98113
99114 /**
@@ -125,15 +140,24 @@ export default class DateInput extends Component {
125140
126141 componentWillReceiveProps ( nextProps ) {
127142 const { props } = this ;
143+ const { value : nextValue } = nextProps ;
144+ const { value } = this . props ;
128145
129146 if ( nextProps . locale !== props . locale ) {
130147 setLocale ( nextProps . locale ) ;
131148 }
132149
150+ const nextValueFrom = this . getValueFrom ( nextValue ) ;
151+ const valueFrom = this . getValueFrom ( value ) ;
152+
153+ const nextValueTo = this . getValueTo ( nextValue ) ;
154+ const valueTo = this . getValueTo ( value ) ;
155+
133156 if (
157+ // Toggling calendar visibility resets values
134158 ( nextProps . isCalendarOpen !== props . isCalendarOpen ) ||
135- ( ! ! nextProps . value !== ! ! props . value ) ||
136- ( nextProps . value && props . value && ( nextProps . value . getTime ( ) !== props . value . getTime ( ) ) )
159+ datesAreDifferent ( nextValueFrom , valueFrom ) ||
160+ datesAreDifferent ( nextValueTo , valueTo )
137161 ) {
138162 this . updateValues ( nextProps ) ;
139163 }
@@ -283,7 +307,7 @@ export default class DateInput extends Component {
283307 }
284308
285309 updateValues ( props = this . props ) {
286- const { value } = props ;
310+ const value = this . getValueFrom ( props . value ) ;
287311
288312 this . setState ( {
289313 year : value ? getYear ( value ) : '' ,
@@ -500,5 +524,8 @@ DateInput.propTypes = {
500524 onChange : PropTypes . func ,
501525 returnValue : PropTypes . oneOf ( [ 'start' , 'end' ] ) ,
502526 required : PropTypes . bool ,
503- value : PropTypes . instanceOf ( Date ) ,
527+ value : PropTypes . oneOfType ( [
528+ PropTypes . string ,
529+ PropTypes . instanceOf ( Date ) ,
530+ ] ) ,
504531} ;
0 commit comments