import React, { useEffect, useState } from 'react' import { GetServerSideProps } from 'next' import Footer from '../../../../components/footer' import Header from '../../../../components/header' import Calendar from '../../../../components/calendar' import withSession, { isAdminSession, redirectToLogin, } from '../../../../lib/session' import { getServerSideBooking } from '../../../../lib/getServerSideProps' import { Booking } from '../../../../db/booking' import { getBookingStatus } from '../../../../helpers/booking' import { daysFormatFrontend } from '../../../../helpers/date' import { BOOKING_STATUS } from '../../../../db/enums' export const getServerSideProps: GetServerSideProps = withSession( async (context) => { const { req, res } = context const adminUser = isAdminSession(req) if (!adminUser) { redirectToLogin(req, res) return { props: {} } } const result = await getServerSideBooking(context) return { ...result, // TODO: have a closer look at this type issue. Seems like a bug // @ts-ignore props: { ...result.props, user: adminUser }, } } ) async function patchBooking(uuid: string, bookingData: any) { const response = await fetch(`/api/admin/booking/${uuid}`, { method: 'PATCH', mode: 'cors', cache: 'no-cache', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', }, referrerPolicy: 'no-referrer', body: JSON.stringify({ ...bookingData }), }) return response.json() } export default function ShowBookingAdmin({ booking: bookingProp, }: { booking: Booking }) { const [booking, setBooking] = useState(bookingProp) const [storingBooking, setStoringBooking] = useState(false) const [storingBookingError, setStoringBookingError] = useState(null) // in case the props change, update the internal state useEffect(() => setBooking(bookingProp), [bookingProp]) const onStoreBooking = async (confirmed: boolean) => { try { setStoringBookingError(null) setStoringBooking(true) const updatedBooking = await patchBooking(booking.uuid, { status: confirmed ? BOOKING_STATUS.CONFIRMED : BOOKING_STATUS.REJECTED, }) setBooking(updatedBooking) } catch (error) { setStoringBookingError('Buchung konnte nicht gespeichert werden.') console.error('Failed to store booking', error) } setStoringBooking(false) } return (