UNPKG

2.36 kBTypeScriptView Raw
1import React, { useMemo } from 'react';
2import dayjs from 'dayjs';
3import utc from 'dayjs/plugin/utc';
4
5import BaseCalendarWrappedInProviders from './Providers';
6import type { DateProperties, WrapperCalendarProps } from '../Entities';
7
8dayjs.extend(utc);
9
10interface SpecificProps {
11 onSelectDate: (date: string) => void;
12 selectedDate: string;
13}
14
15type Props = SpecificProps & WrapperCalendarProps;
16
17// A thin wrapper to limit the props that can be passed to the BaseCalendar component
18const DateSelectionCalendar: React.FC<Props> = ({
19 onSelectDate,
20 disabledDates,
21 selectedDate,
22 initVisibleDate,
23 allowYearView = true,
24 ...others
25}) => {
26 if (!selectedDate) {
27 throw new Error(
28 'The `selectedDate` prop is required. Use an empty array if no dates should be selected.'
29 );
30 }
31
32 if (typeof selectedDate !== 'string') {
33 throw new Error(
34 'The `selectedDate` prop should be a date string in YYYY-MM-DD format.'
35 );
36 }
37
38 if (!onSelectDate) {
39 throw new Error('The `onSelectDate` prop is required.');
40 }
41
42 if (typeof onSelectDate !== 'function') {
43 throw new Error(
44 'The `onSelectDate` prop should be function that receives a date string as paramater.'
45 );
46 }
47
48 const dateProperties = useMemo(() => {
49 let disabledDateProperties: Record<string, DateProperties> = {};
50 let selectedDateProperties: Record<string, DateProperties> = {};
51
52 disabledDateProperties = (disabledDates as string[])?.reduce(
53 (disabled: Record<string, DateProperties>, date) => {
54 disabled[date] = { isDisabled: true };
55 return disabled;
56 },
57 {}
58 );
59
60 if (dayjs(selectedDate).isValid()) {
61 selectedDateProperties = {
62 [dayjs(selectedDate).local().format('YYYY-MM-DD')]: {
63 isSelected: true,
64 },
65 };
66 }
67
68 // Not possible for a date to be both disabled and selected, so overwriting is OK
69 return {
70 ...disabledDateProperties,
71 ...selectedDateProperties,
72 };
73 }, [selectedDate, disabledDates]);
74
75 return (
76 <BaseCalendarWrappedInProviders
77 allowYearView={allowYearView}
78 onPressDay={onSelectDate}
79 initVisibleDate={
80 initVisibleDate || (dayjs(selectedDate).isValid() ? selectedDate : undefined)
81 }
82 dateProperties={dateProperties}
83 {...others}
84 />
85 );
86};
87
88export default DateSelectionCalendar;