Skip to content

Commit af03f60

Browse files
authored
fix: picker offset check (#549)
* fix: equals check * test: update test case * fix: dead loop in some case * chore: simplify
1 parent 1519ff4 commit af03f60

File tree

5 files changed

+38
-49
lines changed

5 files changed

+38
-49
lines changed

src/Picker.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
271271
return;
272272
}
273273

274+
console.trace('New Open:', newOpen)
274275
triggerInnerOpen(newOpen);
275276
};
276277

src/RangePicker.tsx

Lines changed: 28 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,48 @@
1-
import * as React from 'react';
2-
import { useRef, useEffect, useState } from 'react';
31
import classNames from 'classnames';
4-
import warning from 'rc-util/lib/warning';
52
import useMergedState from 'rc-util/lib/hooks/useMergedState';
3+
import warning from 'rc-util/lib/warning';
4+
import * as React from 'react';
5+
import { useEffect, useRef, useState } from 'react';
6+
import type { PickerPanelProps } from '.';
7+
import type { GenerateConfig } from './generate';
8+
import useHoverValue from './hooks/useHoverValue';
9+
import usePickerInput from './hooks/usePickerInput';
10+
import usePresets from './hooks/usePresets';
11+
import useRangeDisabled from './hooks/useRangeDisabled';
12+
import useRangeViewDates from './hooks/useRangeViewDates';
13+
import useTextValueMapping from './hooks/useTextValueMapping';
14+
import useValueTexts from './hooks/useValueTexts';
615
import type {
716
DisabledTimes,
17+
EventValue,
818
PanelMode,
919
PickerMode,
10-
RangeValue,
11-
EventValue,
1220
PresetDate,
21+
RangeValue,
1322
} from './interface';
14-
import type { PickerBaseProps, PickerDateProps, PickerTimeProps, PickerRefConfig } from './Picker';
15-
import type { SharedTimeProps } from './panels/TimePanel';
16-
import PickerTrigger from './PickerTrigger';
17-
import PickerPanel from './PickerPanel';
18-
import usePickerInput from './hooks/usePickerInput';
19-
import getDataOrAriaProps, { toArray, getValue, updateValues } from './utils/miscUtil';
20-
import { getDefaultFormat, getInputSize, elementsContains } from './utils/uiUtil';
2123
import type { ContextOperationRefProps } from './PanelContext';
2224
import PanelContext from './PanelContext';
25+
import type { DateRender } from './panels/DatePanel/DateBody';
26+
import type { SharedTimeProps } from './panels/TimePanel';
27+
import type { PickerBaseProps, PickerDateProps, PickerRefConfig, PickerTimeProps } from './Picker';
28+
import PickerPanel from './PickerPanel';
29+
import PickerTrigger from './PickerTrigger';
30+
import PresetPanel from './PresetPanel';
31+
import RangeContext from './RangeContext';
2332
import {
24-
isEqual,
33+
formatValue,
2534
getClosingViewDate,
35+
isEqual,
2636
isSameDate,
27-
isSameWeek,
2837
isSameQuarter,
29-
formatValue,
38+
isSameWeek,
3039
parseValue,
3140
} from './utils/dateUtil';
32-
import useValueTexts from './hooks/useValueTexts';
33-
import useTextValueMapping from './hooks/useTextValueMapping';
34-
import type { GenerateConfig } from './generate';
35-
import type { PickerPanelProps } from '.';
36-
import RangeContext from './RangeContext';
37-
import useRangeDisabled from './hooks/useRangeDisabled';
3841
import getExtraFooter from './utils/getExtraFooter';
3942
import getRanges from './utils/getRanges';
40-
import useRangeViewDates from './hooks/useRangeViewDates';
41-
import type { DateRender } from './panels/DatePanel/DateBody';
42-
import useHoverValue from './hooks/useHoverValue';
43+
import getDataOrAriaProps, { getValue, toArray, updateValues } from './utils/miscUtil';
44+
import { elementsContains, getDefaultFormat, getInputSize } from './utils/uiUtil';
4345
import { legacyPropsWarning } from './utils/warnUtil';
44-
import usePresets from './hooks/usePresets';
45-
import PresetPanel from './PresetPanel';
4646

4747
function reorderValues<DateType>(
4848
values: RangeValue<DateType>,
@@ -779,22 +779,6 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
779779
// ============================ Ranges =============================
780780
const presetList = usePresets(presets, ranges);
781781

782-
// const rangeList = presetList.map((preset) => {
783-
// return {
784-
// label: preset.label,
785-
// onClick: () => {
786-
// triggerChange(preset.value, null);
787-
// triggerOpen(false, mergedActivePickerIndex);
788-
// },
789-
// onMouseEnter: () => {
790-
// setRangeHoverValue(preset.value);
791-
// },
792-
// onMouseLeave: () => {
793-
// setRangeHoverValue(null);
794-
// },
795-
// };
796-
// });
797-
798782
// ============================= Panel =============================
799783
function renderPanel(
800784
panelPosition: 'left' | 'right' | false = false,
@@ -911,8 +895,8 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
911895
: arrowRef.current.offsetLeft;
912896

913897
if (
914-
panelDivRef.current.offsetWidth &&
915-
arrowRef.current.offsetWidth &&
898+
panelDivRef.current.offsetWidth !== undefined &&
899+
arrowRef.current.offsetWidth !== undefined &&
916900
arrowLeft >
917901
panelDivRef.current.offsetWidth -
918902
arrowRef.current.offsetWidth -

src/hooks/useValueTexts.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import shallowEqual from 'shallowequal';
21
import useMemo from 'rc-util/lib/hooks/useMemo';
2+
import shallowEqual from 'shallowequal';
33
import type { GenerateConfig } from '../generate';
44
import type { CustomFormat, Locale } from '../interface';
5-
import { formatValue } from '../utils/dateUtil';
5+
import { formatValue, isEqual } from '../utils/dateUtil';
66

77
export type ValueTextConfig<DateType> = {
88
formatList: (string | CustomFormat<DateType>)[];
@@ -37,6 +37,10 @@ export default function useValueTexts<DateType>(
3737
return [fullValueTexts, firstValueText];
3838
},
3939
[value, formatList],
40-
(prev, next) => prev[0] !== next[0] || !shallowEqual(prev[1], next[1]),
40+
(prev, next) =>
41+
// Not Same Date
42+
!isEqual(generateConfig, prev[0], next[0]) ||
43+
// Not Same format
44+
!shallowEqual(prev[1], next[1]),
4145
);
4246
}

tests/picker.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ describe('Picker.Basic', () => {
148148
act(() => {
149149
fireEvent.mouseDown(document.body);
150150
});
151-
expect(onOpenChange).toHaveBeenCalledTimes(1);
151+
expect(onOpenChange).toHaveBeenCalledTimes(i + 1);
152152
}
153153
act(() => {
154154
jest.runAllTimers();

tests/range.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ describe('Picker.Range', () => {
749749
act(() => {
750750
fireEvent.mouseDown(document.body);
751751
});
752-
expect(onOpenChange).toHaveBeenCalledTimes(1);
752+
expect(onOpenChange).toHaveBeenCalledTimes(i + 1);
753753
}
754754
act(() => {
755755
jest.runAllTimers();

0 commit comments

Comments
 (0)