From f00be08e8c67d3ed6c9420214e7ce1e9cd3f3755 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Mon, 23 Feb 2026 13:25:02 +0000 Subject: [PATCH] fix: order custom questions by event type bookingFields in BookingDetailsSheet (#28140) Co-Authored-By: unknown <> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../components/BookingDetailsSheet.tsx | 66 ++++++------------- 1 file changed, 21 insertions(+), 45 deletions(-) diff --git a/apps/web/modules/bookings/components/BookingDetailsSheet.tsx b/apps/web/modules/bookings/components/BookingDetailsSheet.tsx index 71006ac8e8..7c17befa92 100644 --- a/apps/web/modules/bookings/components/BookingDetailsSheet.tsx +++ b/apps/web/modules/bookings/components/BookingDetailsSheet.tsx @@ -261,16 +261,12 @@ function BookingDetailsSheetInner({ const recurringInfo = booking.recurringEventId && booking.eventType?.recurringEvent ? { - count: booking.eventType.recurringEvent.count, - recurringEvent: booking.eventType.recurringEvent, - } + count: booking.eventType.recurringEvent.count, + recurringEvent: booking.eventType.recurringEvent, + } : null; - const customResponses = booking.responses - ? Object.entries(booking.responses as Record) - .filter(([fieldName]) => shouldShowFieldInCustomResponses(fieldName)) - .map(([question, answer]) => [question, answer] as [string, unknown]) - : []; + const responses = (booking.responses ?? {}) as Record; const reason = booking.assignmentReasonSortedByCreatedAt?.[booking.assignmentReasonSortedByCreatedAt.length - 1]; @@ -424,7 +420,7 @@ function BookingDetailsSheetInner({ @@ -556,7 +552,7 @@ function DisplayTimestamp({ const start = startTime instanceof Date ? dayjs(startTime).tz(timeZone) : startTime; const end = endTime instanceof Date ? dayjs(endTime).tz(timeZone) : endTime; const localizedTimezone = timeZone - ? formatToLocalizedTimezone(start, language, timeZone) ?? timeZone + ? (formatToLocalizedTimezone(start, language, timeZone) ?? timeZone) : start.format("Z"); return ( @@ -818,60 +814,40 @@ function SlotsSection({ booking }: { booking: BookingOutput }) { } function CustomQuestionsSection({ - customResponses, + responses, bookingFields: rawBookingFields, }: { - customResponses: [string, unknown][]; + responses: Record; bookingFields?: unknown; }) { const { t } = useLocale(); - // Parse and memoize booking fields const bookingFields = useMemo(() => { if (!rawBookingFields) return undefined; const parsed = eventTypeBookingFields.safeParse(rawBookingFields); return parsed.success ? parsed.data : undefined; }, [rawBookingFields]); - // Filter out responses with falsy answers or empty arrays - const validResponses = useMemo( - (): [string, unknown][] => - customResponses.filter(([, answer]) => { - if (!answer) return false; - if (Array.isArray(answer) && answer.length === 0) return false; - return true; - }), - [customResponses] - ); - - // Memoize field label lookups - const fieldLabels = useMemo(() => { - if (!bookingFields) return new Map(); - - return new Map( - bookingFields.map( - (field) => - [field.name, field.label || t(field.defaultLabel || field.name)] as [ - string, - string - ] - ) - ); - }, [bookingFields, t]); - - if (validResponses.length === 0) { + if (!bookingFields) { return null; } return ( <> - {validResponses.map(([fieldName, answer], idx) => { - const fieldNameStr = String(fieldName); - const title: string = fieldLabels.get(fieldNameStr) ?? fieldNameStr; + {bookingFields.map((field) => { + if (!field) return null; + if (!shouldShowFieldInCustomResponses(field.name)) return null; + + const answer = responses[field.name]; + if (!answer) return null; + if (Array.isArray(answer) && answer.length === 0) return null; + + const label = field.label || t(field.defaultLabel || field.name); + return ( -
+

- {String(answer)} + {field.type === "boolean" ? (answer ? t("yes") : t("no")) : String(answer)}

);