import { useEffect, useMemo } from "react"; import dayjs from "@calcom/dayjs"; import { useBookerStoreContext } from "@calcom/features/bookings/Booker/BookerStoreProvider"; import { useOverlayCalendarStore } from "@calcom/features/bookings/Booker/components/OverlayCalendar/store"; import { useAvailableTimeSlots } from "@calcom/features/bookings/Booker/hooks/useAvailableTimeSlots"; import { useBookerTime } from "@calcom/features/bookings/Booker/hooks/useBookerTime"; import { getQueryParam } from "@calcom/features/bookings/Booker/utils/query-param"; import type { BookerEvent } from "@calcom/features/bookings/types"; import { Calendar } from "@calcom/features/calendars/weeklyview/components/Calendar"; import type { CalendarEvent } from "@calcom/features/calendars/weeklyview/types/events"; import { localStorage } from "@calcom/lib/webstorage"; import type { useScheduleForEventReturnType } from "@calcom/web/modules/schedules/hooks/useEvent"; import { OutOfOfficeInSlots } from "./OutOfOfficeInSlots"; export const LargeCalendar = ({ extraDays, schedule, isLoading, event, }: { extraDays: number; schedule?: useScheduleForEventReturnType["data"]; isLoading: boolean; event: { data?: Pick | null; }; }) => { const selectedDate = useBookerStoreContext((state) => state.selectedDate); const setSelectedTimeslot = useBookerStoreContext((state) => state.setSelectedTimeslot); const selectedEventDuration = useBookerStoreContext((state) => state.selectedDuration); const overlayEvents = useOverlayCalendarStore((state) => state.overlayBusyDates); const displayOverlay = getQueryParam("overlayCalendar") === "true" || localStorage?.getItem("overlayCalendarSwitchDefault"); const { timezone } = useBookerTime(); const eventDuration = selectedEventDuration || event?.data?.length || 30; const availableSlots = useAvailableTimeSlots({ schedule, eventDuration }); const startDate = selectedDate ? dayjs(selectedDate).toDate() : dayjs().toDate(); const endDate = dayjs(startDate) .add(extraDays - 1, "day") .toDate(); // HACK: force rerender when overlay events change // Sine we dont use react router here we need to force rerender (ATOM SUPPORT) useEffect(() => {}, [displayOverlay]); const overlayEventsForDate = useMemo(() => { if (!overlayEvents || !displayOverlay) return []; return overlayEvents.map((event, id) => { return { id, start: dayjs(event.start).toDate(), end: dayjs(event.end).toDate(), title: "Busy", options: { status: "ACCEPTED", borderOnly: true, }, } as CalendarEvent; }); }, [overlayEvents, displayOverlay]); return (
setSelectedTimeslot(date.toISOString())} gridCellsPerHour={60 / eventDuration} hoverEventDuration={eventDuration} hideHeader timezone={timezone} renderOutOfOffice={(props) => } />
); };