DocSpace-client/packages/components/calendar/index.js

145 lines
3.9 KiB
JavaScript
Raw Normal View History

import React, { useEffect, useState } from "react";
import propTypes from "prop-types";
2023-02-02 09:30:50 +00:00
import moment from "moment";
2023-02-02 09:30:50 +00:00
import { Days, Months, Years } from "./sub-components";
import { ColorTheme, ThemeType } from "@docspace/components/ColorTheme";
import { getValidDates } from "./utils";
const Calendar = ({
locale,
selectedDate,
setSelectedDate,
minDate,
maxDate,
id,
className,
style,
initialDate,
2023-03-01 11:23:42 +00:00
onChange,
2023-05-11 10:48:35 +00:00
isMobile,
forwardedRef,
}) => {
moment.locale(locale);
function handleDateChange(date) {
2023-07-19 11:10:17 +00:00
const formattedDate = moment(
date.format("YYYY-MM-DD") +
(selectedDate ? ` ${selectedDate.format("HH:mm")}` : "")
);
setSelectedDate(formattedDate);
onChange(formattedDate);
}
2023-03-01 11:23:42 +00:00
const [observedDate, setObservedDate] = useState(moment());
const [selectedScene, setSelectedScene] = useState(0);
[minDate, maxDate] = getValidDates(minDate, maxDate);
initialDate = moment(initialDate);
useEffect(() => {
const today = moment();
if (!initialDate) {
initialDate =
today <= maxDate && initialDate >= minDate
? today
: today.diff(minDate, "day") > today.diff(maxDate, "day")
? minDate.clone()
: maxDate.clone();
initialDate.startOf("day");
} else if (initialDate > maxDate || initialDate < minDate) {
initialDate =
today <= maxDate && today >= minDate
? today
: today.diff(minDate, "day") > today.diff(maxDate, "day")
? minDate.clone()
: maxDate.clone();
initialDate.startOf("day");
console.error(
"Initial date is out of min/max dates boundaries. Initial date will be set as closest boundary value"
);
}
setObservedDate(initialDate);
}, []);
2023-01-30 14:27:58 +00:00
return (
<ColorTheme
themeId={ThemeType.Calendar}
id={id}
className={className}
style={style}
2023-05-11 10:48:35 +00:00
isMobile={isMobile}
ref={forwardedRef}
>
{selectedScene === 0 ? (
<Days
observedDate={observedDate}
setObservedDate={setObservedDate}
setSelectedScene={setSelectedScene}
selectedDate={selectedDate}
2023-03-01 11:23:42 +00:00
handleDateChange={handleDateChange}
2023-02-06 14:14:03 +00:00
minDate={minDate}
maxDate={maxDate}
2023-05-11 10:48:35 +00:00
isMobile={isMobile}
/>
) : selectedScene === 1 ? (
<Months
observedDate={observedDate}
setObservedDate={setObservedDate}
setSelectedScene={setSelectedScene}
selectedDate={selectedDate}
2023-02-06 14:14:03 +00:00
minDate={minDate}
maxDate={maxDate}
2023-05-11 10:48:35 +00:00
isMobile={isMobile}
/>
) : (
<Years
observedDate={observedDate}
setObservedDate={setObservedDate}
setSelectedScene={setSelectedScene}
selectedDate={selectedDate}
2023-02-06 14:14:03 +00:00
minDate={minDate}
maxDate={maxDate}
2023-05-11 10:48:35 +00:00
isMobile={isMobile}
/>
)}
</ColorTheme>
2023-01-30 14:27:58 +00:00
);
};
Calendar.propTypes = {
/** Class name */
className: propTypes.string,
/** Used as HTML `id` property */
id: propTypes.string,
/** Specifies the calendar locale */
locale: propTypes.string,
/** Value of selected date (moment object)*/
selectedDate: propTypes.object,
/** Allows handling the changing events of the component */
2023-03-01 11:23:42 +00:00
onChange: propTypes.func,
/** Changes the selected date state */
setSelectedDate: propTypes.func,
/** Specifies the minimum selectable date */
minDate: propTypes.object,
/** Specifies the maximum selectable date */
maxDate: propTypes.object,
2023-02-09 10:06:47 +00:00
/** Accepts css style */
style: propTypes.oneOfType([propTypes.object, propTypes.array]),
/** First shown date */
initialDate: propTypes.object,
};
Calendar.defaultProps = {
locale: "en",
minDate: new Date("1970/01/01"),
maxDate: new Date("2040/01/01"),
id: "",
className: "",
initialDate: new Date(),
2023-03-01 11:23:42 +00:00
onChange: (date) => {
console.log(date);
},
};
export default Calendar;