From 010f5349f6952aa551fa0e85a20de8f06a4d6c67 Mon Sep 17 00:00:00 2001 From: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:09:50 +0530 Subject: [PATCH] feat: Link to rescheduled booking from the old one (#15211) * feat: Link to rescheduled booking from the old one * add original comment * use fromReschedule * fix: type check * review updates * Update common.json * change booking page text * Delete packages/features/bookings/lib/getRescheduledToBooking.tsx --------- Co-authored-by: Somay Chauhan --- ...ookings-single-view.getServerSideProps.tsx | 10 ++++++++ .../views/bookings-single-view.test.tsx | 3 +++ .../bookings/views/bookings-single-view.tsx | 24 ++++++++++++++++++- apps/web/public/static/locales/en/common.json | 1 + .../features/bookings/lib/getUserBooking.ts | 2 ++ packages/lib/server/repository/booking.ts | 14 +++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 packages/lib/server/repository/booking.ts diff --git a/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx b/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx index 3927de97a6..0524350b04 100644 --- a/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx +++ b/apps/web/modules/bookings/views/bookings-single-view.getServerSideProps.tsx @@ -7,6 +7,7 @@ import getBookingInfo from "@calcom/features/bookings/lib/getBookingInfo"; import { parseRecurringEvent } from "@calcom/lib"; import { getDefaultEvent } from "@calcom/lib/defaultEvents"; import { maybeGetBookingUidFromSeat } from "@calcom/lib/server/maybeGetBookingUidFromSeat"; +import { BookingRepository } from "@calcom/lib/server/repository/booking"; import prisma from "@calcom/prisma"; import { customInputSchema, EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; @@ -72,6 +73,14 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { } as const; } + let rescheduledToUid: string | null = null; + if (bookingInfo.rescheduled) { + const rescheduledTo = await BookingRepository.findFirstBookingByReschedule({ + originalBookingUid: bookingInfo.uid, + }); + rescheduledToUid = rescheduledTo?.uid ?? null; + } + const eventTypeRaw = !bookingInfoRaw.eventTypeId ? getDefaultEvent(eventTypeSlug || "") : await getEventTypesFromDB(bookingInfoRaw.eventTypeId); @@ -176,6 +185,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { ...(tz && { tz }), userTimeFormat, requiresLoginToUpdate, + rescheduledToUid, }, }; } diff --git a/apps/web/modules/bookings/views/bookings-single-view.test.tsx b/apps/web/modules/bookings/views/bookings-single-view.test.tsx index 484c565dc2..ae19e6f7e6 100644 --- a/apps/web/modules/bookings/views/bookings-single-view.test.tsx +++ b/apps/web/modules/bookings/views/bookings-single-view.test.tsx @@ -76,6 +76,8 @@ function mockedSuccessComponentProps(props: Partial; } diff --git a/apps/web/modules/bookings/views/bookings-single-view.tsx b/apps/web/modules/bookings/views/bookings-single-view.tsx index e63ad3bb9a..3b7533265c 100644 --- a/apps/web/modules/bookings/views/bookings-single-view.tsx +++ b/apps/web/modules/bookings/views/bookings-single-view.tsx @@ -108,7 +108,7 @@ export default function Success(props: PageProps) { const routerQuery = useRouterQuery(); const pathname = usePathname(); const searchParams = useCompatSearchParams(); - const { eventType, bookingInfo, requiresLoginToUpdate, orgSlug } = props; + const { eventType, bookingInfo, requiresLoginToUpdate, orgSlug, rescheduledToUid } = props; const { allRemainingBookings, @@ -585,6 +585,9 @@ export default function Success(props: PageProps) { )} + + {rescheduledToUid ? : null} + {bookingInfo?.description && ( <>
{t("additional_notes")}
@@ -995,6 +998,25 @@ export default function Success(props: PageProps) { ); } +const RescheduledToLink = ({ rescheduledToUid }: { rescheduledToUid: string }) => { + const { t } = useLocale(); + return ( + <> +
{t("rescheduled")}
+
+ + +
+ {t("view_booking")} + +
+ +
+
+ + ); +}; + const DisplayLocation = ({ locationToDisplay, providerName, diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 32fa46341e..e3cf9ef74a 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -1491,6 +1491,7 @@ "team_disable_cal_branding_description": "Removes any {{appName}} related brandings, i.e. 'Powered by {{appName}}'", "invited_by_team": "{{teamName}} has invited you to join their team as a {{role}}", "token_invalid_expired": "Token is either invalid or expired.", + "view_booking": "View Booking", "exchange_add": "Connect to Microsoft Exchange", "exchange_authentication": "Authentication method", "exchange_authentication_standard": "Basic authentication", diff --git a/packages/features/bookings/lib/getUserBooking.ts b/packages/features/bookings/lib/getUserBooking.ts index 0f78882b97..71468a45cc 100644 --- a/packages/features/bookings/lib/getUserBooking.ts +++ b/packages/features/bookings/lib/getUserBooking.ts @@ -22,6 +22,8 @@ const getUserBooking = async (uid: string) => { responses: true, rejectionReason: true, userPrimaryEmail: true, + fromReschedule: true, + rescheduled: true, user: { select: { id: true, diff --git a/packages/lib/server/repository/booking.ts b/packages/lib/server/repository/booking.ts new file mode 100644 index 0000000000..1a34c7c18c --- /dev/null +++ b/packages/lib/server/repository/booking.ts @@ -0,0 +1,14 @@ +import prisma from "@calcom/prisma"; + +export class BookingRepository { + static async findFirstBookingByReschedule({ originalBookingUid }: { originalBookingUid: string }) { + return await prisma.booking.findFirst({ + where: { + fromReschedule: originalBookingUid, + }, + select: { + uid: true, + }, + }); + } +}