@@ -171,8 +171,7 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
171171 let v : DateValue | null = props . value || props . defaultValue || props . placeholderValue || null ;
172172 let [ granularity , defaultTimeZone ] = useDefaultProps ( v , props . granularity ) ;
173173 let timeZone = defaultTimeZone || 'UTC' ;
174- const isValueConfirmed = useRef ( props . value || props . defaultValue ? true : false )
175- const [ shouldValidate , setShouldValidate ] = useState ( false )
174+ const [ shouldValidate , setShouldValidate ] = useState ( false ) ;
176175
177176 // props.granularity must actually exist in the value if one is provided.
178177 if ( v && ! ( granularity in v ) ) {
@@ -188,7 +187,10 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
188187 props . onChange
189188 ) ;
190189
191- const previousValue = useRef ( value )
190+ const [ isValueConfirmed , setIsValueConfirmed ] = useState ( ! ! ( value ) ) ;
191+
192+
193+ const previousValue = useRef ( value ) ;
192194
193195 let [ initialValue ] = useState ( value ) ;
194196 let calendarValue = useMemo ( ( ) => convertValue ( value , calendar ) ?? null , [ value , calendar ] ) ;
@@ -248,24 +250,23 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
248250 if ( value !== previousValue . current && value && Object . keys ( validSegments ) . length <= Object . keys ( allSegments ) . length ) {
249251 validSegments = { ...allSegments } ;
250252 setValidSegments ( validSegments ) ;
251- setPlaceholderDate ( value )
252- previousValue . current = value
253- isValueConfirmed . current = true
253+ setPlaceholderDate ( value ) ;
254+ previousValue . current = value ;
255+ setIsValueConfirmed ( true ) ;
254256 }
255257
256258
257-
258259 // If the value is set to null and all segments are valid, reset the placeholder.
259260 if ( value !== previousValue . current && value == null && Object . keys ( validSegments ) . length === Object . keys ( allSegments ) . length ) {
260261 validSegments = { } ;
261- setValidSegments ( validSegments ) ; //reason
262+ setValidSegments ( validSegments ) ; // reason
262263 setPlaceholderDate ( createPlaceholderDate ( props . placeholderValue , granularity , calendar , defaultTimeZone ) ) ;
263- previousValue . current = value
264- isValueConfirmed . current = true
264+ previousValue . current = value ;
265+ setIsValueConfirmed ( true ) ;
265266 }
266267 // If all segments are valid, use the date from state, otherwise use the placeholder date.
267- let displayValue = isValueConfirmed . current && value ? value : placeholderDate ;
268- const currentValue = useRef ( displayValue )
268+ let displayValue = isValueConfirmed && value ? value : placeholderDate ;
269+ const currentValue = useRef ( displayValue ) ;
269270 let setValue = ( newValue : DateValue ) => {
270271 if ( props . isDisabled || props . isReadOnly ) {
271272 return ;
@@ -294,27 +295,28 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
294295 // Emit dates in the same calendar as the original value, if any, otherwise gregorian.
295296 const value = toCalendar ( newValue , v ?. calendar || new GregorianCalendar ( ) ) ;
296297 setDate ( value ) ;
297- previousValue . current = value
298- setPlaceholderDate ( value )
298+ setIsValueConfirmed ( true ) ;
299+ previousValue . current = value ;
300+ setPlaceholderDate ( value ) ;
299301 }
300- } ;
302+ } ;
301303
302304 let constrainDate = ( value : DateValue ) => {
303- const day = Math . max ( 1 , Math . min ( value . calendar . getDaysInMonth ( value ) , value . day ) ) ;
304- return setSegment ( value , " day" , day , resolvedOptions )
305- }
305+ const day = Math . max ( 1 , Math . min ( value . calendar . getDaysInMonth ( value ) , value . day ) ) ;
306+ return setSegment ( value , ' day' , day , resolvedOptions ) ;
307+ } ;
306308
307309 let updatePlaceholder = ( newValue : DateValue ) => {
308310 if ( props . isDisabled || props . isReadOnly ) {
309311 return ;
310312 }
311- currentValue . current = newValue
313+ currentValue . current = newValue ;
312314 setPlaceholderDate ( newValue ) ;
313315 } ;
314316
315317 let dateValue = useMemo ( ( ) => displayValue . toDate ( timeZone ) , [ displayValue , timeZone ] ) ;
316318 let segments = useMemo ( ( ) =>
317- processSegments ( dateValue , validSegments , dateFormatter , resolvedOptions , displayValue , calendar , locale , granularity , isValueConfirmed . current ) ,
319+ processSegments ( dateValue , validSegments , dateFormatter , resolvedOptions , displayValue , calendar , locale , granularity , isValueConfirmed ) ,
318320 [ dateValue , validSegments , dateFormatter , resolvedOptions , displayValue , calendar , locale , granularity ] ) ;
319321
320322 // When the era field appears, mark it valid if the year field is already valid.
@@ -336,31 +338,29 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
336338 } ;
337339
338340 let adjustSegment = ( type : Intl . DateTimeFormatPartTypes , amount : number ) => {
339- isValueConfirmed . current = false
340- setShouldValidate ( true )
341-
341+ setShouldValidate ( true ) ;
342+ setIsValueConfirmed ( false ) ;
343+
342344 if ( ! validSegments [ type ] ) {
343345 markValid ( type ) ;
344346 let validKeys = Object . keys ( validSegments ) ;
345347 let allKeys = Object . keys ( allSegments ) ;
346348 if ( validKeys . length >= allKeys . length || ( validKeys . length === allKeys . length - 1 && allSegments . dayPeriod && ! validSegments . dayPeriod ) ) {
347- currentValue . current = displayValue
348- setValue ( constrainDate ( displayValue ) )
349- } else updatePlaceholder ( displayValue )
349+ currentValue . current = displayValue ;
350+ setValue ( constrainDate ( displayValue ) ) ;
351+ } else { updatePlaceholder ( displayValue ) ; }
350352 } else {
351353 let validKeys = Object . keys ( validSegments ) ;
352354 let allKeys = Object . keys ( allSegments ) ;
353- const v = addSegment ( displayValue , type , amount , resolvedOptions )
355+ const v = addSegment ( displayValue , type , amount , resolvedOptions ) ;
354356 if ( validKeys . length >= allKeys . length || ( validKeys . length === allKeys . length - 1 && allSegments . dayPeriod && ! validSegments . dayPeriod ) ) {
355- currentValue . current = v
356- setValue ( constrainDate ( v ) )
357- } else {
358- updatePlaceholder ( v )
357+ currentValue . current = v ;
358+ setValue ( constrainDate ( v ) ) ;
359+ } else {
360+ updatePlaceholder ( v ) ;
359361 }
360362 }
361363 } ;
362-
363-
364364
365365
366366 let builtinValidation = useMemo ( ( ) => getValidationResult (
@@ -411,25 +411,25 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
411411 adjustSegment ( part , - ( PAGE_STEP [ part ] || 1 ) ) ;
412412 } ,
413413 setSegment ( part , v : string | number ) {
414- isValueConfirmed . current = false
415- setShouldValidate ( true )
414+ setIsValueConfirmed ( false ) ;
415+ setShouldValidate ( true ) ;
416416 markValid ( part ) ;
417417 updatePlaceholder ( setSegment ( displayValue , part , v , resolvedOptions ) ) ;
418418 } ,
419419 incrementToMinMax ( part , v : string | number ) {
420- isValueConfirmed . current = false
421- setShouldValidate ( true )
422- markValid ( part )
423- let validKeys = Object . keys ( validSegments ) ;
424- let allKeys = Object . keys ( allSegments ) ;
425- const value = setSegment ( displayValue , part , v , resolvedOptions )
426- currentValue . current = value
427- if ( validKeys . length >= allKeys . length || ( validKeys . length === allKeys . length - 1 && allSegments . dayPeriod && ! validSegments . dayPeriod ) ) {
428- setValue ( constrainDate ( value ) )
429- } else {
430- updatePlaceholder ( value )
431- }
432- } ,
420+ setIsValueConfirmed ( false ) ;
421+ setShouldValidate ( true ) ;
422+ markValid ( part ) ;
423+ let validKeys = Object . keys ( validSegments ) ;
424+ let allKeys = Object . keys ( allSegments ) ;
425+ const value = setSegment ( displayValue , part , v , resolvedOptions ) ;
426+ currentValue . current = value ;
427+ if ( validKeys . length >= allKeys . length || ( validKeys . length === allKeys . length - 1 && allSegments . dayPeriod && ! validSegments . dayPeriod ) ) {
428+ setValue ( constrainDate ( value ) ) ;
429+ } else {
430+ updatePlaceholder ( value ) ;
431+ }
432+ } ,
433433 confirmPlaceholder ( ) {
434434 if ( props . isDisabled || props . isReadOnly ) {
435435 return ;
@@ -441,15 +441,15 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
441441 ( validKeys . length === allKeys . length - 1 && allSegments . dayPeriod && ! validSegments . dayPeriod && clearedSegment . current !== 'dayPeriod' ) ) {
442442 validSegments = { ...allSegments } ;
443443 setValidSegments ( validSegments ) ;
444- setValue ( constrainDate ( currentValue . current ) )
445- } else {
446- setDate ( null )
447- previousValue . current = null
444+ setValue ( constrainDate ( currentValue . current ) ) ;
445+ } else {
446+ setDate ( null ) ;
447+ setIsValueConfirmed ( true ) ;
448+ previousValue . current = null ;
448449 }
449- isValueConfirmed . current = true
450450 } ,
451451 clearSegment ( part ) {
452- isValueConfirmed . current = false
452+ setIsValueConfirmed ( false ) ;
453453 delete validSegments [ part ] ;
454454 clearedSegment . current = part ;
455455 setValidSegments ( { ...validSegments } ) ;
@@ -504,20 +504,20 @@ function processSegments(dateValue, validSegments, dateFormatter, resolvedOption
504504 let isPlaceholder = EDITABLE_SEGMENTS [ type ] && ! validSegments [ type ] ;
505505 let placeholder = EDITABLE_SEGMENTS [ type ] ? getPlaceholder ( type , segment . value , locale ) : null ;
506506
507- let value = segment . value
507+ let value = segment . value ;
508508
509- if ( ! isConfirmed && [ 'day' , 'month' , 'year' ] . includes ( segment . type ) ) {
510- let numberFormatter = new Intl . NumberFormat ( locale , {
511- useGrouping : false
512- } ) ;
509+ if ( ! isConfirmed && [ 'day' , 'month' , 'year' ] . includes ( segment . type ) ) {
510+ let numberFormatter = new Intl . NumberFormat ( locale , {
511+ useGrouping : false
512+ } ) ;
513513
514- let twoDigitFormatter = new Intl . NumberFormat ( locale , {
515- useGrouping : false ,
516- minimumIntegerDigits : 2
517- } )
514+ let twoDigitFormatter = new Intl . NumberFormat ( locale , {
515+ useGrouping : false ,
516+ minimumIntegerDigits : 2
517+ } ) ;
518518
519- let f = dateFormatter . resolvedOptions ( ) [ segment . type ] === '2-digit' ? twoDigitFormatter : numberFormatter ;
520- value = f . format ( displayValue [ segment . type ] ) ;
519+ let f = dateFormatter . resolvedOptions ( ) [ segment . type ] === '2-digit' ? twoDigitFormatter : numberFormatter ;
520+ value = f . format ( displayValue [ segment . type ] ) ;
521521 }
522522
523523 let dateSegment = {
0 commit comments