import { useMemo } from "react"; import shallow from "zustand/shallow"; import dayjs from "@calcom/dayjs"; import { useCalendarStore } from "../../state/store"; import { BlockedTimeCell } from "./BlockedTimeCell"; type Props = { day: dayjs.Dayjs; containerRef: React.RefObject; }; function roundX(x: number, roundBy: number) { return Math.round(x / roundBy) * roundBy; } type BlockedDayProps = { startHour: number; endHour: number; day: dayjs.Dayjs; }; function BlockedBeforeToday({ day, startHour, endHour }: BlockedDayProps) { return ( <> {day.isBefore(dayjs(), "day") && (
)} ); } function BlockedToday({ day, startHour, gridCellsPerHour, endHour, }: BlockedDayProps & { gridCellsPerHour: number }) { const dayStart = useMemo(() => day.startOf("day").hour(startHour), [day, startHour]); const dayEnd = useMemo(() => day.startOf("day").hour(endHour), [day, endHour]); const dayEndInMinutes = useMemo(() => dayEnd.diff(dayStart, "minutes"), [dayEnd, dayStart]); let nowComparedToDayStart = useMemo(() => dayjs().diff(dayStart, "minutes"), [dayStart]); if (nowComparedToDayStart > dayEndInMinutes) nowComparedToDayStart = dayEndInMinutes; return ( <> {day.isToday() && (
)} ); } export function BlockedList({ day }: Props) { const { startHour, blockingDates, endHour, gridCellsPerHour } = useCalendarStore( (state) => ({ startHour: state.startHour || 0, endHour: state.endHour || 23, blockingDates: state.blockingDates, gridCellsPerHour: state.gridCellsPerHour || 4, }), shallow ); return ( <> {blockingDates && blockingDates.map((event, i) => { const dayStart = day.startOf("day").hour(startHour); const blockingStart = dayjs(event.start); const eventEnd = dayjs(event.end); const eventStart = dayStart.isAfter(blockingStart) ? dayStart : blockingStart; if (!eventStart.isSame(day, "day")) { return null; } if (eventStart.isBefore(dayjs())) { if (eventEnd.isBefore(dayjs())) { return null; } } const eventDuration = eventEnd.diff(eventStart, "minutes"); const eventStartHour = eventStart.hour(); const eventStartDiff = (eventStartHour - (startHour || 0)) * 60; return (
); })} ); }