diff --git a/packages/lib/bookingSuccessRedirect.ts b/packages/lib/bookingSuccessRedirect.ts index f112ea077b..76b6972d7f 100644 --- a/packages/lib/bookingSuccessRedirect.ts +++ b/packages/lib/bookingSuccessRedirect.ts @@ -24,7 +24,7 @@ function getNewSearchParams(args: { type SuccessRedirectBookingType = Pick< BookingResponse | PaymentPageProps["booking"], - "uid" | "title" | "description" | "startTime" | "endTime" | "location" + "uid" | "title" | "description" | "startTime" | "endTime" | "location" | "attendees" | "user" >; export const getBookingRedirectExtraParams = (booking: SuccessRedirectBookingType) => { @@ -35,11 +35,65 @@ export const getBookingRedirectExtraParams = (booking: SuccessRedirectBookingTyp "startTime", "endTime", "location", + "attendees", + "user", ]; - return (Object.keys(booking) as BookingResponseKey[]) + type ResultType = { + [key in BookingResponseKey]?: SuccessRedirectBookingType[key]; + } & { + hostName?: string[]; + attendeeName?: string | null; + }; + + const result = (Object.keys(booking) as BookingResponseKey[]) .filter((key) => redirectQueryParamKeys.includes(key)) - .reduce((obj, key) => ({ ...obj, [key]: booking[key] }), {}); + .reduce((obj, key) => { + if (key === "user" && booking.user?.name) { + return { ...obj, hostName: [...(obj.hostName || []), booking.user.name] }; + } + + if (key === "attendees" && Array.isArray(booking.attendees)) { + const attendeeName = booking.attendees[0]?.name || null; + const { hostNames, guestEmails } = booking.attendees.slice(1).reduce( + (acc, attendee) => { + if (attendee.name) { + acc.hostNames.push(attendee.name); + } else if (attendee.email) { + acc.guestEmails.push(attendee.email); + } + return acc; + }, + { hostNames: [], guestEmails: [] } as { hostNames: string[]; guestEmails: string[] } + ); + return { + ...obj, + attendeeName, + hostName: [...(obj.hostName || []), ...hostNames], + guestEmail: guestEmails.length > 0 ? guestEmails : undefined, + }; + } + return { ...obj, [key]: booking[key] }; + }, {}); + + const queryCompatibleParams: Record = { + ...Object.fromEntries( + Object.entries(result).map(([key, value]) => { + if (Array.isArray(value)) { + return [key, value.join(", ")]; + } + if (typeof value === "object" && value !== null) { + // Skip complex objects (user, attendees) as we are extracting only needed fields + return [key, undefined]; + } + return [key, value]; + }) + ), + hostName: result.hostName?.join(", "), + attendeeName: result.attendeeName || undefined, + }; + + return queryCompatibleParams; }; export const useBookingSuccessRedirect = () => { @@ -78,7 +132,6 @@ export const useBookingSuccessRedirect = () => { }, searchParams: searchParams ?? undefined, }); - newSearchParams.forEach((value, key) => { url.searchParams.append(key, value); }); diff --git a/packages/prisma/selects/payment.ts b/packages/prisma/selects/payment.ts index 900209fe93..1b7104406a 100644 --- a/packages/prisma/selects/payment.ts +++ b/packages/prisma/selects/payment.ts @@ -18,6 +18,11 @@ export const paymentDataSelect = Prisma.validator()({ title: true, startTime: true, endTime: true, + user: { + select: { + name: true, + }, + }, attendees: { select: { email: true,