import { ChevronLeftIcon, ChevronRightIcon } from "@heroicons/react/solid"; import { useEffect, useState } from "react"; import dayjs, { Dayjs } from "dayjs"; import isToday from "dayjs/plugin/isToday"; dayjs.extend(isToday); const DatePicker = ({ weekStart, onDatePicked, workingHours, disableToday }) => { const workingDays = workingHours.reduce((workingDays: number[], wh) => [...workingDays, ...wh.days], []); const [selectedMonth, setSelectedMonth] = useState(dayjs().month()); const [selectedDate, setSelectedDate] = useState(); useEffect(() => { if (selectedDate) onDatePicked(selectedDate); }, [selectedDate]); // Handle month changes const incrementMonth = () => { setSelectedMonth(selectedMonth + 1); }; const decrementMonth = () => { setSelectedMonth(selectedMonth - 1); }; // Set up calendar const daysInMonth = dayjs().month(selectedMonth).daysInMonth(); const days = []; for (let i = 1; i <= daysInMonth; i++) { days.push(i); } // Create placeholder elements for empty days in first week let weekdayOfFirst = dayjs().month(selectedMonth).date(1).day(); if (weekStart === "Monday") { weekdayOfFirst -= 1; if (weekdayOfFirst < 0) weekdayOfFirst = 6; } const emptyDays = Array(weekdayOfFirst) .fill(null) .map((day, i) => (
{null}
)); const isDisabled = (day: number) => { const date: Dayjs = dayjs().month(selectedMonth).date(day); return ( date.isBefore(dayjs()) || !workingDays.includes(+date.format("d")) || (date.isToday() && disableToday) ); }; // Combine placeholder days with actual days const calendar = [ ...emptyDays, ...days.map((day) => ( )), ]; return (
{dayjs().month(selectedMonth).format("MMMM YYYY")}
{["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] .sort((a, b) => (weekStart.startsWith(a) ? -1 : weekStart.startsWith(b) ? 1 : 0)) .map((weekDay) => (
{weekDay}
))} {calendar}
); }; export default DatePicker;