From 64e6e1a19ae386fa9778d6f3e877c3f763055008 Mon Sep 17 00:00:00 2001 From: Leo Giovanetti Date: Thu, 10 Aug 2023 18:00:46 -0300 Subject: [PATCH] fix: multiple duration getSchedule calls [CAL-2336] (#10709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Omar López --- apps/web/pages/[user]/[type].tsx | 22 ++++++++++++++++--- apps/web/pages/d/[link]/[slug].tsx | 11 ++++++++-- apps/web/pages/team/[slug]/[type].tsx | 21 +++++++++++++++--- packages/features/bookings/Booker/Booker.tsx | 3 ++- packages/features/bookings/Booker/types.ts | 6 +++++ packages/features/bookings/lib/get-booking.ts | 10 +++++++++ 6 files changed, 64 insertions(+), 9 deletions(-) diff --git a/apps/web/pages/[user]/[type].tsx b/apps/web/pages/[user]/[type].tsx index a19526f462..4f3d96c2b1 100644 --- a/apps/web/pages/[user]/[type].tsx +++ b/apps/web/pages/[user]/[type].tsx @@ -4,7 +4,11 @@ import { z } from "zod"; import { Booker } from "@calcom/atoms"; import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses"; import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo"; -import { getBookingForReschedule, getBookingForSeatedEvent } from "@calcom/features/bookings/lib/get-booking"; +import { + getBookingForReschedule, + getBookingForSeatedEvent, + getMultipleDurationValue, +} from "@calcom/features/bookings/lib/get-booking"; import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking"; import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains"; import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; @@ -28,6 +32,7 @@ export default function Type({ isBrandingHidden, rescheduleUid, entity, + duration, }: PageProps) { return (
@@ -45,6 +50,7 @@ export default function Type({ isAway={away} hideBranding={isBrandingHidden} entity={entity} + duration={duration} />
); @@ -55,7 +61,7 @@ Type.PageWrapper = PageWrapper; async function getDynamicGroupPageProps(context: GetServerSidePropsContext) { const { user: usernames, type: slug } = paramsSchema.parse(context.params); - const { rescheduleUid, bookingUid } = context.query; + const { rescheduleUid, bookingUid, duration: queryDuration } = context.query; const { ssrInit } = await import("@server/lib/ssr"); const ssr = await ssrInit(context); @@ -111,6 +117,11 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) { return { props: { entity: eventData.entity, + duration: getMultipleDurationValue( + eventData.metadata?.multipleDuration, + queryDuration, + eventData.length + ), booking, user: usernames.join("+"), slug, @@ -127,7 +138,7 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) { async function getUserPageProps(context: GetServerSidePropsContext) { const { user: usernames, type: slug } = paramsSchema.parse(context.params); const username = usernames[0]; - const { rescheduleUid, bookingUid } = context.query; + const { rescheduleUid, bookingUid, duration: queryDuration } = context.query; const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig( context.req.headers.host ?? "", context.params?.orgSlug @@ -177,6 +188,11 @@ async function getUserPageProps(context: GetServerSidePropsContext) { return { props: { booking, + duration: getMultipleDurationValue( + eventData.metadata?.multipleDuration, + queryDuration, + eventData.length + ), away: user?.away, user: username, slug, diff --git a/apps/web/pages/d/[link]/[slug].tsx b/apps/web/pages/d/[link]/[slug].tsx index 7a7b938158..f70f0b6a34 100644 --- a/apps/web/pages/d/[link]/[slug].tsx +++ b/apps/web/pages/d/[link]/[slug].tsx @@ -4,7 +4,7 @@ import { z } from "zod"; import { Booker } from "@calcom/atoms"; import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses"; import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo"; -import { getBookingForReschedule } from "@calcom/features/bookings/lib/get-booking"; +import { getBookingForReschedule, getMultipleDurationValue } from "@calcom/features/bookings/lib/get-booking"; import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking"; import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; import slugify from "@calcom/lib/slugify"; @@ -26,6 +26,7 @@ export default function Type({ isBrandingHidden, isTeamEvent, entity, + duration, }: PageProps) { return (
@@ -44,6 +45,7 @@ export default function Type({ hideBranding={isBrandingHidden} isTeamEvent={isTeamEvent} entity={entity} + duration={duration} />
); @@ -54,7 +56,7 @@ Type.isBookingPage = true; async function getUserPageProps(context: GetServerSidePropsContext) { const { link, slug } = paramsSchema.parse(context.params); - const { rescheduleUid } = context.query; + const { rescheduleUid, duration: queryDuration } = context.query; const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? ""); const org = isValidOrgDomain ? currentOrgDomain : null; @@ -133,6 +135,11 @@ async function getUserPageProps(context: GetServerSidePropsContext) { return { props: { entity: eventData.entity, + duration: getMultipleDurationValue( + eventData.metadata?.multipleDuration, + queryDuration, + eventData.length + ), booking, away: user?.away, user: username, diff --git a/apps/web/pages/team/[slug]/[type].tsx b/apps/web/pages/team/[slug]/[type].tsx index 2e139ee760..c94247646e 100644 --- a/apps/web/pages/team/[slug]/[type].tsx +++ b/apps/web/pages/team/[slug]/[type].tsx @@ -4,7 +4,7 @@ import { z } from "zod"; import { Booker } from "@calcom/atoms"; import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses"; import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo"; -import { getBookingForReschedule } from "@calcom/features/bookings/lib/get-booking"; +import { getBookingForReschedule, getMultipleDurationValue } from "@calcom/features/bookings/lib/get-booking"; import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking"; import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains"; import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains"; @@ -18,7 +18,16 @@ import PageWrapper from "@components/PageWrapper"; export type PageProps = inferSSRProps & EmbedProps; -export default function Type({ slug, user, booking, away, isEmbed, isBrandingHidden, entity }: PageProps) { +export default function Type({ + slug, + user, + booking, + away, + isEmbed, + isBrandingHidden, + entity, + duration, +}: PageProps) { return (
); @@ -55,7 +65,7 @@ const paramsSchema = z.object({ // 2. If rescheduling, get the booking details export const getServerSideProps = async (context: GetServerSidePropsContext) => { const { slug: teamSlug, type: meetingSlug } = paramsSchema.parse(context.params); - const { rescheduleUid } = context.query; + const { rescheduleUid, duration: queryDuration } = context.query; const { ssrInit } = await import("@server/lib/ssr"); const ssr = await ssrInit(context); const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig( @@ -104,6 +114,11 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => return { props: { entity: eventData.entity, + duration: getMultipleDurationValue( + eventData.metadata?.multipleDuration, + queryDuration, + eventData.length + ), booking, away: false, user: teamSlug, diff --git a/packages/features/bookings/Booker/Booker.tsx b/packages/features/bookings/Booker/Booker.tsx index e424f16a37..155149ab5b 100644 --- a/packages/features/bookings/Booker/Booker.tsx +++ b/packages/features/bookings/Booker/Booker.tsx @@ -40,6 +40,7 @@ const BookerComponent = ({ hideBranding = false, isTeamEvent, entity, + duration, }: BookerProps) => { /** * Prioritize dateSchedule load @@ -50,7 +51,7 @@ const BookerComponent = ({ username, eventSlug, month, - duration: undefined, + duration, }); const isMobile = useMediaQuery("(max-width: 768px)"); const isTablet = useMediaQuery("(max-width: 1024px)"); diff --git a/packages/features/bookings/Booker/types.ts b/packages/features/bookings/Booker/types.ts index 895eac3ca3..dbbf9ec5c4 100644 --- a/packages/features/bookings/Booker/types.ts +++ b/packages/features/bookings/Booker/types.ts @@ -58,6 +58,12 @@ export interface BookerProps { * that will always result in the user event being returned. */ isTeamEvent?: boolean; + /** + * Refers to a multiple-duration event-type + * It will correspond to selected time from duration query param if exists and if it is allowed as an option, + * otherwise, the default value is selected + */ + duration?: number | null; } export type BookerState = "loading" | "selecting_date" | "selecting_time" | "booking"; diff --git a/packages/features/bookings/lib/get-booking.ts b/packages/features/bookings/lib/get-booking.ts index de59f57c26..b157b07fe2 100644 --- a/packages/features/bookings/lib/get-booking.ts +++ b/packages/features/bookings/lib/get-booking.ts @@ -224,3 +224,13 @@ export const getBookingForSeatedEvent = async (uid: string) => { }; return result; }; + +export const getMultipleDurationValue = ( + multipleDurationConfig: number[] | undefined, + queryDuration: string | string[] | undefined, + defaultValue: number +) => { + if (!multipleDurationConfig) return null; + if (multipleDurationConfig.includes(Number(queryDuration))) return Number(queryDuration); + return defaultValue; +};