@@ -10,6 +10,7 @@ import Picker, {
10
10
PickerBaseProps ,
11
11
PickerDateProps ,
12
12
PickerTimeProps ,
13
+ PickerRefConfig ,
13
14
} from './Picker' ;
14
15
import {
15
16
NullableDateType ,
@@ -121,7 +122,7 @@ interface MergedRangePickerProps<DateType>
121
122
122
123
function InternalRangePicker < DateType > (
123
124
props : RangePickerProps < DateType > & {
124
- pickerRef : React . Ref < Picker < DateType > > ;
125
+ pickerRef : React . Ref < PickerRefConfig > ;
125
126
} ,
126
127
) {
127
128
const {
@@ -152,7 +153,7 @@ function InternalRangePicker<DateType>(
152
153
onFocus,
153
154
onBlur,
154
155
} = props as MergedRangePickerProps < DateType > & {
155
- pickerRef : React . Ref < Picker < DateType > > ;
156
+ pickerRef : React . MutableRefObject < PickerRefConfig > ;
156
157
} ;
157
158
158
159
const formatList = toArray (
@@ -262,8 +263,38 @@ function InternalRangePicker<DateType>(
262
263
}
263
264
} ;
264
265
265
- // ============================== Mode ==============================
266
+ // ============================== Open ==============================
267
+ const startPickerRef = React . useRef < Picker < DateType > > ( null ) ;
268
+ const endPickerRef = React . useRef < Picker < DateType > > ( null ) ;
269
+ const lastOpenIdRef = React . useRef < number > ( ) ;
270
+
271
+ const onStartOpenChange = ( open : boolean ) => {
272
+ if ( ! open && innerValue && innerValue [ 0 ] ) {
273
+ lastOpenIdRef . current = window . setTimeout ( ( ) => {
274
+ if ( endPickerRef . current ) {
275
+ endPickerRef . current ! . focus ( ) ;
276
+ endPickerRef . current ! . open ( ) ;
277
+ }
278
+ } , 100 ) ;
279
+ }
280
+
281
+ if ( props . onOpenChange ) {
282
+ props . onOpenChange ( open ) ;
283
+ }
284
+ } ;
266
285
286
+ React . useEffect (
287
+ ( ) => ( ) => {
288
+ window . clearTimeout ( lastOpenIdRef . current ) ;
289
+ } ,
290
+ [ ] ,
291
+ ) ;
292
+
293
+ if ( pickerRef ) {
294
+ pickerRef . current = startPickerRef . current as any ;
295
+ }
296
+
297
+ // ============================== Mode ==============================
267
298
/**
268
299
* [Legacy] handle internal `onPanelChange`
269
300
*/
@@ -407,7 +438,7 @@ function InternalRangePicker<DateType>(
407
438
>
408
439
< Picker < DateType >
409
440
{ ...pickerProps }
410
- ref = { pickerRef }
441
+ ref = { startPickerRef }
411
442
prefixCls = { prefixCls }
412
443
value = { value1 }
413
444
placeholder = { placeholder && placeholder [ 0 ] }
@@ -423,10 +454,12 @@ function InternalRangePicker<DateType>(
423
454
onFocus = { onFocus }
424
455
onBlur = { onBlur }
425
456
onPanelChange = { onStartPanelChange }
457
+ onOpenChange = { onStartOpenChange }
426
458
/>
427
459
{ separator }
428
460
< Picker < DateType >
429
461
{ ...pickerProps }
462
+ ref = { endPickerRef }
430
463
prefixCls = { prefixCls }
431
464
value = { value2 }
432
465
placeholder = { placeholder && placeholder [ 1 ] }
@@ -452,7 +485,7 @@ function InternalRangePicker<DateType>(
452
485
class RangePicker < DateType > extends React . Component <
453
486
RangePickerProps < DateType >
454
487
> {
455
- pickerRef = React . createRef < Picker < DateType > > ( ) ;
488
+ pickerRef = React . createRef < PickerRefConfig > ( ) ;
456
489
457
490
focus = ( ) => {
458
491
if ( this . pickerRef . current ) {
@@ -470,7 +503,7 @@ class RangePicker<DateType> extends React.Component<
470
503
return (
471
504
< InternalRangePicker < DateType >
472
505
{ ...this . props }
473
- pickerRef = { this . pickerRef }
506
+ pickerRef = { this . pickerRef as React . MutableRefObject < PickerRefConfig > }
474
507
/>
475
508
) ;
476
509
}
0 commit comments