Skip to content

Commit bfaec9d

Browse files
authored
chore: Not trigger switch when user do nothing on input (#92)
* move blur to trigger into the hooks * clean up * add test case
1 parent 40965f0 commit bfaec9d

File tree

4 files changed

+40
-18
lines changed

4 files changed

+40
-18
lines changed

src/Picker.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -242,15 +242,12 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
242242
}
243243
};
244244

245-
const triggerOpen = (newOpen: boolean, preventChangeEvent: boolean = false) => {
245+
const triggerOpen = (newOpen: boolean) => {
246246
if (disabled && newOpen) {
247247
return;
248248
}
249249

250250
triggerInnerOpen(newOpen);
251-
if (!newOpen && !preventChangeEvent) {
252-
triggerChange(selectedValue);
253-
}
254251
};
255252

256253
const forwardKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {
@@ -285,6 +282,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
285282
const [inputProps, { focused, typing }] = usePickerInput({
286283
blurToCancel: needConfirmButton,
287284
open: mergedOpen,
285+
value: text,
288286
triggerOpen,
289287
forwardKeyDown,
290288
isClickOutside: target =>
@@ -295,12 +293,12 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
295293
}
296294

297295
triggerChange(selectedValue);
298-
triggerOpen(false, true);
296+
triggerOpen(false);
299297
resetText();
300298
return true;
301299
},
302300
onCancel: () => {
303-
triggerOpen(false, true);
301+
triggerOpen(false);
304302
setSelectedValue(mergedValue);
305303
resetText();
306304
},
@@ -400,7 +398,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
400398
e.preventDefault();
401399
e.stopPropagation();
402400
triggerChange(null);
403-
triggerOpen(false, true);
401+
triggerOpen(false);
404402
}}
405403
className={`${prefixCls}-clear`}
406404
>
@@ -422,7 +420,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
422420
if (type === 'submit' || (type !== 'key' && !needConfirmButton)) {
423421
// triggerChange will also update selected values
424422
triggerChange(date);
425-
triggerOpen(false, true);
423+
triggerOpen(false);
426424
}
427425
};
428426
const popupPlacement = direction === 'rtl' ? 'bottomRight' : 'bottomLeft';

src/RangePicker.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -541,11 +541,6 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
541541
},
542542
triggerOpen: (newOpen: boolean) => {
543543
triggerOpen(newOpen, index);
544-
545-
// Only blur will close open
546-
if (!newOpen && mergedOpen !== newOpen && mergedActivePickerIndex === index) {
547-
triggerChange(selectedValue, index);
548-
}
549544
},
550545
onSubmit: () => {
551546
triggerChange(selectedValue, index);
@@ -561,11 +556,13 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
561556
const [startInputProps, { focused: startFocused, typing: startTyping }] = usePickerInput({
562557
...getSharedInputHookProps(0, resetStartText),
563558
open: startOpen,
559+
value: startText,
564560
});
565561

566562
const [endInputProps, { focused: endFocused, typing: endTyping }] = usePickerInput({
567563
...getSharedInputHookProps(1, resetEndText),
568564
open: endOpen,
565+
value: endText,
569566
});
570567

571568
// ============================= Sync ==============================

src/hooks/usePickerInput.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import * as React from 'react';
2+
import { useState, useEffect, useRef } from 'react';
23
import KeyCode from 'rc-util/lib/KeyCode';
34
import { addGlobalMouseDownEvent } from '../utils/uiUtil';
45

56
export default function usePickerInput({
67
open,
8+
value,
79
isClickOutside,
810
triggerOpen,
911
forwardKeyDown,
@@ -14,6 +16,7 @@ export default function usePickerInput({
1416
onBlur,
1517
}: {
1618
open: boolean;
19+
value: string;
1720
isClickOutside: (clickElement: EventTarget | null) => boolean;
1821
triggerOpen: (open: boolean) => void;
1922
forwardKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;
@@ -23,14 +26,16 @@ export default function usePickerInput({
2326
onFocus?: React.FocusEventHandler<HTMLInputElement>;
2427
onBlur?: React.FocusEventHandler<HTMLInputElement>;
2528
}): [React.DOMAttributes<HTMLInputElement>, { focused: boolean; typing: boolean }] {
26-
const [typing, setTyping] = React.useState(false);
27-
const [focused, setFocused] = React.useState(false);
29+
const [typing, setTyping] = useState(false);
30+
const [focused, setFocused] = useState(false);
2831

2932
/**
3033
* We will prevent blur to handle open event when user click outside,
3134
* since this will repeat trigger `onOpenChange` event.
3235
*/
33-
const preventBlurRef = React.useRef<boolean>(false);
36+
const preventBlurRef = useRef<boolean>(false);
37+
38+
const valueChangedRef = useRef<boolean>(false);
3439

3540
const inputProps: React.DOMAttributes<HTMLInputElement> = {
3641
onMouseDown: () => {
@@ -99,8 +104,12 @@ export default function usePickerInput({
99104
onCancel();
100105
}
101106
}, 0);
102-
} else {
107+
} else if (open) {
103108
triggerOpen(false);
109+
110+
if (valueChangedRef.current) {
111+
onSubmit();
112+
}
104113
}
105114
setFocused(false);
106115

@@ -110,8 +119,17 @@ export default function usePickerInput({
110119
},
111120
};
112121

122+
// check if value changed
123+
useEffect(() => {
124+
valueChangedRef.current = false;
125+
}, [open]);
126+
127+
useEffect(() => {
128+
valueChangedRef.current = true;
129+
}, [value]);
130+
113131
// Global click handler
114-
React.useEffect(() =>
132+
useEffect(() =>
115133
addGlobalMouseDownEvent(({ target }: MouseEvent) => {
116134
if (open) {
117135
if (!isClickOutside(target)) {

tests/range.spec.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,5 +1289,14 @@ describe('Picker.Range', () => {
12891289
wrapper.closePicker(0);
12901290
expect(wrapper.isOpen()).toBeFalsy();
12911291
});
1292+
1293+
it('not change: start not to end', () => {
1294+
const wrapper = mount(
1295+
<MomentRangePicker defaultValue={[getMoment('1989-01-01'), getMoment('1990-01-01')]} />,
1296+
);
1297+
wrapper.openPicker(0);
1298+
wrapper.closePicker(0);
1299+
expect(wrapper.isOpen()).toBeFalsy();
1300+
});
12921301
});
12931302
});

0 commit comments

Comments
 (0)