From 775fe92960fd81d4512e96ce277d90a8c009f53d Mon Sep 17 00:00:00 2001 From: alannnc Date: Fri, 5 Aug 2022 11:08:47 -0600 Subject: [PATCH] Fix bug for reschedule on opt-in bookings (#3678) * Fix bug for reschedule on opt-in bookings * Fix a missing query parameter being removed when changing month, useRouterQuery * Added test for rescheduling user type condition * Fix conditional that triggers input disabling when rescheduling Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Bailey Pumfleet --- .../booking/pages/AvailabilityPage.tsx | 6 ++- .../components/booking/pages/BookingPage.tsx | 26 +++++++++--- apps/web/pages/api/book/event.ts | 15 ++++++- apps/web/playwright/fixtures/users.ts | 13 ++++++ apps/web/playwright/reschedule.test.ts | 42 ++++++++++++++++++- .../core/builders/CalendarEvent/builder.ts | 2 +- 6 files changed, 93 insertions(+), 11 deletions(-) diff --git a/apps/web/components/booking/pages/AvailabilityPage.tsx b/apps/web/components/booking/pages/AvailabilityPage.tsx index 348d6c9b3c..e4d79fe18d 100644 --- a/apps/web/components/booking/pages/AvailabilityPage.tsx +++ b/apps/web/components/booking/pages/AvailabilityPage.tsx @@ -287,10 +287,14 @@ const dateQuerySchema = z.object({ const useRouterQuery = (name: T) => { const router = useRouter(); - const query = z.object({ [name]: z.string().optional() }).parse(router.query); + const existingQueryParams = router.asPath.split("?")[1]; + + const urlParams = new URLSearchParams(existingQueryParams); + const query = Object.fromEntries(urlParams); const setQuery = (newValue: string | number | null | undefined) => { router.replace({ query: { ...router.query, [name]: newValue } }, undefined, { shallow: true }); + router.replace({ query: { ...router.query, ...query, [name]: newValue } }, undefined, { shallow: true }); }; return { [name]: query[name], setQuery } as { diff --git a/apps/web/components/booking/pages/BookingPage.tsx b/apps/web/components/booking/pages/BookingPage.tsx index 97b1444121..438f0b3ccf 100644 --- a/apps/web/components/booking/pages/BookingPage.tsx +++ b/apps/web/components/booking/pages/BookingPage.tsx @@ -218,11 +218,25 @@ const BookingPage = ({ ? booking?.attendees.slice(1).map((attendee) => attendee.email) : []; + // There should only exists one default userData variable for primaryAttendee. + const defaultUserValues = { + email: booking?.attendees[0].email + ? booking.attendees[0].email + : router.query.email + ? (router.query.email as string) + : "", + name: booking?.attendees[0].name + ? booking.attendees[0].name + : router.query.name + ? (router.query.name as string) + : "", + }; + const defaultValues = () => { if (!rescheduleUid) { return { - name: (router.query.name as string) || (!loggedInIsOwner && session?.user?.name) || "", - email: (router.query.email as string) || (!loggedInIsOwner && session?.user?.email) || "", + name: defaultUserValues.name || (!loggedInIsOwner && session?.user?.name) || "", + email: defaultUserValues.email || (!loggedInIsOwner && session?.user?.email) || "", notes: (router.query.notes as string) || "", guests: ensureArray(router.query.guest) as string[], customInputs: eventType.customInputs.reduce( @@ -244,8 +258,8 @@ const BookingPage = ({ const customInputType = booking.customInputs; return { - name: primaryAttendee.name || "", - email: primaryAttendee.email || "", + name: defaultUserValues.name, + email: defaultUserValues.email || "", guests: guestListEmails, notes: booking.description || "", rescheduleReason: "", @@ -428,7 +442,8 @@ const BookingPage = ({ } }; - const disableInput = !!rescheduleUid; + // Should be disabled when rescheduleUid is present and data was found in defaultUserValues name/email fields. + const disableInput = !!rescheduleUid && !!defaultUserValues.email && !!defaultUserValues.name; const disabledExceptForOwner = disableInput && !loggedInIsOwner; const inputClassName = "focus:border-brand block w-full rounded-sm border-gray-300 focus:ring-black disabled:bg-gray-200 disabled:hover:cursor-not-allowed dark:border-gray-900 dark:bg-gray-700 dark:text-white dark:selection:bg-green-500 disabled:dark:text-gray-500 text-sm"; @@ -859,7 +874,6 @@ const BookingPage = ({ rows={3} className={inputClassName} placeholder={t("reschedule_placeholder")} - disabled={disabledExceptForOwner} /> ) : (