@drivy/cobalt
Version:
Opinionated design system for Drivy's projects.
110 lines (109 loc) • 4.74 kB
JavaScript
import { jsx, jsxs } from "react/jsx-runtime";
import classnames from "classnames";
import addMonths from "date-fns/addMonths";
import startOfDay from "date-fns/startOfDay";
import { useEffect, useRef, useState } from "react";
import { Hint } from "../../Form/Hint.js";
import { CalendarRangePickerMonth } from "./CalendarRangePickerMonth.js";
function CalendarRangePicker({ rangeConstraints, firstMonthDate = new Date(), numberOfMonths = 1, hint, firstAvailableDate = new Date(), lastAvailableDate, isEditingStartDate, isEditingEndDate, startDate, endDate, onChangeDate, onLeaveDate, onSelectDate, isDayDisabledFn, hasDayNotificationFn, isDayInvalidForSelectionFn, dayHoverTooltipFn, isSundayFirstDayOfWeek, locale }) {
const isFirstRender = useRef(true);
firstMonthDate.setHours(0, 0, 0, 0);
firstAvailableDate.setHours(0, 0, 0, 0);
const [rangeDates, setRangeDates] = useState({
startDate: startDate ? startOfDay(startDate) : void 0,
endDate: endDate ? startOfDay(endDate) : void 0
});
useEffect(()=>{
if (isFirstRender.current) {
isFirstRender.current = false;
return;
}
setRangeDates({
startDate: startDate ? startOfDay(startDate) : void 0,
endDate: endDate ? startOfDay(endDate) : void 0
});
}, [
startDate,
endDate
]);
useEffect(()=>{
if (!isEditingEndDate) return;
if (rangeDates.startDate && !rangeDates.endDate) setRangeDates({
...rangeDates,
endDate: rangeDates.startDate
});
}, [
isEditingEndDate,
rangeDates
]);
useEffect(()=>{
if (!isEditingStartDate) return;
if (rangeDates.endDate && !rangeDates.startDate) setRangeDates({
...rangeDates,
startDate: rangeDates.endDate
});
}, [
isEditingStartDate,
rangeDates
]);
const handleSelectDate = (date, isDateOutOfRange)=>{
if (isDateOutOfRange && isEditingEndDate) return;
onSelectDate?.(date, !!isDateOutOfRange);
};
const handleChangeDate = (date, status)=>{
const processChange = onChangeDate && (isEditingStartDate || isEditingEndDate) ? false !== onChangeDate(date, status) : true;
if (!processChange || status.isDisabled) return;
if (isEditingStartDate) setRangeDates((prev)=>({
...prev,
startDate: date
}));
else if (isEditingEndDate) setRangeDates((prev)=>({
...prev,
endDate: date
}));
};
const months = [
firstMonthDate
];
for(let i = 0; i < numberOfMonths - 1; i++)months.push(addMonths(months[months.length - 1], 1));
return /*#__PURE__*/ jsxs("div", {
className: classnames("cobalt-CalendarRangePicker", {
"cobalt-CalendarRangePicker--isEditing": isEditingStartDate || isEditingEndDate
}),
children: [
/*#__PURE__*/ jsx("div", {
className: "cobalt-CalendarRangePicker__months-container",
children: months.map((monthDate)=>/*#__PURE__*/ jsx(CalendarRangePickerMonth, {
date: monthDate,
startDate: rangeDates.startDate,
endDate: rangeDates.endDate,
onSelectDate: handleSelectDate,
onChangeDate: handleChangeDate,
onLeaveDate: onLeaveDate,
isEditingStartDate: isEditingStartDate,
isEditingEndDate: isEditingEndDate,
rangeConstraints: rangeConstraints,
firstAvailableDate: firstAvailableDate,
lastAvailableDate: lastAvailableDate,
isDayDisabledFn: isDayDisabledFn,
hasDayNotificationFn: hasDayNotificationFn,
isDayInvalidForSelectionFn: isDayInvalidForSelectionFn,
isSundayFirstDayOfWeek: isSundayFirstDayOfWeek,
dayHoverTooltipFn: dayHoverTooltipFn,
locale: locale
}, monthDate.getTime()))
}),
/*#__PURE__*/ jsx("div", {
className: classnames("cobalt-CalendarRangePicker__message", {
"cobalt-CalendarRangePicker__message--show": !!hint
}),
children: hint && /*#__PURE__*/ jsx(Hint, {
status: hint.status,
children: hint.html
})
})
]
});
}
export { CalendarRangePicker };
//# sourceMappingURL=CalendarRangePicker.js.map