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;
+};