UNPKG

@drivy/cobalt

Version:

Opinionated design system for Drivy's projects.

72 lines (69 loc) 4.07 kB
import { jsxs, jsx } from 'react/jsx-runtime'; import cx from 'classnames'; import addMonths from 'date-fns/addMonths'; import startOfDay from 'date-fns/startOfDay'; import { useRef, useState, useEffect } 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) : undefined, endDate: endDate ? startOfDay(endDate) : undefined, }); useEffect(() => { if (isFirstRender.current) { isFirstRender.current = false; return; } setRangeDates({ startDate: startDate ? startOfDay(startDate) : undefined, endDate: endDate ? startOfDay(endDate) : undefined, }); }, [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 === null || onSelectDate === void 0 ? void 0 : onSelectDate(date, !!isDateOutOfRange); }; const handleChangeDate = (date, status) => { const processChange = onChangeDate && (isEditingStartDate || isEditingEndDate) ? onChangeDate(date, status) !== false : 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 (jsxs("div", { className: cx("cobalt-CalendarRangePicker", { "cobalt-CalendarRangePicker--isEditing": isEditingStartDate || isEditingEndDate, }), children: [jsx("div", { className: "cobalt-CalendarRangePicker__months-container", children: months.map((monthDate) => (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()))) }), jsx("div", { className: cx("cobalt-CalendarRangePicker__message", { "cobalt-CalendarRangePicker__message--show": !!hint, }), children: hint && jsx(Hint, { status: hint.status, children: hint.html }) })] })); } export { CalendarRangePicker }; //# sourceMappingURL=CalendarRangePicker.js.map