From e2de28b933e0492570f517e13dcaa9df83025e9d Mon Sep 17 00:00:00 2001 From: Kartik Saini <41051387+kart1ka@users.noreply.github.com> Date: Thu, 5 Dec 2024 21:06:00 +0530 Subject: [PATCH] feat: prevent rescheduling past bookings (#18003) * feat: prevent rescheduling past bookings * hide reschedule option on frontend * fix * addd null check for booking.endTime --------- Co-authored-by: Prashant Varma --- .../components/booking/BookingListItem.tsx | 38 ++++++++++--------- .../reschedule/[uid]/getServerSideProps.ts | 34 +++++++++++------ .../bookings/views/bookings-single-view.tsx | 2 +- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/apps/web/components/booking/BookingListItem.tsx b/apps/web/components/booking/BookingListItem.tsx index 736ed28ce8..0d9cbc216b 100644 --- a/apps/web/components/booking/BookingListItem.tsx +++ b/apps/web/components/booking/BookingListItem.tsx @@ -212,23 +212,27 @@ function BookingListItem(booking: BookingItemProps) { ]; const editBookingActions: ActionType[] = [ - { - id: "reschedule", - icon: "clock" as const, - label: t("reschedule_booking"), - href: `/reschedule/${booking.uid}${ - booking.seatsReferences.length ? `?seatReferenceUid=${getSeatReferenceUid()}` : "" - }`, - }, - { - id: "reschedule_request", - icon: "send" as const, - iconClassName: "rotate-45 w-[16px] -translate-x-0.5 ", - label: t("send_reschedule_request"), - onClick: () => { - setIsOpenRescheduleDialog(true); - }, - }, + ...(isBookingInPast + ? [] + : [ + { + id: "reschedule", + icon: "clock" as const, + label: t("reschedule_booking"), + href: `/reschedule/${booking.uid}${ + booking.seatsReferences.length ? `?seatReferenceUid=${getSeatReferenceUid()}` : "" + }`, + }, + { + id: "reschedule_request", + icon: "send" as const, + iconClassName: "rotate-45 w-[16px] -translate-x-0.5 ", + label: t("send_reschedule_request"), + onClick: () => { + setIsOpenRescheduleDialog(true); + }, + }, + ]), ...(isBookingReroutable(parsedBooking) ? [ { diff --git a/apps/web/lib/reschedule/[uid]/getServerSideProps.ts b/apps/web/lib/reschedule/[uid]/getServerSideProps.ts index 90fa034322..11fc4aa184 100644 --- a/apps/web/lib/reschedule/[uid]/getServerSideProps.ts +++ b/apps/web/lib/reschedule/[uid]/getServerSideProps.ts @@ -115,6 +115,28 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { }; } + const eventType = booking.eventType ? booking.eventType : getDefaultEvent(dynamicEventSlugRef); + + const enrichedBookingUser = booking.user + ? await UserRepository.enrichUserWithItsProfile({ user: booking.user }) + : null; + + const eventUrl = await buildEventUrlFromBooking({ + eventType, + dynamicGroupSlugRef: booking.dynamicGroupSlugRef ?? null, + profileEnrichedBookingUser: enrichedBookingUser, + }); + + const isBookingInPast = booking.endTime && new Date(booking.endTime) < new Date(); + if (isBookingInPast) { + return { + redirect: { + destination: eventUrl, + permanent: false, + }, + }; + } + // if booking event type is for a seated event and no seat reference uid is provided, throw not found if (booking?.eventType?.seatsPerTimeSlot && !maybeSeatReferenceUid) { const userId = session?.user?.id; @@ -142,18 +164,6 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { } } - const eventType = booking.eventType ? booking.eventType : getDefaultEvent(dynamicEventSlugRef); - - const enrichedBookingUser = booking.user - ? await UserRepository.enrichUserWithItsProfile({ user: booking.user }) - : null; - - const eventUrl = await buildEventUrlFromBooking({ - eventType, - dynamicGroupSlugRef: booking.dynamicGroupSlugRef ?? null, - profileEnrichedBookingUser: enrichedBookingUser, - }); - const destinationUrlSearchParams = new URLSearchParams(); destinationUrlSearchParams.set("rescheduleUid", seatReferenceUid || bookingUid); diff --git a/apps/web/modules/bookings/views/bookings-single-view.tsx b/apps/web/modules/bookings/views/bookings-single-view.tsx index be7902f94e..623171b712 100644 --- a/apps/web/modules/bookings/views/bookings-single-view.tsx +++ b/apps/web/modules/bookings/views/bookings-single-view.tsx @@ -729,7 +729,7 @@ export default function Success(props: PageProps) { <> - {!props.recurringBookings && ( + {!props.recurringBookings && !isBookingInPast && (