@@ -268,53 +268,9 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
268
268
} ;
269
269
270
270
let dateValue = useMemo ( ( ) => displayValue . toDate ( timeZone ) , [ displayValue , timeZone ] ) ;
271
- let timeValue = [ 'hour' , 'minute' , 'second' ] ;
272
- let dateSegments = [ 'day' , 'month' , 'year' ] ;
273
- // TODO: I don't like this but not sure what to do...
274
- let rtlLocale = [ 'ar-DZ' , 'ar-AE' , 'ar-EG' , 'ar-SA' ] ;
275
- let segments = useMemo ( ( ) =>
276
- dateFormatter . formatToParts ( dateValue )
277
- . map ( segment => {
278
- let isEditable = EDITABLE_SEGMENTS [ segment . type ] ;
279
- if ( segment . type === 'era' && calendar . getEras ( ) . length === 1 ) {
280
- isEditable = false ;
281
- }
282
-
283
- let isPlaceholder = EDITABLE_SEGMENTS [ segment . type ] && ! validSegments [ segment . type ] ;
284
- let placeholder = EDITABLE_SEGMENTS [ segment . type ] ? getPlaceholder ( segment . type , segment . value , locale ) : null ;
285
-
286
- let value = segment . value ;
287
- let place = placeholder ;
288
- if ( dateSegments . length === 3 && dateSegments . includes ( segment . type ) && ! rtlLocale . includes ( locale ) ) {
289
- value = `\u2066${ value } ` ;
290
- place = `\u2066${ place } ` ;
291
- } else if ( segment . type === 'hour' ) {
292
- value = `\u2066${ value } ` ;
293
- place = `\u2066${ place } ` ;
294
- // Ideally the unicode (\u2069) would be placed at the end but that seems to cause some issues
295
- // with the background when the rightmost character is focused in Hebrew.
296
- } else if ( dateSegments . length === 1 && dateSegments . includes ( segment . type ) && ! rtlLocale . includes ( locale ) ) {
297
- value = `\u2069${ value } ` ;
298
- place = `\u2069${ place } ` ;
299
- } else if ( timeValue . includes ( granularity ) && segment . type === granularity ) {
300
- value = `\u2069${ value } ` ;
301
- place = `\u2069${ place } ` ;
302
- }
303
-
304
- if ( dateSegments . includes ( segment . type ) ) {
305
- dateSegments = dateSegments . filter ( item => item !== segment . type ) ;
306
- } ;
307
-
308
- return {
309
- type : TYPE_MAPPING [ segment . type ] || segment . type ,
310
- text : isPlaceholder ? place : value ,
311
- ...getSegmentLimits ( displayValue , segment . type , resolvedOptions ) ,
312
- isPlaceholder,
313
- placeholder : place ,
314
- isEditable
315
- } as DateSegment ;
316
- } )
317
- , [ dateValue , validSegments , dateFormatter , resolvedOptions , displayValue , calendar , locale , granularity , timeValue ] ) ;
271
+ let segments = useMemo ( ( ) =>
272
+ processSegments ( dateValue , validSegments , dateFormatter , resolvedOptions , displayValue , calendar , locale , granularity ) ,
273
+ [ dateValue , validSegments , dateFormatter , resolvedOptions , displayValue , calendar , locale , granularity ] ) ;
318
274
319
275
// When the era field appears, mark it valid if the year field is already valid.
320
276
// If the era field disappears, remove it from the valid segments.
@@ -450,6 +406,66 @@ export function useDateFieldState<T extends DateValue = DateValue>(props: DateFi
450
406
} ;
451
407
}
452
408
409
+ function processSegments ( dateValue , validSegments , dateFormatter , resolvedOptions , displayValue , calendar , locale , granularity ) : DateSegment [ ] {
410
+ let timeValue = [ 'hour' , 'minute' , 'second' ] ;
411
+ let segments = dateFormatter . formatToParts ( dateValue ) ;
412
+ let processedSegments : DateSegment [ ] = [ ] ;
413
+ for ( let segment of segments ) {
414
+ let isEditable = EDITABLE_SEGMENTS [ segment . type ] ;
415
+ if ( segment . type === 'era' && calendar . getEras ( ) . length === 1 ) {
416
+ isEditable = false ;
417
+ }
418
+
419
+ let isPlaceholder = EDITABLE_SEGMENTS [ segment . type ] && ! validSegments [ segment . type ] ;
420
+ let placeholder = EDITABLE_SEGMENTS [ segment . type ] ? getPlaceholder ( segment . type , segment . value , locale ) : null ;
421
+
422
+ let dateSegment = {
423
+ type : TYPE_MAPPING [ segment . type ] || segment . type ,
424
+ text : isPlaceholder ? placeholder : segment . value ,
425
+ ...getSegmentLimits ( displayValue , segment . type , resolvedOptions ) ,
426
+ isPlaceholder,
427
+ placeholder,
428
+ isEditable
429
+ } as DateSegment ;
430
+
431
+ if ( segment . type === 'hour' ) {
432
+ processedSegments . push ( {
433
+ type : 'literal' ,
434
+ text : '\u2066' ,
435
+ ...getSegmentLimits ( displayValue , 'literal' , resolvedOptions ) ,
436
+ isPlaceholder : false ,
437
+ placeholder : '' ,
438
+ isEditable : false
439
+ } ) ;
440
+ processedSegments . push ( dateSegment ) ;
441
+ if ( segment . type === granularity ) {
442
+ processedSegments . push ( {
443
+ type : 'literal' ,
444
+ text : '\u2069' ,
445
+ ...getSegmentLimits ( displayValue , 'literal' , resolvedOptions ) ,
446
+ isPlaceholder : false ,
447
+ placeholder : '' ,
448
+ isEditable : false
449
+ } ) ;
450
+ }
451
+ } else if ( timeValue . includes ( granularity ) && segment . type === granularity ) {
452
+ processedSegments . push ( dateSegment ) ;
453
+ processedSegments . push ( {
454
+ type : 'literal' ,
455
+ text : '\u2069' ,
456
+ ...getSegmentLimits ( displayValue , 'literal' , resolvedOptions ) ,
457
+ isPlaceholder : false ,
458
+ placeholder : '' ,
459
+ isEditable : false
460
+ } ) ;
461
+ } else {
462
+ processedSegments . push ( dateSegment ) ;
463
+ }
464
+ }
465
+
466
+ return processedSegments ;
467
+ }
468
+
453
469
function getSegmentLimits ( date : DateValue , type : string , options : Intl . ResolvedDateTimeFormatOptions ) {
454
470
switch ( type ) {
455
471
case 'era' : {
0 commit comments