Skip to content

Commit 4ae1163

Browse files
committed
fix: Blur should reset text input
1 parent 1f1121c commit 4ae1163

File tree

4 files changed

+57
-30
lines changed

4 files changed

+57
-30
lines changed

src/Picker.tsx

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,27 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
201201
},
202202
});
203203

204+
// ============================= Text ==============================
205+
const valueTexts = useValueTexts(selectedValue, {
206+
formatList,
207+
generateConfig,
208+
locale,
209+
});
210+
211+
const [text, triggerTextChange, resetText] = useTextValueMapping({
212+
valueTexts,
213+
onTextChange: newText => {
214+
const inputDate = generateConfig.locale.parse(
215+
locale.locale,
216+
newText,
217+
formatList,
218+
);
219+
if (inputDate && (!disabledDate || !disabledDate(inputDate))) {
220+
setSelectedValue(inputDate);
221+
}
222+
},
223+
});
224+
204225
// ============================ Trigger ============================
205226
const triggerChange = (newValue: DateType | null) => {
206227
setSelectedValue(newValue);
@@ -243,27 +264,6 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
243264
}
244265
};
245266

246-
// ============================= Text ==============================
247-
const valueTexts = useValueTexts(selectedValue, {
248-
formatList,
249-
generateConfig,
250-
locale,
251-
});
252-
253-
const [text, triggerTextChange, resetText] = useTextValueMapping({
254-
valueTexts,
255-
onTextChange: newText => {
256-
const inputDate = generateConfig.locale.parse(
257-
locale.locale,
258-
newText,
259-
formatList,
260-
);
261-
if (inputDate && (!disabledDate || !disabledDate(inputDate))) {
262-
setSelectedValue(inputDate);
263-
}
264-
},
265-
});
266-
267267
// ============================= Input =============================
268268
const [inputProps, { focused, typing }] = usePickerInput({
269269
open: mergedOpen,
@@ -296,8 +296,12 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
296296
React.useEffect(() => {
297297
if (!mergedOpen) {
298298
setSelectedValue(mergedValue);
299+
300+
if (!valueTexts.length || valueTexts[0] === '') {
301+
triggerTextChange('');
302+
}
299303
}
300-
}, [mergedOpen]);
304+
}, [mergedOpen, valueTexts]);
301305

302306
// Sync innerValue with control mode
303307
React.useEffect(() => {
@@ -406,7 +410,9 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
406410
disabled={disabled}
407411
readOnly={inputReadOnly || !typing}
408412
value={text}
409-
onChange={triggerTextChange}
413+
onChange={e => {
414+
triggerTextChange(e.target.value);
415+
}}
410416
autoFocus={autoFocus}
411417
placeholder={placeholder}
412418
ref={inputRef}

src/RangePicker.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -616,8 +616,15 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
616616
React.useEffect(() => {
617617
if (!mergedOpen) {
618618
setSelectedValue(mergedValue);
619+
620+
if (!startValueTexts.length || startValueTexts[0] === '') {
621+
triggerStartTextChange('');
622+
}
623+
if (!endValueTexts.length || endValueTexts[0] === '') {
624+
triggerEndTextChange('');
625+
}
619626
}
620-
}, [mergedOpen]);
627+
}, [mergedOpen, startValueTexts, endValueTexts]);
621628

622629
// Sync innerValue with control mode
623630
React.useEffect(() => {
@@ -978,7 +985,9 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
978985
disabled={mergedDisabled[0]}
979986
readOnly={inputReadOnly || !startTyping}
980987
value={startText}
981-
onChange={triggerStartTextChange}
988+
onChange={e => {
989+
triggerStartTextChange(e.target.value);
990+
}}
982991
autoFocus={autoFocus}
983992
placeholder={getValue(placeholder, 0) || ''}
984993
ref={startInputRef}
@@ -999,7 +1008,9 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
9991008
disabled={mergedDisabled[1]}
10001009
readOnly={inputReadOnly || !endTyping}
10011010
value={endText}
1002-
onChange={triggerEndTextChange}
1011+
onChange={e => {
1012+
triggerEndTextChange(e.target.value);
1013+
}}
10031014
placeholder={getValue(placeholder, 1) || ''}
10041015
ref={endInputRef}
10051016
{...endInputProps}

src/hooks/useTextValueMapping.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@ export default function useTextValueMapping<ValueType>({
77
/** Must useMemo, to assume that `valueTexts` only match on the first change */
88
valueTexts: string[];
99
onTextChange: (text: string) => void;
10-
}): [string, React.ChangeEventHandler<HTMLInputElement>, () => void] {
10+
}): [string, (text: string) => void, () => void] {
1111
const [text, setInnerText] = React.useState('');
1212

13-
function triggerTextChange({
14-
target: { value },
15-
}: React.ChangeEvent<HTMLInputElement>) {
13+
function triggerTextChange(value: string) {
1614
setInnerText(value);
1715
onTextChange(value);
1816
}

tests/picker.spec.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,4 +503,16 @@ describe('Picker.Basic', () => {
503503

504504
expect(wrapper.find('input').props().name).toEqual('bamboo');
505505
});
506+
507+
it('blur should reset invalidate text', () => {
508+
const wrapper = mount(<MomentPicker />);
509+
wrapper.openPicker();
510+
wrapper.find('input').simulate('change', {
511+
target: {
512+
value: 'Invalidate',
513+
},
514+
});
515+
wrapper.closePicker();
516+
expect(wrapper.find('input').props().value).toEqual('');
517+
});
506518
});

0 commit comments

Comments
 (0)