import Head from "next/head"; import Link from "next/link"; import prisma from "../../lib/prisma"; import Shell from "../../components/Shell"; import { useEffect, useState } from "react"; import { getSession, useSession } from "next-auth/client"; import { CalendarIcon, CheckCircleIcon, ChevronRightIcon, PlusIcon, XCircleIcon, } from "@heroicons/react/solid"; import { InformationCircleIcon } from "@heroicons/react/outline"; import { Switch } from "@headlessui/react"; export default function Home({ integrations }) { const [session, loading] = useSession(); const [showAddModal, setShowAddModal] = useState(false); const [showSelectCalendarModal, setShowSelectCalendarModal] = useState(false); const [selectableCalendars, setSelectableCalendars] = useState([]); function toggleAddModal() { setShowAddModal(!showAddModal); } function toggleShowCalendarModal() { setShowSelectCalendarModal(!showSelectCalendarModal); } function loadCalendars() { fetch("api/availability/calendar") .then((response) => response.json()) .then((data) => { setSelectableCalendars(data); }); } function integrationHandler(type) { fetch("/api/integrations/" + type.replace("_", "") + "/add") .then((response) => response.json()) .then((data) => (window.location.href = data.url)); } function calendarSelectionHandler(calendar) { return (selected) => { const cals = [...selectableCalendars]; const i = cals.findIndex((c) => c.externalId === calendar.externalId); cals[i].selected = selected; setSelectableCalendars(cals); if (selected) { fetch("api/availability/calendar", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(cals[i]), }).then((response) => response.json()); } else { fetch("api/availability/calendar", { method: "DELETE", headers: { "Content-Type": "application/json", }, body: JSON.stringify(cals[i]), }).then((response) => response.json()); } }; } function getCalendarIntegrationImage(integrationType: string) { switch (integrationType) { case "google_calendar": return "integrations/google-calendar.svg"; case "office365_calendar": return "integrations/outlook.svg"; default: return ""; } } function classNames(...classes) { return classes.filter(Boolean).join(" "); } useEffect(loadCalendars, [integrations]); if (loading) { return (
{ig.title}
{ig.type.endsWith("_calendar") && ( Calendar Integration )} {ig.type.endsWith("_video") && ( Video Conferencing )}
You currently do not have any integrations set up. Add your first integration to get started.
Link a new integration to your account.
{integration.description}
Select which calendars are checked for availability to prevent double bookings.
If no entry is selected, all calendars will be checked