Skip to content

Commit a3c1532

Browse files
authored
fix: DayJS loop trigger effect (#689)
* fix: DayJs not think invalid date is same * chore: clean up
1 parent f6c6803 commit a3c1532

File tree

3 files changed

+60
-28
lines changed

3 files changed

+60
-28
lines changed

src/RangePicker.tsx

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import classNames from 'classnames';
22
import useMergedState from 'rc-util/lib/hooks/useMergedState';
3+
import pickAttrs from 'rc-util/lib/pickAttrs';
34
import raf from 'rc-util/lib/raf';
45
import warning from 'rc-util/lib/warning';
5-
import pickAttrs from 'rc-util/lib/pickAttrs';
66
import * as React from 'react';
77
import { useEffect, useRef, useState } from 'react';
88
import type { PickerPanelProps } from '.';
@@ -43,12 +43,12 @@ import {
4343
isSameWeek,
4444
parseValue,
4545
} from './utils/dateUtil';
46+
import { getClearIcon } from './utils/getClearIcon';
4647
import getExtraFooter from './utils/getExtraFooter';
4748
import getRanges from './utils/getRanges';
4849
import { getValue, toArray, updateValues } from './utils/miscUtil';
4950
import { elementsContains, getDefaultFormat, getInputSize } from './utils/uiUtil';
5051
import { legacyPropsWarning } from './utils/warnUtil';
51-
import { getClearIcon } from './utils/getClearIcon';
5252

5353
function reorderValues<DateType>(
5454
values: RangeValue<DateType>,
@@ -407,7 +407,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
407407
function triggerChange(
408408
newValue: RangeValue<DateType>,
409409
sourceIndex: 0 | 1,
410-
triggerCalendarChangeOnly?: boolean,
410+
triggerCalendarChangeOnly?: boolean,
411411
) {
412412
let values = newValue;
413413
let startValue = getValue(values, 0);
@@ -576,7 +576,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
576576
if (delayOpen) {
577577
if (needConfirmButton) {
578578
// when in dateTime mode, switching between two date input fields will trigger onCalendarChange.
579-
// when onBlur is triggered, the input field has already switched,
579+
// when onBlur is triggered, the input field has already switched,
580580
// so it's necessary to obtain the value of the previous input field here.
581581
const needTriggerIndex = mergedActivePickerIndex ? 0 : 1;
582582
const selectedIndexValue = getValue(selectedValue, needTriggerIndex);
@@ -712,18 +712,18 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
712712
const startStr =
713713
mergedValue && mergedValue[0]
714714
? formatValue(mergedValue[0], {
715-
locale,
716-
format: 'YYYYMMDDHHmmss',
717-
generateConfig,
718-
})
715+
locale,
716+
format: 'YYYYMMDDHHmmss',
717+
generateConfig,
718+
})
719719
: '';
720720
const endStr =
721721
mergedValue && mergedValue[1]
722722
? formatValue(mergedValue[1], {
723-
locale,
724-
format: 'YYYYMMDDHHmmss',
725-
generateConfig,
726-
})
723+
locale,
724+
format: 'YYYYMMDDHHmmss',
725+
generateConfig,
726+
})
727727
: '';
728728

729729
useEffect(() => {
@@ -775,10 +775,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
775775
}
776776
warning(!dateRender, `'dateRender' is deprecated. Please use 'cellRender' instead.`);
777777
warning(!monthCellRender, `'monthCellRender' is deprecated. Please use 'cellRender' instead.`);
778-
warning(
779-
!clearIcon,
780-
'`clearIcon` will be removed in future. Please use `allowClear` instead.',
781-
);
778+
warning(!clearIcon, '`clearIcon` will be removed in future. Please use `allowClear` instead.');
782779
}
783780

784781
// ============================ Private ============================
@@ -886,7 +883,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
886883
defaultValue={
887884
mergedActivePickerIndex === 0 ? getValue(selectedValue, 1) : getValue(selectedValue, 0)
888885
}
889-
// defaultPickerValue={undefined}
886+
// defaultPickerValue={undefined}
890887
/>
891888
</RangeContext.Provider>
892889
);
@@ -1065,11 +1062,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
10651062
);
10661063
}
10671064

