import dayjs, {Dayjs} from "dayjs"; import isBetween from 'dayjs/plugin/isBetween'; dayjs.extend(isBetween); import {useEffect, useMemo, useState} 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 = getSlots({ calendarTimeZone: props.user.timeZone, selectedTimeZone: timeZone(), eventLength: props.eventType.length, selectedDate: props.date, dayStartTime: props.user.startTime, dayEndTime: props.user.endTime, }); const handleAvailableSlots = (busyTimes: []) => { // Check for conflicts for (let i = times.length - 1; i >= 0; i -= 1) { busyTimes.forEach(busyTime => { let startTime = dayjs(busyTime.start); let 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 => setError(true)) }, [props.date]); return (
{props.date.format("dddd DD MMMM YYYY")}
{ !error && loaded && times.map((time) =>
{dayjs(time).tz(timeZone()).format(props.timeFormat)}
) } {!error && !loaded &&
} {error &&

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

}
); } export default AvailableTimes;