import React, { useEffect, useState } from 'react' import { GetServerSideProps } from 'next' import { useRouter } from 'next/router' import Link from 'next/link' 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, patchBooking } 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 }, } } ) export default function ShowBookingAdmin({ booking: bookingProp, }: { booking: Booking }) { const router = useRouter() 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 ( <> Buchung {booking.uuid} Buchungszeitraum: {daysFormatFrontend(booking.days)} Bucher: {booking.booker.name} Buchungsstatus: {getBookingStatus(booking.status)} {storingBookingError && ( {storingBookingError} )} onStoreBooking(true)} className="btn btn-blue" disabled={storingBooking} > Buchung Bestätigen onStoreBooking(false)} className="btn btn-red" disabled={storingBooking} > Buchung Abweisen Rechnung > ) }