1068-
const mergedClearIcon: React.ReactNode = getClearIcon(
1069-
prefixCls,
1070-
allowClear,
1071-
clearIcon,
1072-
);
1065+
const mergedClearIcon: React.ReactNode = getClearIcon(prefixCls, allowClear, clearIcon);
10731066

10741067
const clearNode: React.ReactNode = (
10751068
<span
@@ -1099,10 +1092,10 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
10991092
</span>
11001093
);
11011094

1102-
const mergedAllowClear = allowClear && (
1103-
(getValue(mergedValue as RangeValue<DateType>, 0) && !mergedDisabled[0]) ||
1104-
(getValue(mergedValue as RangeValue<DateType>, 1) && !mergedDisabled[1])
1105-
);
1095+
const mergedAllowClear =
1096+
allowClear &&
1097+
((getValue(mergedValue as RangeValue<DateType>, 0) && !mergedDisabled[0]) ||
1098+
(getValue(mergedValue as RangeValue<DateType>, 1) && !mergedDisabled[1]));
11061099

11071100
const inputSharedProps = {
11081101
size: getInputSize(picker, formatList[0], generateConfig),

src/hooks/useValueTexts.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import useMemo from 'rc-util/lib/hooks/useMemo';
22
import shallowEqual from 'rc-util/lib/isEqual';
3+
import * as React from 'react';
34
import type { GenerateConfig } from '../generate';
45
import type { CustomFormat, Locale } from '../interface';
56
import { formatValue, isEqual } from '../utils/dateUtil';
@@ -13,8 +14,8 @@ export type ValueTextConfig<DateType> = {
1314
export default function useValueTexts<DateType>(
1415
value: DateType | null,
1516
{ formatList, generateConfig, locale }: ValueTextConfig<DateType>,
16-
) {
17-
return useMemo<[string[], string]>(
17+
): [valueTexts: string[], firstValueText: string] {
18+
const [texts, text] = useMemo<[string[], string]>(
1819
() => {
1920
if (!value) {
2021
return [[''], ''];
@@ -45,4 +46,6 @@ export default function useValueTexts<DateType>(
4546
// Not Same locale
4647
!shallowEqual(prev[2], next[2], true),
4748
);
49+
50+
return React.useMemo(() => [texts, text], [texts.join(''), text]);
4851
}

tests/loop.spec.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { render } from '@testing-library/react';
2+
import dayjs from 'dayjs';
3+
import { resetWarned } from 'rc-util/lib/warning';
4+
import React from 'react';
5+
import dayJsGenerate from '../src/generate/dayjs';
6+
import zhCN from '../src/locale/zh_CN';
7+
import RangePicker from '../src/RangePicker';
8+
import { getMoment } from './util/commonUtil';
9+
10+
describe('Picker.Loop', () => {
11+
let errorSpy;
12+
13+
beforeAll(() => {
14+
errorSpy = jest.spyOn(console, 'error').mockImplementation(() => null);
15+
});
16+
17+
beforeEach(() => {
18+
errorSpy.mockReset();
19+
resetWarned();
20+
global.scrollCalled = false;
21+
jest.useFakeTimers().setSystemTime(getMoment('1990-09-03 00:00:00').valueOf());
22+
});
23+
24+
afterEach(() => {
25+
jest.clearAllTimers();
26+
jest.useRealTimers();
27+
});
28+
29+
it('no loop warning', () => {
30+
render(
31+
<RangePicker locale={zhCN} generateConfig={dayJsGenerate} value={[dayjs(''), dayjs('')]} />,
32+
);
33+
34+
expect(errorSpy).not.toHaveBeenCalled();
35+
});
36+
});

0 commit comments

Comments
 (0)