From 00f7d8be0def9540368d686482a9e80bd8b2e12b Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Tue, 7 Jan 2025 06:37:17 -0500 Subject: [PATCH] feat: bookings - render layout only once (#18490) --- apps/web/app/bookings/[status]/page.tsx | 5 +- apps/web/app/bookings/layout.tsx | 5 + .../bookings/views/bookings-listing-view.tsx | 197 +++++++++--------- 3 files changed, 110 insertions(+), 97 deletions(-) create mode 100644 apps/web/app/bookings/layout.tsx diff --git a/apps/web/app/bookings/[status]/page.tsx b/apps/web/app/bookings/[status]/page.tsx index 6e859d38ca..d7e7577ff6 100644 --- a/apps/web/app/bookings/[status]/page.tsx +++ b/apps/web/app/bookings/[status]/page.tsx @@ -1,6 +1,5 @@ import type { PageProps } from "app/_types"; import { _generateMetadata } from "app/_utils"; -import { WithLayout } from "app/layoutHOC"; import { redirect } from "next/navigation"; import { z } from "zod"; @@ -21,7 +20,7 @@ export const generateStaticParams = async () => { return validStatuses.map((status) => ({ status })); }; -const Page = async ({ params, searchParams }: PageProps) => { +const Page = ({ params, searchParams }: PageProps) => { const parsed = querySchema.safeParse({ ...params, ...searchParams }); if (!parsed.success) { redirect("/bookings/upcoming"); @@ -30,4 +29,4 @@ const Page = async ({ params, searchParams }: PageProps) => { return ; }; -export default WithLayout({ ServerPage: Page })<"P">; +export default Page; diff --git a/apps/web/app/bookings/layout.tsx b/apps/web/app/bookings/layout.tsx new file mode 100644 index 0000000000..9f179fdea9 --- /dev/null +++ b/apps/web/app/bookings/layout.tsx @@ -0,0 +1,5 @@ +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "~/bookings/views/bookings-listing-view"; + +export default WithLayout({ getLayout }); diff --git a/apps/web/modules/bookings/views/bookings-listing-view.tsx b/apps/web/modules/bookings/views/bookings-listing-view.tsx index 3cb024ffa0..cf8d8a702c 100644 --- a/apps/web/modules/bookings/views/bookings-listing-view.tsx +++ b/apps/web/modules/bookings/views/bookings-listing-view.tsx @@ -1,7 +1,7 @@ "use client"; import { useAutoAnimate } from "@formkit/auto-animate/react"; -import { Fragment, useState } from "react"; +import { Fragment, ReactElement, useState } from "react"; import { z } from "zod"; import { WipeMyCalActionButton } from "@calcom/app-store/wipemycalother/components"; @@ -139,36 +139,59 @@ export default function Bookings({ status }: { status: (typeof validStatuses)[nu const [animationParentRef] = useAutoAnimate(); return ( - -
-
- - -
- -
-
- {query.status === "error" && ( - - )} - {(query.status === "pending" || query.isPaused) && } - {query.status === "success" && !isEmpty && ( - <> - {!!bookingsToday.length && status === "upcoming" && ( -
- -

{t("today")}

-
- - - - {bookingsToday.map((booking: BookingOutput) => ( +
+
+ + +
+ +
+
+ {query.status === "error" && ( + + )} + {(query.status === "pending" || query.isPaused) && } + {query.status === "success" && !isEmpty && ( + <> + {!!bookingsToday.length && status === "upcoming" && ( +
+ +

{t("today")}

+
+
+ + + {bookingsToday.map((booking: BookingOutput) => ( + + ))} + + +
+
+
+ )} +
+
+ + + {query.data.pages.map((page, index) => ( + + {page.bookings.filter(filterBookings).map((booking: BookingOutput) => { + const recurringInfo = page.recurringInfo.find( + (info) => info.recurringEventId === booking.recurringEventId + ); + return ( - ))} - - -
-
-
- )} -
-
- - - {query.data.pages.map((page, index) => ( - - {page.bookings.filter(filterBookings).map((booking: BookingOutput) => { - const recurringInfo = page.recurringInfo.find( - (info) => info.recurringEventId === booking.recurringEventId - ); - return ( - - ); - })} - - ))} - -
-
-
- -
+ ); + })} + + ))} + + +
+
+
- - )} - {query.status === "success" && isEmpty && ( -
-
- )} -
-
-
+ + )} + {query.status === "success" && isEmpty && ( +
+ +
+ )} + + + + ); +} + +function BookingsStatusLayout({ children }: { children: React.ReactNode }) { + const { t } = useLocale(); + return ( + + {children} ); } + +export const getLayout = (page: ReactElement) => {page};