Skip to content

Commit 2fceb4f

Browse files
authored
export activePicker (#37)
* export activePicker * update prop
1 parent 649ec52 commit 2fceb4f

File tree

1 file changed

+43
-33
lines changed

1 file changed

+43
-33
lines changed

src/RangePicker.tsx

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8082
type 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

Comments
 (0)