import './BookingCalendar.scss' import { __ } from '@wordpress/i18n' import Calendar from 'react-calendar' import 'react-calendar/dist/Calendar.css' import { IBookingCalendarProps } from './types' import { Value } from 'react-calendar/dist/esm/shared/types.js' import { Indication } from './Indication' import { useWording } from '../../hooks/useWording' import { useLocale } from '../../hooks/useLocale' import { useBookingContext } from '../../providers/BookingFormProvider/BookingFormProvider' import type { CalendarType } from 'react-calendar/dist/esm/shared/types.js' import { addDays, isSameDay, startOfDay, startOfMonth } from 'date-fns' import classNames from 'classnames' const getCalendarType = (startOfWeek?: number): CalendarType | undefined => { if (startOfWeek === undefined) { return undefined } switch (startOfWeek) { case 0: return 'gregory' case 1: return 'iso8601' case 6: return 'islamic' default: return undefined } } export const BookingCalendar = ({ availableDates, selectedDate, setValue, setMonth, viewMonth, serviceId, startOfWeek, selectionMode = 'single', minRangeDays, maxRangeDays, restrictToAvailableDates = false, hideIndications = false, showLoader = true, }: IBookingCalendarProps) => { const wording = useWording() const { locale } = useLocale() const { loading } = useBookingContext() const calendarType = getCalendarType(startOfWeek) const activeStartDate = startOfMonth(viewMonth) const todayStart = startOfDay(new Date()) const hasAvailableDatesFilter = selectionMode === 'single' ? availableDates.length > 0 : restrictToAvailableDates const normalizedMinRangeDays = typeof minRangeDays === 'number' && Number.isFinite(minRangeDays) ? Math.max(0, Math.floor(minRangeDays)) : 0 const normalizedMaxRangeDays = typeof maxRangeDays === 'number' && Number.isFinite(maxRangeDays) ? Math.max(0, Math.floor(maxRangeDays)) : 0 const effectiveMaxRangeDays = normalizedMaxRangeDays > 0 && normalizedMinRangeDays > 0 ? Math.max(normalizedMaxRangeDays, normalizedMinRangeDays) : normalizedMaxRangeDays const rangeStartDate = Array.isArray(selectedDate) ? selectedDate[0] ? startOfDay(selectedDate[0] as Date) : null : selectedDate instanceof Date ? startOfDay(selectedDate) : null const rangeEndDate = Array.isArray(selectedDate) ? selectedDate[1] : null const hasRangeLimits = normalizedMinRangeDays > 0 || normalizedMaxRangeDays > 0 const isSelectingRangeEnd = selectionMode === 'range' && hasRangeLimits && !!rangeStartDate && !rangeEndDate return (