@@ -75,6 +75,8 @@ export interface RangePickerSharedProps<DateType> {
7575 onBlur ?: React . FocusEventHandler < HTMLInputElement > ;
7676 onOk ?: ( dates : RangeValue < DateType > ) => void ;
7777 direction ?: 'ltr' | 'rtl' ;
78+ /** @private Internal control of active picker. Do not use since it's private usage */
79+ activePickerIndex ?: 0 | 1 ;
7880}
7981
8082type OmitPickerProps < Props > = Omit <
@@ -177,6 +179,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
177179 components,
178180 order,
179181 direction,
182+ activePickerIndex,
180183 } = props as MergedRangePickerProps < DateType > ;
181184
182185 const needConfirmButton : boolean = ( picker === 'date' && ! ! showTime ) || picker === 'time' ;
@@ -193,7 +196,9 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
193196 const formatList = toArray ( getDefaultFormat ( format , picker , showTime , use12Hours ) ) ;
194197
195198 // Active picker
196- const [ activePickerIndex , setActivePickerIndex ] = React . useState < 0 | 1 > ( 0 ) ;
199+ const [ mergedActivePickerIndex , setMergedActivePickerIndex ] = useMergedState < 0 | 1 > ( 0 , {
200+ value : activePickerIndex ,
201+ } ) ;
197202
198203 // Operation ref
199204 const operationRef : React . MutableRefObject < ContextOperationRefProps | null > = React . useRef <
@@ -244,10 +249,10 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
244249 const [ hoverRangedValue , setHoverRangedValue ] = React . useState < RangeValue < DateType > > ( null ) ;
245250
246251 const onDateMouseEnter = ( date : DateType ) => {
247- setHoverRangedValue ( updateValues ( selectedValue , date , activePickerIndex ) ) ;
252+ setHoverRangedValue ( updateValues ( selectedValue , date , mergedActivePickerIndex ) ) ;
248253 } ;
249254 const onDateMouseLeave = ( ) => {
250- setHoverRangedValue ( updateValues ( selectedValue , null , activePickerIndex ) ) ;
255+ setHoverRangedValue ( updateValues ( selectedValue , null , mergedActivePickerIndex ) ) ;
251256 } ;
252257
253258 // ============================= Modes =============================
@@ -281,7 +286,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
281286 const [ mergedOpen , triggerInnerOpen ] = useMergedState ( false , {
282287 value : open ,
283288 defaultValue : defaultOpen ,
284- postState : postOpen => ( mergedDisabled [ activePickerIndex ] ? false : postOpen ) ,
289+ postState : postOpen => ( mergedDisabled [ mergedActivePickerIndex ] ? false : postOpen ) ,
285290 onChange : newOpen => {
286291 if ( onOpenChange ) {
287292 onOpenChange ( newOpen ) ;
@@ -293,8 +298,8 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
293298 } ,
294299 } ) ;
295300
296- const startOpen = mergedOpen && activePickerIndex === 0 ;
297- const endOpen = mergedOpen && activePickerIndex === 1 ;
301+ const startOpen = mergedOpen && mergedActivePickerIndex === 0 ;
302+ const endOpen = mergedOpen && mergedActivePickerIndex === 1 ;
298303
299304 // ============================= Popup =============================
300305 // Popup min width
@@ -356,7 +361,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
356361 // Trigger onChange only when value is validate
357362 setInnerValue ( values ) ;
358363 if ( source !== 'open' ) {
359- triggerOpen ( false , activePickerIndex , true ) ;
364+ triggerOpen ( false , mergedActivePickerIndex , true ) ;
360365 }
361366
362367 if (
@@ -371,7 +376,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
371376 const missingValueIndex = canStartValueTrigger ? 1 : 0 ;
372377
373378 // Same index means user choice to close picker
374- if ( missingValueIndex === activePickerIndex ) {
379+ if ( missingValueIndex === mergedActivePickerIndex ) {
375380 return ;
376381 }
377382
@@ -391,14 +396,14 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
391396
392397 triggerOpen = ( newOpen : boolean , index : 0 | 1 , preventChangeEvent : boolean = false ) => {
393398 if ( newOpen ) {
394- setActivePickerIndex ( index ) ;
399+ setMergedActivePickerIndex ( index ) ;
395400 triggerInnerOpen ( newOpen ) ;
396401
397402 // Open to reset view date
398403 if ( ! mergedOpen ) {
399404 setViewDate ( null , index ) ;
400405 }
401- } else if ( activePickerIndex === index ) {
406+ } else if ( mergedActivePickerIndex === index ) {
402407 triggerInnerOpen ( newOpen ) ;
403408 if ( ! preventChangeEvent ) {
404409 triggerChange ( selectedValue , { source : 'open' } ) ;
@@ -466,7 +471,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
466471 target as HTMLElement ,
467472 ) ,
468473 onFocus : ( e : React . FocusEvent < HTMLInputElement > ) => {
469- setActivePickerIndex ( index ) ;
474+ setMergedActivePickerIndex ( index ) ;
470475 if ( onFocus ) {
471476 onFocus ( e ) ;
472477 }
@@ -602,7 +607,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
602607 const timeDefaultValues : DateType [ ] = showTime . defaultValue ! ;
603608 panelShowTime = {
604609 ...showTime ,
605- defaultValue : getValue ( timeDefaultValues , activePickerIndex ) || undefined ,
610+ defaultValue : getValue ( timeDefaultValues , mergedActivePickerIndex ) || undefined ,
606611 } ;
607612 }
608613
@@ -619,30 +624,31 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
619624 { ...( props as any ) }
620625 { ...panelProps }
621626 showTime = { panelShowTime }
622- mode = { mergedModes [ activePickerIndex ] }
627+ mode = { mergedModes [ mergedActivePickerIndex ] }
623628 generateConfig = { generateConfig }
624629 style = { undefined }
625630 direction = { direction }
626- disabledDate = { activePickerIndex === 0 ? disabledStartDate : disabledEndDate }
631+ disabledDate = { mergedActivePickerIndex === 0 ? disabledStartDate : disabledEndDate }
627632 disabledTime = { date => {
628633 if ( disabledTime ) {
629- return disabledTime ( date , activePickerIndex === 0 ? 'start' : 'end' ) ;
634+ return disabledTime ( date , mergedActivePickerIndex === 0 ? 'start' : 'end' ) ;
630635 }
631636 return false ;
632637 } }
633638 className = { classNames ( {
634- [ `${ prefixCls } -panel-focused` ] : activePickerIndex === 0 ? ! startTyping : ! endTyping ,
639+ [ `${ prefixCls } -panel-focused` ] :
640+ mergedActivePickerIndex === 0 ? ! startTyping : ! endTyping ,
635641 } ) }
636- value = { getValue ( selectedValue , activePickerIndex ) }
642+ value = { getValue ( selectedValue , mergedActivePickerIndex ) }
637643 locale = { locale }
638644 tabIndex = { - 1 }
639645 onPanelChange = { ( date , newMode ) => {
640646 triggerModesChange (
641- updateValues ( mergedModes , newMode , activePickerIndex ) ,
642- updateValues ( selectedValue , date , activePickerIndex ) ,
647+ updateValues ( mergedModes , newMode , mergedActivePickerIndex ) ,
648+ updateValues ( selectedValue , date , mergedActivePickerIndex ) ,
643649 ) ;
644650
645- setViewDate ( date , activePickerIndex ) ;
651+ setViewDate ( date , mergedActivePickerIndex ) ;
646652 } }
647653 onOk = { null }
648654 onSelect = { undefined }
@@ -657,7 +663,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
657663 let arrowLeft : number = 0 ;
658664 let panelLeft : number = 0 ;
659665 if (
660- activePickerIndex &&
666+ mergedActivePickerIndex &&
661667 startInputDivRef . current &&
662668 separatorRef . current &&
663669 panelDivRef . current
@@ -674,17 +680,21 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
674680
675681 function renderPanels ( ) {
676682 let panels : React . ReactNode ;
677- const extraNode = getExtraFooter ( prefixCls , mergedModes [ activePickerIndex ] , renderExtraFooter ) ;
683+ const extraNode = getExtraFooter (
684+ prefixCls ,
685+ mergedModes [ mergedActivePickerIndex ] ,
686+ renderExtraFooter ,
687+ ) ;
678688
679689 const rangesNode = getRanges ( {
680690 prefixCls,
681691 components,
682692 needConfirmButton,
683- okDisabled : ! getValue ( selectedValue , activePickerIndex ) ,
693+ okDisabled : ! getValue ( selectedValue , mergedActivePickerIndex ) ,
684694 locale,
685695 rangeList,
686696 onOk : ( ) => {
687- if ( getValue ( selectedValue , activePickerIndex ) ) {
697+ if ( getValue ( selectedValue , mergedActivePickerIndex ) ) {
688698 triggerChange ( selectedValue ) ;
689699 if ( onOk ) {
690700 onOk ( selectedValue ) ;
@@ -694,23 +704,23 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
694704 } ) ;
695705
696706 if ( picker !== 'time' && ! showTime ) {
697- const viewDate = getViewDate ( activePickerIndex ) ;
707+ const viewDate = getViewDate ( mergedActivePickerIndex ) ;
698708 const nextViewDate = getClosingViewDate ( viewDate , picker , generateConfig ) ;
699- const currentMode = mergedModes [ activePickerIndex ] ;
709+ const currentMode = mergedModes [ mergedActivePickerIndex ] ;
700710
701711 const showDoublePanel = currentMode === picker ;
702712 const leftPanel = renderPanel ( showDoublePanel ? 'left' : false , {
703713 pickerValue : viewDate ,
704714 onPickerValueChange : newViewDate => {
705- setViewDate ( newViewDate , activePickerIndex ) ;
715+ setViewDate ( newViewDate , mergedActivePickerIndex ) ;
706716 } ,
707717 } ) ;
708718 const rightPanel = renderPanel ( 'right' , {
709719 pickerValue : nextViewDate ,
710720 onPickerValueChange : newViewDate => {
711721 setViewDate (
712722 getClosingViewDate ( newViewDate , picker , generateConfig , - 1 ) ,
713- activePickerIndex ,
723+ mergedActivePickerIndex ,
714724 ) ;
715725 } ,
716726 } ) ;
@@ -802,7 +812,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
802812 let activeBarLeft : number = 0 ;
803813 let activeBarWidth : number = 0 ;
804814 if ( startInputDivRef . current && endInputDivRef . current && separatorRef . current ) {
805- if ( activePickerIndex === 0 ) {
815+ if ( mergedActivePickerIndex === 0 ) {
806816 activeBarWidth = startInputDivRef . current . offsetWidth ;
807817 } else {
808818 activeBarLeft = arrowLeft ;
@@ -813,7 +823,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
813823 direction === 'rtl' ? { right : activeBarLeft } : { left : activeBarLeft } ;
814824 // ============================ Return =============================
815825 const onContextSelect = ( date : DateType , type : 'key' | 'mouse' | 'submit' ) => {
816- const values = updateValues ( selectedValue , date , activePickerIndex ) ;
826+ const values = updateValues ( selectedValue , date , mergedActivePickerIndex ) ;
817827
818828 if ( type === 'submit' || ( type !== 'key' && ! needConfirmButton ) ) {
819829 // triggerChange will also update selected values
@@ -851,15 +861,15 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
851861 ref = { containerRef }
852862 className = { classNames ( prefixCls , `${ prefixCls } -range` , className , {
853863 [ `${ prefixCls } -disabled` ] : mergedDisabled [ 0 ] && mergedDisabled [ 1 ] ,
854- [ `${ prefixCls } -focused` ] : activePickerIndex === 0 ? startFocused : endFocused ,
864+ [ `${ prefixCls } -focused` ] : mergedActivePickerIndex === 0 ? startFocused : endFocused ,
855865 [ `${ prefixCls } -rtl` ] : direction === 'rtl' ,
856866 } ) }
857867 style = { style }
858868 { ...getDataOrAriaProps ( props ) }
859869 >
860870 < div
861871 className = { classNames ( `${ prefixCls } -input` , {
862- [ `${ prefixCls } -input-active` ] : activePickerIndex === 0 ,
872+ [ `${ prefixCls } -input-active` ] : mergedActivePickerIndex === 0 ,
863873 } ) }
864874 ref = { startInputDivRef }
865875 >
@@ -882,7 +892,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
882892 </ div >
883893 < div
884894 className = { classNames ( `${ prefixCls } -input` , {
885- [ `${ prefixCls } -input-active` ] : activePickerIndex === 1 ,
895+ [ `${ prefixCls } -input-active` ] : mergedActivePickerIndex === 1 ,
886896 } ) }
887897 ref = { endInputDivRef }
888898 >
0 commit comments