Skip to content

Commit cc466e6

Browse files
authored
fix: scroll loop in 19 (#903)
1 parent f3694a6 commit cc466e6

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

src/PickerPanel/TimePanel/TimePanelBody/TimeColumn.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ export interface TimeUnitColumnProps {
2323
changeOnScroll?: boolean;
2424
}
2525

26+
// Not use JSON.stringify to avoid dead loop
27+
function flattenUnits(units: Unit<string | number>[]) {
28+
return units.map(({ value, label, disabled }) => [value, label, disabled].join(',')).join(';');
29+
}
30+
2631
export default function TimeColumn<DateType extends object>(props: TimeUnitColumnProps) {
2732
const { units, value, optionalValue, type, onChange, onHover, onDblClick, changeOnScroll } =
2833
props;
@@ -54,7 +59,7 @@ export default function TimeColumn<DateType extends object>(props: TimeUnitColum
5459
stopScroll();
5560
clearDelayCheck();
5661
};
57-
}, [value, optionalValue, units.join(',')]);
62+
}, [value, optionalValue, flattenUnits(units)]);
5863

5964
// ========================= Change =========================
6065
// Scroll event if sync onScroll

tests/picker.spec.tsx

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,21 +1082,25 @@ describe('Picker.Basic', () => {
10821082
});
10831083

10841084
it('not repeat scroll if disabledTime return same value', () => {
1085-
const getDisabledTimeFn = () => () => ({
1086-
disabledHours: () => [10],
1087-
disabledMinutes: () => [10],
1088-
disabledSeconds: () => [10],
1089-
});
1085+
const getDisabledTimeFn =
1086+
(num = 10) =>
1087+
() => ({
1088+
disabledHours: () => [num],
1089+
disabledMinutes: () => [num],
1090+
disabledSeconds: () => [num],
1091+
});
10901092

1091-
const { rerender } = render(
1093+
const renderDemo = (disabledTime: any) => (
10921094
<DayPicker
10931095
picker="time"
10941096
defaultValue={getDay('2020-07-22 09:03:28')}
10951097
open
1096-
disabledTime={getDisabledTimeFn()}
1097-
/>,
1098+
disabledTime={disabledTime}
1099+
/>
10981100
);
10991101

1102+
const { rerender } = render(renderDemo(getDisabledTimeFn()));
1103+
11001104
act(() => {
11011105
jest.advanceTimersByTime(1000);
11021106
jest.clearAllTimers();
@@ -1105,20 +1109,23 @@ describe('Picker.Basic', () => {
11051109

11061110
// New disabledTime
11071111
triggered = false;
1108-
rerender(
1109-
<DayPicker
1110-
picker="time"
1111-
defaultValue={getDay('2020-07-22 09:03:28')}
1112-
open
1113-
disabledTime={getDisabledTimeFn()}
1114-
/>,
1115-
);
1112+
renderDemo(getDisabledTimeFn());
11161113

11171114
act(() => {
11181115
jest.advanceTimersByTime(1000);
11191116
jest.clearAllTimers();
11201117
});
11211118
expect(triggered).toBeFalsy();
1119+
1120+
// New disabledTime but different disabled value
1121+
triggered = false;
1122+
rerender(renderDemo(getDisabledTimeFn(11)));
1123+
1124+
act(() => {
1125+
jest.advanceTimersByTime(1000);
1126+
jest.clearAllTimers();
1127+
});
1128+
expect(triggered).toBeTruthy();
11221129
});
11231130
});
11241131

0 commit comments

Comments
 (0)