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

124 lines
3.2 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/common/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,
}) => {
moment.locale(locale);
function handleDateChange(date) {
2023-03-01 11:23:42 +00:00
setSelectedDate(date);
onChange(date);
}
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(() => {
if (!initialDate || initialDate > maxDate || initialDate < minDate) {
initialDate = minDate
.clone()
.add(maxDate.diff(minDate, "days") / 2, "day");
console.error(
"Initial date is out of min/max dates boundaries. Initial date will be set as mid value between min and max dates"
);
}
2023-03-01 12:19:36 +00:00
initialDate.startOf("day");
// setSelectedDate(initialDate);
setObservedDate(initialDate);
}, []);
2023-01-30 14:27:58 +00:00
return (
<ColorTheme
themeId={ThemeType.Calendar}
id={id}
className={className}
style={style}
>
{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}
/>
) : selectedScene === 1 ? (
<Months
observedDate={observedDate}
setObservedDate={setObservedDate}
setSelectedScene={setSelectedScene}
selectedDate={selectedDate}
2023-02-06 14:14:03 +00:00
minDate={minDate}
maxDate={maxDate}
/>
) : (
<Years
observedDate={observedDate}
setObservedDate={setObservedDate}
setSelectedScene={setSelectedScene}
selectedDate={selectedDate}
2023-02-06 14:14:03 +00:00
minDate={minDate}
maxDate={maxDate}
/>
)}
</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 locale of calendar */
locale: propTypes.string,
/** Value of selected date (moment object)*/
selectedDate: propTypes.object,
/** Allow you to handle changing events of component */
2023-03-01 11:23:42 +00:00
onChange: propTypes.func,
/** Changes 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;