Skip to content

Commit a6e0460

Browse files
committed
refactor: extract displayed to be a new hook
1 parent 1b59df8 commit a6e0460

4 files changed

Lines changed: 68 additions & 62 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import useCalendarComponent from '../../../lib';
22
import Calendar from '../Calendar';
33

44
export default function Single() {
5-
const calendarControl = useCalendarComponent({});
5+
const calendarControl = useCalendarComponent();
66
// const { selectedDate } = calendarControl;
77
// const { year, month, dayOfMonth } = selectedDate;
88

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

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,27 @@ import type {
44
UseCalendarOptions,
55
DateCellInfo,
66
SelectDate,
7-
ChangeDisplayedValue,
87
SelectDateOptions,
9-
ControlOptions,
8+
SelectType,
109
} from '../types';
1110
import { getNumberOfDays, isToday } from '../utils';
11+
import useDisplayedDate from './useDisplayedDate';
1212

1313
const CELLS_OF_PICKER = 42;
1414

15-
export default function useCalendarComponent<C extends ControlOptions>({
15+
export default function useCalendarComponent<S extends SelectType>({
1616
displayedDate = new Date(),
17-
}: UseCalendarOptions<C> = {}) {
18-
const [displayedYear, setDisplayedYear] = useState(
19-
displayedDate.getFullYear()
20-
);
21-
const [displayedMonth, setDisplayedMonth] = useState(
22-
displayedDate.getMonth()
23-
);
24-
17+
selectType,
18+
}: UseCalendarOptions<S> = {}) {
19+
console.log(selectType);
20+
const {
21+
displayedYear,
22+
displayedMonth,
23+
setDisplayedYear,
24+
setDisplayedMonth,
25+
changeDisplayedYear,
26+
changeDisplayedMonth,
27+
} = useDisplayedDate(displayedDate);
2528
const [selectedDate, setSelectedDate] = useState<Date[]>([]);
2629

2730
const getDateCellInfo = (cellIndex: number): DateCellInfo => {
@@ -85,34 +88,6 @@ export default function useCalendarComponent<C extends ControlOptions>({
8588
return arr;
8689
};
8790

88-
const changeDisplayedYear: ChangeDisplayedValue = (value, options = {}) => {
89-
const { override = false } = options;
90-
if (override) {
91-
setDisplayedYear(value);
92-
return;
93-
}
94-
95-
if (displayedYear + value >= 0) setDisplayedYear(displayedYear + value);
96-
else setDisplayedYear(0);
97-
};
98-
99-
const changeDisplayedMonth: ChangeDisplayedValue = (value, options = {}) => {
100-
const { override = false } = options;
101-
if (override) {
102-
setDisplayedMonth(value);
103-
return;
104-
}
105-
106-
const nextMonth = displayedMonth + value;
107-
if (nextMonth < 0) {
108-
setDisplayedMonth(11);
109-
changeDisplayedYear(-1);
110-
} else if (nextMonth > 11) {
111-
setDisplayedMonth(0);
112-
changeDisplayedYear(1);
113-
} else setDisplayedMonth(nextMonth);
114-
};
115-
11691
const selectDate: SelectDate = (
11792
{ year, month, dayOfMonth },
11893
options = {}
@@ -131,6 +106,5 @@ export default function useCalendarComponent<C extends ControlOptions>({
131106
changeDisplayedYear,
132107
changeDisplayedMonth,
133108
getDateCellInfos,
134-
selectDate,
135109
};
136110
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { useState } from 'react';
2+
3+
import type { ChangeDisplayedValue } from '../types';
4+
5+
export default function useDisplayedDate(date: Date) {
6+
const [displayedYear, setDisplayedYear] = useState(date.getFullYear());
7+
const [displayedMonth, setDisplayedMonth] = useState(date.getMonth());
8+
9+
const changeDisplayedYear: ChangeDisplayedValue = (value, options = {}) => {
10+
const { override = false } = options;
11+
if (override) {
12+
setDisplayedYear(value);
13+
return;
14+
}
15+
16+
if (displayedYear + value >= 0) setDisplayedYear(displayedYear + value);
17+
else setDisplayedYear(0);
18+
};
19+
20+
const changeDisplayedMonth: ChangeDisplayedValue = (value, options = {}) => {
21+
const { override = false } = options;
22+
if (override) {
23+
setDisplayedMonth(value);
24+
return;
25+
}
26+
27+
const nextMonth = displayedMonth + value;
28+
if (nextMonth < 0) {
29+
setDisplayedMonth(11);
30+
changeDisplayedYear(-1);
31+
} else if (nextMonth > 11) {
32+
setDisplayedMonth(0);
33+
changeDisplayedYear(1);
34+
} else setDisplayedMonth(nextMonth);
35+
};
36+
37+
return {
38+
displayedYear,
39+
displayedMonth,
40+
setDisplayedYear,
41+
setDisplayedMonth,
42+
changeDisplayedYear,
43+
changeDisplayedMonth,
44+
};
45+
}

packages/react-use-calendar-component/src/lib/types.ts

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,16 @@
11
// useCalendarComponent
2-
export interface SingleOptions {
3-
defaultSelectedDate?: Date;
4-
type: 'single';
5-
}
6-
7-
export interface MultipleOptions {
8-
defaultSelectedDate?: Date[];
9-
type: 'multiple';
10-
}
11-
12-
export interface RangeOptions {
13-
defaultRange?: [Date, Date];
14-
type: 'range';
15-
}
2+
export type SelectType = 'single' | 'multiple';
163

17-
export type ControlOptions = SingleOptions | MultipleOptions;
18-
export type SelectedDate<C extends ControlOptions> = C extends SingleOptions
19-
? SingleOptions['defaultSelectedDate']
20-
: C extends MultipleOptions
21-
? MultipleOptions['defaultSelectedDate']
4+
export type DefaultValue<S extends SelectType> = S extends 'single'
5+
? Date
6+
: S extends 'multiple'
7+
? Date[]
228
: never;
239

24-
export type UseCalendarOptions<C extends ControlOptions> = {
10+
export type UseCalendarOptions<S extends SelectType = 'single'> = {
2511
displayedDate?: Date;
26-
controlOptions?: C;
12+
selectType?: S;
13+
defaultValue?: DefaultValue<S>;
2714
};
2815

2916
export interface DateCellInfo {

0 commit comments

Comments
 (0)