-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathCalendarStyled.component.tsx
More file actions
126 lines (111 loc) · 3.57 KB
/
CalendarStyled.component.tsx
File metadata and controls
126 lines (111 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import * as React from "react";
import { VisuallyHidden } from "ariakit";
import { createCalendar, getWeeksInMonth } from "@internationalized/date";
import { useLocale } from "@react-aria/i18n";
import {
Calendar,
CalendarBaseStateProps,
CalendarCell,
CalendarCellButton,
CalendarCellStateProps,
CalendarGrid,
CalendarGridStateProps,
CalendarNextButton,
CalendarPreviousButton,
CalendarTitle,
useCalendarBaseState,
useCalendarCellState,
useCalendarGridState,
useCalendarState,
} from "../../index";
import { ChevronLeft, ChevronRight } from "./Utils.component";
import "./CalendarStyled.css";
export type CalendarStyledProps = Omit<
CalendarBaseStateProps,
"locale" | "createCalendar"
> & {};
export const CalendarStyled: React.FC<CalendarStyledProps> = props => {
let { locale } = useLocale();
const state = useCalendarBaseState({ locale, createCalendar, ...props });
const calendar = useCalendarState({ ...props, state });
return (
<Calendar state={calendar} className="calendar">
<div className="calendar--wrapper">
<CalendarPreviousButton state={calendar} className="calendar__button">
<ChevronLeft className="calendar__button_chevron" />
</CalendarPreviousButton>
<CalendarTitle state={calendar} className="calendar__title" />
<CalendarNextButton state={calendar} className="calendar__button">
<ChevronRight className="calendar__button_chevron" />
</CalendarNextButton>
</div>
<CalendarGridComp state={state} />
</Calendar>
);
};
export default CalendarStyled;
export type CalendarGridProps = CalendarGridStateProps & {};
const CalendarGridComp = (props: CalendarGridProps) => {
const { state: baseState } = props;
let { locale } = useLocale();
let gridState = useCalendarGridState(props);
// Get the number of weeks in the month so we can render the proper number of rows.
let weeksInMonth = getWeeksInMonth(baseState.visibleRange.start, locale);
return (
<CalendarGrid state={gridState} className="dates">
<thead>
<tr>
{gridState.weekDays.map((day, index) => {
return (
<th key={index}>
{/* Make sure screen readers read the full day name,
but we show an abbreviation visually. */}
<VisuallyHidden>{day}</VisuallyHidden>
<span aria-hidden="true">{day}</span>
</th>
);
})}
</tr>
</thead>
<tbody>
{[...new Array(weeksInMonth).keys()].map(weekIndex => (
<tr key={weekIndex}>
{baseState
.getDatesInWeek(weekIndex)
.map((date, i) =>
date ? (
<CalendarCellComp key={i} state={baseState} date={date} />
) : (
<td key={i} />
),
)}
</tr>
))}
</tbody>
</CalendarGrid>
);
};
export type CalendarCellProps = CalendarCellStateProps & {};
const CalendarCellComp = (props: CalendarCellProps) => {
const cellState = useCalendarCellState(props);
const {
isOutsideVisibleRange,
isDisabled,
isSelected,
isUnavailable,
formattedDate,
} = cellState;
return (
<CalendarCell state={cellState}>
<CalendarCellButton
state={cellState}
hidden={isOutsideVisibleRange}
className={`cell ${isSelected ? "selected" : ""} ${
isDisabled ? "disabled" : ""
} ${isUnavailable ? "unavailable" : ""}`}
>
{formattedDate}
</CalendarCellButton>
</CalendarCell>
);
};