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) => { let cals = [...selectableCalendars]; let 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.png"; case "office365_calendar": return "integrations/office-365.png"; default: return ""; } } function classNames(...classes) { return classes.filter(Boolean).join(' ') } useEffect(loadCalendars, [integrations]); if (loading) { return
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