From 53b202790e356b76991d1c616fa65530b826fcf4 Mon Sep 17 00:00:00 2001 From: Agusti Fernandez Date: Tue, 15 Mar 2022 15:39:20 +0100 Subject: [PATCH] Feature: pre-fill name and email if user loggedIn in booking page (#2131) * feat: pre-fill name and email if user loggedIn in booking page * feat: add name to next-auth autoMergeIdentiteies response * fix: Update booking page so if you're in your own booking, it doesn't prefill Co-authored-by: Agusti Fernandez Pardo Co-authored-by: Peer Richelsen Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- apps/api | 2 +- .../components/booking/pages/BookingPage.tsx | 76 +++++++++---------- apps/web/pages/api/auth/[...nextauth].tsx | 1 + apps/website | 2 +- 4 files changed, 40 insertions(+), 41 deletions(-) diff --git a/apps/api b/apps/api index 378cbf8f..63e0ca33 160000 --- a/apps/api +++ b/apps/api @@ -1 +1 @@ -Subproject commit 378cbf8f3a67ea7877296f1da02edb2b6e3efbce +Subproject commit 63e0ca33e95583a5e2aae69195af052fd0d9aef8 diff --git a/apps/web/components/booking/pages/BookingPage.tsx b/apps/web/components/booking/pages/BookingPage.tsx index 7c72be9c..30cab5dc 100644 --- a/apps/web/components/booking/pages/BookingPage.tsx +++ b/apps/web/components/booking/pages/BookingPage.tsx @@ -2,6 +2,7 @@ import { CalendarIcon, ClockIcon, CreditCardIcon, ExclamationIcon } from "@heroi import { EventTypeCustomInputType } from "@prisma/client"; import { useContracts } from "contexts/contractsContext"; import dayjs from "dayjs"; +import { useSession } from "next-auth/react"; import dynamic from "next/dynamic"; import Head from "next/head"; import { useRouter } from "next/router"; @@ -51,12 +52,11 @@ type BookingFormValues = { }; }; -const BookingPage = (props: BookingPageProps) => { +const BookingPage = ({ eventType, booking, profile }: BookingPageProps) => { const { t, i18n } = useLocale(); const router = useRouter(); const { contracts } = useContracts(); - const { eventType } = props; - + const { data: session } = useSession(); useEffect(() => { if (eventType.metadata.smartContractAddress) { const eventOwner = eventType.users[0]; @@ -95,8 +95,8 @@ const BookingPage = (props: BookingPageProps) => { pathname: "/success", query: { date, - type: props.eventType.id, - user: props.profile.slug, + type: eventType.id, + user: profile.slug, reschedule: !!rescheduleUid, name: attendees[0].name, email: attendees[0].email, @@ -107,18 +107,18 @@ const BookingPage = (props: BookingPageProps) => { }); const rescheduleUid = router.query.rescheduleUid as string; - const { isReady, Theme } = useTheme(props.profile.theme); + const { isReady, Theme } = useTheme(profile.theme); const date = asStringOrNull(router.query.date); - const [guestToggle, setGuestToggle] = useState(props.booking && props.booking.attendees.length > 1); + const [guestToggle, setGuestToggle] = useState(booking && booking.attendees.length > 1); - const eventTypeDetail = { isWeb3Active: false, ...props.eventType }; + const eventTypeDetail = { isWeb3Active: false, ...eventType }; type Location = { type: LocationType; address?: string }; // it would be nice if Prisma at some point in the future allowed for Json; as of now this is not the case. const locations: Location[] = useMemo( - () => (props.eventType.locations as Location[]) || [], - [props.eventType.locations] + () => (eventType.locations as Location[]) || [], + [eventType.locations] ); useEffect(() => { @@ -142,15 +142,15 @@ const BookingPage = (props: BookingPageProps) => { [LocationType.Huddle01]: "Huddle01 Video", [LocationType.Tandem]: "Tandem Video", }; - + const loggedInIsOwner = eventType.users[0].name === session?.user.name; const defaultValues = () => { if (!rescheduleUid) { return { - name: (router.query.name as string) || "", - email: (router.query.email as string) || "", + name: loggedInIsOwner ? "" : session?.user?.name || (router.query.name as string) || "", + email: loggedInIsOwner ? "" : session?.user?.email || (router.query.email as string) || "", notes: (router.query.notes as string) || "", guests: ensureArray(router.query.guest) as string[], - customInputs: props.eventType.customInputs.reduce( + customInputs: eventType.customInputs.reduce( (customInputs, input) => ({ ...customInputs, [input.id]: router.query[slugify(input.label)], @@ -159,17 +159,17 @@ const BookingPage = (props: BookingPageProps) => { ), }; } - if (!props.booking || !props.booking.attendees.length) { + if (!booking || !booking.attendees.length) { return {}; } - const primaryAttendee = props.booking.attendees[0]; + const primaryAttendee = booking.attendees[0]; if (!primaryAttendee) { return {}; } return { name: primaryAttendee.name || "", email: primaryAttendee.email || "", - guests: props.booking.attendees.slice(1).map((attendee) => attendee.email), + guests: booking.attendees.slice(1).map((attendee) => attendee.email), }; }; @@ -245,8 +245,8 @@ const BookingPage = (props: BookingPageProps) => { ...booking, web3Details, start: dayjs(date).format(), - end: dayjs(date).add(props.eventType.length, "minute").format(), - eventTypeId: props.eventType.id, + end: dayjs(date).add(eventType.length, "minute").format(), + eventTypeId: eventType.id, timeZone: timeZone(), language: i18n.language, rescheduleUid, @@ -256,7 +256,7 @@ const BookingPage = (props: BookingPageProps) => { ), metadata, customInputs: Object.keys(booking.customInputs || {}).map((inputId) => ({ - label: props.eventType.customInputs.find((input) => input.id === parseInt(inputId))!.label, + label: eventType.customInputs.find((input) => input.id === parseInt(inputId))!.label, value: booking.customInputs![inputId], })), }); @@ -269,18 +269,18 @@ const BookingPage = (props: BookingPageProps) => { {rescheduleUid ? t("booking_reschedule_confirmation", { - eventTypeTitle: props.eventType.title, - profileName: props.profile.name, + eventTypeTitle: eventType.title, + profileName: profile.name, }) : t("booking_confirmation", { - eventTypeTitle: props.eventType.title, - profileName: props.profile.name, + eventTypeTitle: eventType.title, + profileName: profile.name, })}{" "} | Cal.com - +
{isReady && (
@@ -289,33 +289,31 @@ const BookingPage = (props: BookingPageProps) => { user.name !== props.profile.name) + items={[{ image: profile.image || "", alt: profile.name || "" }].concat( + eventType.users + .filter((user) => user.name !== profile.name) .map((user) => ({ image: user.avatar || "", alt: user.name || "", })) )} /> -

- {props.profile.name} -

+

{profile.name}

- {props.eventType.title} + {eventType.title}

- {props.eventType.length} {t("minutes")} + {eventType.length} {t("minutes")}

- {props.eventType.price > 0 && ( + {eventType.price > 0 && (

@@ -329,7 +327,7 @@ const BookingPage = (props: BookingPageProps) => { {t("requires_ownership_of_a_token") + " " + eventType.metadata.smartContractAddress}

)} -

{props.eventType.description}

+

{eventType.description}

@@ -404,7 +402,7 @@ const BookingPage = (props: BookingPageProps) => {
)} - {props.eventType.customInputs + {eventType.customInputs .sort((a, b) => a.id - b.id) .map((input) => (
@@ -468,7 +466,7 @@ const BookingPage = (props: BookingPageProps) => { )}
))} - {!props.eventType.disableGuests && ( + {!eventType.disableGuests && (
{!guestToggle && (