A set of React hooks to create an awesome datepicker.
export const DatePicker: FC = () => {
// prepare state to handle selected date
const [selectedDate, setSelectedDate] = useState<OnDateChangeType>(null);
const {
activeMonths,
firstDayOfWeek,
} = useDatePicker({
selectedDate,
minBookingDate: new Date(),
onDateChange: setSelectedDate,
});
// you can use DatePickerContext that helps you avoid passing callbacks throught components
return (
<DatePickerContext.Provider value={{ addPropsHere }}>
{activeMonths.map(month => (
<DateRangePickerMonth
firstDayOfWeek={firstDayOfWeek}
key={`${month.year}-${month.month}`}
month={month.month}
year={month.year}
/>
))}
</DatePickerContext.Provider>
);
};
export const DateRangePickerMonth: FC<UseMonthProps> = ({
firstDayOfWeek,
month,
year,
}) => {
const { days, monthLabel } = useMonth({
year,
month,
firstDayOfWeek,
});
return (
<div>
<p>{monthLabel}</p>
<div style={{ display: "grid" }}>
{days.map((day, index) => {
return <DateRangePickerDay date={day.date} key={day.dayLabel + index} day={day.dayLabel} />;
})}
</div>
</div>
);
};
export const DateRangePickerDay: FC<{ day: string; date: Date }> = ({ day, date }) => {
const dayRef = useRef(null);
const {
focusedDate,
isDateFocused,
isDateSelected,
isDateHovered,
isDateBlocked,
onDateSelect,
onDateFocus,
onDateHover,
} = useContext(DatePickerContext);
const { disabledDate, isSelected, isWithinHoverRange, onClick, isToday } =
useDay<HTMLDivElement>({
date,
dayRef,
focusedDate,
isDateFocused,
isDateSelected,
isDateHovered,
isDateBlocked,
onDateFocus,
onDateSelect,
onDateHover,
});
if (!day) {
return <div />;
}
return (
<button
type="button"
ref={dayRef}
onClick={onClick}
className= {clsx({
"day__disabled": disabledDate,
"day__selected": isSelected,
"day__today": isToday,
})}
>
{day}
</button>
);
};
UseDatePickerProps
| name | type | required | default | description |
|---|---|---|---|---|
| firstDayOfWeek | FirstDayOfWeek |
0 |
||
| initialVisibleMonth | Date |
|||
| isDateBlocked | (date: Date) => boolean |
() => false |
||
| maxBookingDate | Date |
|||
| minBookingDate | Date |
|||
| numberOfMonths | number |
1 |
||
| onDateChange | (data: OnDateChangeType): void |
yes | ||
| selectedDate | Date | null |
yes | ||
| unavailableDates | Date[] |
[] |
@deprecated | |
| datesConfig | DatesConfig[] |
[] |
UseDatePickerReturnType
| name | type | description |
|---|---|---|
| canGoToMonth | (month: Date) => boolean |
|
| canGoToNextMonth | boolean |
|
| canGoToNextYear | boolean |
|
| canGoToPrevMonth | boolean |
|
| canGoToPrevYear | boolean |
|
| canGoToYear | (month: Date) => boolean |
|
| goToDate | (date: Date) => void |
|
| goToNextMonths | () => void |
|
| goToNextMonthsByOneMonth | () => void |
|
| goToNextYear | () => void |
|
| goToPrevMonths | () => void |
|
| goToPrevMonthsByOneMonth | () => void |
|
| goToPrevYear | () => void |
|
| activeMonths | MonthType[] |
|
| firstDayOfWeek | FirstDayOfWeek |
|
| focusedDate | Date | null |
|
| hoveredDate | Date | null |
|
| isDateBlocked | (date: Date) => boolean |
|
| isDateFocused | (date: Date) => boolean |
|
| isDateHovered | (date: Date) => boolean |
|
| isDateSelected | (date: Date) => boolean |
|
| numberOfMonths | number |
|
| onDateFocus | (date: Date) => void |
|
| onDateHover | (date: Date | null) => void |
|
| onDateSelect | (date: Date) => void |
|
| onResetDates | () => void |
UseDateRangePickerProps
| name | type | required | default | description |
|---|---|---|---|---|
| changeActiveMonthOnSelect | boolean |
false |
||
| endDate | Date | null |
yes | ||
| exactMinBookingDays | boolean |
false |
||
| firstDayOfWeek | FirstDayOfWeek |
0 |
||
| focusedInput | FocusedInput |
yes | startDate |
|
| initialVisibleMonth | Date |
|||
| isDateBlocked | (date: Date) => boolean |
() => false |
||
| maxBookingDate | Date |
|||
| minBookingDate | Date |
|||
| minBookingDates | number |
1 |
||
| numberOfMonths | number |
2 |
||
| onDatesChange | (data: OnDatesChangeType): void |
yes | ||
| startDate | Date | null |
yes | ||
| unavailableDates | Date[] |
[] |
@deprecated | |
| datesConfig | DatesConfig[] |
[] |
UseDateRangePickerReturnType
| name | type | description |
|---|---|---|
| canGoToMonth | (month: Date) => boolean |
|
| canGoToNextMonth | boolean |
|
| canGoToNextYear | boolean |
|
| canGoToPrevMonth | boolean |
|
| canGoToPrevYear | boolean |
|
| canGoToYear | (month: Date) => boolean |
|
| goToDate | (date: Date) => void |
|
| goToNextMonths | () => void |
|
| goToNextMonthsByOneMonth | () => void |
|
| goToNextYear | () => void |
|
| goToPrevMonths | () => void |
|
| goToPrevMonthsByOneMonth | () => void |
|
| goToPrevYear | () => void |
|
| activeMonths | MonthType[] |
|
| firstDayOfWeek | FirstDayOfWeek |
|
| focusedDate | Date | null |
|
| hoveredDate | Date | null |
|
| isDateBlocked | (date: Date) => boolean |
|
| isDateFocused | (date: Date) => boolean |
|
| isDateHovered | (date: Date) => boolean |
|
| isDateSelected | (date: Date) => boolean |
|
| isEndDate | (date: Date) => boolean |
|
| isStartDate | (date: Date) => boolean |
|
| numberOfMonths | number |
|
| onDateFocus | (date: Date) => void |
|
| onDateHover | (date: Date | null) => void |
|
| onDateSelect | (date: Date) => void |
|
| onResetDates | () => void |
UseDecadeProps
| name | type | required | default | description |
|---|---|---|---|---|
| decadeLabelFormat | (start: Date, end: Date) => string |
|||
| year | number |
yes | ||
| yearLabelFormat | 'date: Date) => string |
UseDecadeReturnType
| name | type | description |
|---|---|---|
| years | { yearLabel : string; date: Date }[] |
|
| decadeLabel | string |
UseYearProps
| name | type | required | default | description |
|---|---|---|---|---|
| year | number |
yes | ||
| yearLabelFormat | (date: Date) => string |
|||
| monthLabelFormat | (date: Date) => string |
UseYearReturnType
| name | type | description |
|---|---|---|
| months | { monthLabel : string; date: Date }[] |
|
| yearLabel | string |
UseMonthProps
| name | type | required | default | description |
|---|---|---|---|---|
| year | number |
yes | ||
| month | number |
yes | ||
| firstDayOfWeek | FirstDayOfWeek |
0 |
||
| dayLabelFormat | (date: Date) => string |
|||
| weekdayLabelFormat | (date: Date) => string |
|||
| monthLabelFormat | (date: Date) => string |
UseMonthReturnType
| name | type | description |
|---|---|---|
| days | {currentMonth: boolean; dayLabel: string; date: Date })[] |
|
| monthLabel | string |
|
| weekdayLabels | string[] |
UseDayProps
| name | type | required | default | description |
|---|---|---|---|---|
| date | Date |
yes | ||
| dayRef | RefObject |
|||
| focusedDate | Date | null |
yes | ||
| isDateBlocked | (date: Date) => boolean |
yes | ||
| isDateFocused | (date: Date) => boolean |
yes | ||
| isDateHovered | (date: Date) => boolean |
yes | ||
| isDateSelected | (date: Date) => boolean |
yes | ||
| onDateFocus | (date: Date) => void |
yes | ||
| onDateHover | (date: Date) => void |
yes | ||
| onDateSelect | (date: Date) => void |
yes | ||
| unavailableDates | Date[] |
@deprecated | ||
| datesConfig | DatesConfig[] |
UseDayReturnType
| name | type | description |
|---|---|---|
| disabledDate | boolean |
|
| isFirstDisabled | boolean |
|
| isLastDisabled | boolean |
|
| disabledDate | boolean |
|
| isHovered | boolean |
|
| isSelected | boolean |
|
| isToday | boolean |
|
| isWithinHoverRange | boolean |
|
| onClick | () => void |
|
| onKeyDown | (e: KeyboardEvent) => void |
|
| onMouseEnter | () => void |
|
| tabIndex | number |
|
| flags | Flag[] |