From 8ec178debdb9c095382d21bc0c743a72c77cdbd8 Mon Sep 17 00:00:00 2001 From: Jeroen Reumkens Date: Tue, 16 May 2023 22:34:15 +0200 Subject: [PATCH] CAL-1591: Remember form values in new booker form when user navigates back and forth between timeslots and form (#8920) --- .../BookEventForm/BookEventForm.tsx | 21 +++++++++++++++++-- packages/features/bookings/Booker/store.ts | 11 ++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx b/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx index bd0917e4e0..8c5f00a71d 100644 --- a/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx +++ b/packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx @@ -70,11 +70,15 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => { const timeslot = useBookerStore((state) => state.selectedTimeslot); const recurringEventCount = useBookerStore((state) => state.recurringEventCount); const username = useBookerStore((state) => state.username); + const formValues = useBookerStore((state) => state.formValues); + const setFormValues = useBookerStore((state) => state.setFormValues); const isRescheduling = !!rescheduleUid && !!rescheduleBooking; const event = useEvent(); const eventType = event.data; const defaultValues = useMemo(() => { + if (Object.keys(formValues).length) return formValues; + if (!eventType?.bookingFields) { return {}; } @@ -128,7 +132,7 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => { email: defaultUserValues.email, }; return defaults; - }, [eventType?.bookingFields, isRescheduling, rescheduleBooking, rescheduleUid]); + }, [eventType?.bookingFields, formValues, isRescheduling, rescheduleBooking, rescheduleUid]); const bookingFormSchema = z .object({ @@ -226,6 +230,8 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => { ); const bookEvent = (values: BookingFormValues) => { + // Clears form values stored in store, so old values won't stick around. + setFormValues({}); bookingForm.clearErrors(); // It shouldn't be possible that this method is fired without having event data, @@ -280,7 +286,18 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => { return (
-
+ { + // Form data is saved in store. This way when user navigates back to + // still change the timeslot, and comes back to the form, all their values + // still exist. This gets cleared when the form is submitted. + const values = bookingForm.getValues(); + setFormValues(values); + }} + form={bookingForm} + handleSubmit={bookEvent} + noValidate> -1)} fields={eventType.bookingFields} diff --git a/packages/features/bookings/Booker/store.ts b/packages/features/bookings/Booker/store.ts index ba84ced3ca..44143327db 100644 --- a/packages/features/bookings/Booker/store.ts +++ b/packages/features/bookings/Booker/store.ts @@ -79,6 +79,13 @@ type BookerStore = { * Method called by booker component to set initial data. */ initialize: (data: StoreInitializeType) => void; + /** + * Stored form state, used when user navigates back and + * forth between timeslots and form. Get's cleared on submit + * to prevent sticky data. + */ + formValues: Record; + setFormValues: (values: Record) => void; }; const validLayouts: BookerLayout[] = ["large_calendar", "large_timeslots", "small_calendar"]; @@ -179,6 +186,10 @@ export const useBookerStore = create((set, get) => ({ set({ selectedTimeslot }); updateQueryParam("slot", selectedTimeslot ?? ""); }, + formValues: {}, + setFormValues: (formValues: Record) => { + set({ formValues }); + }, })); export const useInitializeBookerStore = ({