Skip to content

Commit 8f299b6

Browse files
authored
Merge pull request #24 from jason89521/fix/calendar
2 parents c2847e2 + 990eb2d commit 8f299b6

3 files changed

Lines changed: 31 additions & 4 deletions

File tree

packages/react-use-calendar-component/src/app/components/Examples/Single.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ import Calendar from '../Calendar';
55
import StateInfo from '../StateInfo';
66

77
export function Single() {
8-
const [value, setValue] = useState(new Date());
8+
const [value, setValue] = useState<Date | undefined>(new Date());
99
const calendarControl = useCalendarComponent({ value, onChange: setValue });
1010

1111
return (
1212
<div>
1313
<Calendar calendarControl={calendarControl} />
14-
<StateInfo value={[value]} />
14+
<StateInfo value={value ? [value] : []} />
15+
<button onClick={() => setValue(undefined)}>clear</button>
1516
</div>
1617
);
1718
}

packages/react-use-calendar-component/src/lib/hooks/useCalendarComponent.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from 'react';
1+
import { useEffect, useRef, useState } from 'react';
22

33
import { CALENDAR_CELLS_NUM } from '../constant';
44
import type {
@@ -34,12 +34,20 @@ export default function useCalendarComponent<S extends SelectType = 'single'>({
3434
} = useDisplayedDate(initialDisplayedDate);
3535
const [internalValue, setInternalValue] = useState(userValue);
3636
const selectedDates = normalizeValue(selectType, userValue || internalValue);
37+
const isControlledRef = useRef(false);
3738

3839
const handleValueChange = (value: Value<S>) => {
3940
onChange(value);
40-
setInternalValue(value);
41+
if (!isControlledRef.current) setInternalValue(value);
4142
};
4243

44+
useEffect(() => {
45+
if (!isControlledRef.current && typeof userValue !== 'undefined') {
46+
setInternalValue(undefined);
47+
isControlledRef.current = true;
48+
}
49+
}, [userValue]);
50+
4351
const getDateCellInfo = (
4452
year: number,
4553
month: number,

packages/react-use-calendar-component/src/test/useCalendarComponent.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,22 @@ describe('useCalendarComponent', () => {
131131
expect(isExcluded).toBe(true);
132132
});
133133
});
134+
135+
it('should not set internalValue if it is controlled by user', () => {
136+
const { result } = renderHook(() => {
137+
const [value, setValue] = useState<Date | undefined>(now);
138+
return {
139+
...useCalendarComponent({ value, onChange: setValue }),
140+
value,
141+
setValue,
142+
};
143+
});
144+
act(() => {
145+
result.current.setValue(undefined);
146+
});
147+
const noSelectedDates = result.current
148+
.getDateCellInfos()
149+
.every(info => !info.isSelected);
150+
expect(noSelectedDates).toBe(true);
151+
});
134152
});

0 commit comments

Comments
 (0)