import dayjs from "dayjs"; import isBetween from "dayjs/plugin/isBetween"; dayjs.extend(isBetween); import { useEffect, useState, useMemo } from "react"; import getSlots from "../../lib/slots"; import Link from "next/link"; import { timeZone } from "../../lib/clock"; import { useRouter } from "next/router"; import { ExclamationIcon } from "@heroicons/react/solid"; const AvailableTimes = (props) => { const router = useRouter(); const { user, rescheduleUid } = router.query; const [loaded, setLoaded] = useState(false); const [error, setError] = useState(false); const times = useMemo(() => { const slots = getSlots({ calendarTimeZone: props.user.timeZone, selectedTimeZone: timeZone(), eventLength: props.eventType.length, selectedDate: props.date, dayStartTime: props.user.startTime, dayEndTime: props.user.endTime, }); return slots; }, [props.date]); const handleAvailableSlots = (busyTimes: []) => { // Check for conflicts for (let i = times.length - 1; i >= 0; i -= 1) { busyTimes.forEach((busyTime) => { const startTime = dayjs(busyTime.start); const endTime = dayjs(busyTime.end); // Check if start times are the same if (dayjs(times[i]).format("HH:mm") == startTime.format("HH:mm")) { times.splice(i, 1); } // Check if time is between start and end times if (dayjs(times[i]).isBetween(startTime, endTime)) { times.splice(i, 1); } // Check if slot end time is between start and end time if (dayjs(times[i]).add(props.eventType.length, "minutes").isBetween(startTime, endTime)) { times.splice(i, 1); } // Check if startTime is between slot if (startTime.isBetween(dayjs(times[i]), dayjs(times[i]).add(props.eventType.length, "minutes"))) { times.splice(i, 1); } }); } // Display available times setLoaded(true); }; // Re-render only when invitee changes date useEffect(() => { setLoaded(false); setError(false); fetch( `/api/availability/${user}?dateFrom=${props.date.startOf("day").utc().format()}&dateTo=${props.date .endOf("day") .utc() .format()}` ) .then((res) => res.json()) .then(handleAvailableSlots) .catch((e) => { console.error(e); setError(true); }); }, [props.date]); return (
{props.date.format("dddd DD MMMM YYYY")}
{!error && loaded && times.length > 0 && times.map((time) => (
{dayjs(time).tz(timeZone()).format(props.timeFormat)}
))} {!error && loaded && times.length == 0 && (

{props.user.name} is all booked today.

)} {!error && !loaded &&
} {error && (

Could not load the available time slots.{" "} Contact {props.user.name} via e-mail

)}
); }; export default AvailableTimes;