diff --git a/apps/web/app/_types.ts b/apps/web/app/_types.ts index 91f01306f4..0e6ce75a13 100644 --- a/apps/web/app/_types.ts +++ b/apps/web/app/_types.ts @@ -1,3 +1,14 @@ export type Params = { [param: string]: string | string[] | undefined; }; + +export type SearchParams = { + [param: string]: string | string[] | undefined; +}; + +export type PageProps = { + params: Params; + searchParams: SearchParams; +}; + +export type LayoutProps = { params: Params; children: React.ReactElement }; diff --git a/apps/web/app/future/(individual-page-wrapper)/apps/[slug]/layout.tsx b/apps/web/app/future/(individual-page-wrapper)/apps/[slug]/layout.tsx deleted file mode 100644 index 918ae3fa16..0000000000 --- a/apps/web/app/future/(individual-page-wrapper)/apps/[slug]/layout.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { type ReactElement } from "react"; - -import PageWrapper from "@components/PageWrapperAppDir"; - -type EventTypesLayoutProps = { - children: ReactElement; -}; - -export default function Layout({ children }: EventTypesLayoutProps) { - return ( - - {children} - - ); -} diff --git a/apps/web/app/future/(individual-page-wrapper)/apps/installed/[category]/layout.tsx b/apps/web/app/future/(individual-page-wrapper)/apps/installed/[category]/layout.tsx deleted file mode 100644 index 918ae3fa16..0000000000 --- a/apps/web/app/future/(individual-page-wrapper)/apps/installed/[category]/layout.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { type ReactElement } from "react"; - -import PageWrapper from "@components/PageWrapperAppDir"; - -type EventTypesLayoutProps = { - children: ReactElement; -}; - -export default function Layout({ children }: EventTypesLayoutProps) { - return ( - - {children} - - ); -} diff --git a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/layout.tsx b/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/layout.tsx deleted file mode 100644 index ef7d2abdf2..0000000000 --- a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/layout.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { headers } from "next/headers"; -import { type ReactElement } from "react"; - -import PageWrapper from "@components/PageWrapperAppDir"; -import { getLayout } from "@components/auth/layouts/AdminLayoutAppDir"; - -type WrapperWithLayoutProps = { - children: ReactElement; -}; - -export default async function WrapperWithLayout({ children }: WrapperWithLayoutProps) { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - return ( - - {children} - - ); -} diff --git a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/oAuth/page.tsx b/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/oAuth/page.tsx deleted file mode 100644 index 61cb362dba..0000000000 --- a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/oAuth/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import Page from "@pages/settings/admin/oAuth/index"; -import { _generateMetadata } from "app/_utils"; - -export const generateMetadata = async () => - await _generateMetadata( - () => "OAuth", - () => "Add new OAuth Clients" - ); - -export default Page; diff --git a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/page.tsx b/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/page.tsx deleted file mode 100644 index a45fe0a58d..0000000000 --- a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import Page from "@pages/settings/admin/index"; -import { _generateMetadata } from "app/_utils"; - -export const generateMetadata = async () => - await _generateMetadata( - () => "Admin", - () => "admin_description" - ); - -export default Page; diff --git a/apps/web/app/future/(shared-page-wrapper)/(layout)/layout.tsx b/apps/web/app/future/(shared-page-wrapper)/(layout)/layout.tsx deleted file mode 100644 index 7d78c3b422..0000000000 --- a/apps/web/app/future/(shared-page-wrapper)/(layout)/layout.tsx +++ /dev/null @@ -1,22 +0,0 @@ -// pages without layout (e.g., /availability/index.tsx) are supposed to go under (layout) folder -import { headers } from "next/headers"; -import { type ReactElement } from "react"; - -import { getLayout } from "@calcom/features/MainLayoutAppDir"; - -import PageWrapper from "@components/PageWrapperAppDir"; - -type WrapperWithLayoutProps = { - children: ReactElement; -}; - -export default async function WrapperWithLayout({ children }: WrapperWithLayoutProps) { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - return ( - - {children} - - ); -} diff --git a/apps/web/app/future/(shared-page-wrapper)/(no-layout)/layout.tsx b/apps/web/app/future/(shared-page-wrapper)/(no-layout)/layout.tsx deleted file mode 100644 index c079ba0ad8..0000000000 --- a/apps/web/app/future/(shared-page-wrapper)/(no-layout)/layout.tsx +++ /dev/null @@ -1,20 +0,0 @@ -// pages containing layout (e.g., /availability/[schedule].tsx) are supposed to go under (no-layout) folder -import { headers } from "next/headers"; -import { type ReactElement } from "react"; - -import PageWrapper from "@components/PageWrapperAppDir"; - -type WrapperWithoutLayoutProps = { - children: ReactElement; -}; - -export default async function WrapperWithoutLayout({ children }: WrapperWithoutLayoutProps) { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - return ( - - {children} - - ); -} diff --git a/apps/web/app/future/(shared-page-wrapper)/(no-layout)/video/no-meeting-found/page.tsx b/apps/web/app/future/(shared-page-wrapper)/(no-layout)/video/no-meeting-found/page.tsx deleted file mode 100644 index df1af7a215..0000000000 --- a/apps/web/app/future/(shared-page-wrapper)/(no-layout)/video/no-meeting-found/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import Page from "@pages/video/no-meeting-found"; -import { _generateMetadata } from "app/_utils"; - -export const generateMetadata = async () => - await _generateMetadata( - () => "", - () => "" - ); - -export default Page; diff --git a/apps/web/app/future/(shared-page-wrapper)/(settings-layout)/layout.tsx b/apps/web/app/future/(shared-page-wrapper)/(settings-layout)/layout.tsx deleted file mode 100644 index 2cb530db21..0000000000 --- a/apps/web/app/future/(shared-page-wrapper)/(settings-layout)/layout.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { headers } from "next/headers"; -import { type ReactElement } from "react"; - -import { getLayout } from "@calcom/features/settings/layouts/SettingsLayoutAppDir"; - -import PageWrapper from "@components/PageWrapperAppDir"; - -type WrapperWithLayoutProps = { - children: ReactElement; -}; - -export default async function WrapperWithLayout({ children }: WrapperWithLayoutProps) { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - return ( - - {children} - - ); -} diff --git a/apps/web/app/future/apps/[slug]/layout.tsx b/apps/web/app/future/apps/[slug]/layout.tsx new file mode 100644 index 0000000000..dc2fb3468f --- /dev/null +++ b/apps/web/app/future/apps/[slug]/layout.tsx @@ -0,0 +1,3 @@ +import { WithLayout } from "app/layoutHOC"; + +export default WithLayout({ getLayout: null })<"L">; diff --git a/apps/web/app/future/(individual-page-wrapper)/apps/[slug]/page.tsx b/apps/web/app/future/apps/[slug]/page.tsx similarity index 100% rename from apps/web/app/future/(individual-page-wrapper)/apps/[slug]/page.tsx rename to apps/web/app/future/apps/[slug]/page.tsx diff --git a/apps/web/app/future/(individual-page-wrapper)/apps/[slug]/setup/page.tsx b/apps/web/app/future/apps/[slug]/setup/page.tsx similarity index 100% rename from apps/web/app/future/(individual-page-wrapper)/apps/[slug]/setup/page.tsx rename to apps/web/app/future/apps/[slug]/setup/page.tsx diff --git a/apps/web/app/future/(individual-page-wrapper)/apps/categories/[category]/page.tsx b/apps/web/app/future/apps/categories/[category]/page.tsx similarity index 81% rename from apps/web/app/future/(individual-page-wrapper)/apps/categories/[category]/page.tsx rename to apps/web/app/future/apps/categories/[category]/page.tsx index b58e845d83..a4d8532821 100644 --- a/apps/web/app/future/(individual-page-wrapper)/apps/categories/[category]/page.tsx +++ b/apps/web/app/future/apps/categories/[category]/page.tsx @@ -1,6 +1,7 @@ import CategoryPage from "@pages/apps/categories/[category]"; import { Prisma } from "@prisma/client"; import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; import { notFound } from "next/navigation"; import z from "zod"; @@ -9,8 +10,6 @@ import { APP_NAME } from "@calcom/lib/constants"; import prisma from "@calcom/prisma"; import { AppCategories } from "@calcom/prisma/enums"; -import PageWrapper from "@components/PageWrapperAppDir"; - export const generateMetadata = async () => { return await _generateMetadata( () => `${APP_NAME} | ${APP_NAME}`, @@ -67,13 +66,6 @@ const getPageProps = async ({ params }: { params: Record }) { - const { apps } = await getPageProps({ params }); - return ( - - - - ); -} - +// @ts-expect-error getData arg +export default WithLayout({ getData: getPageProps, Page: CategoryPage })

; export const dynamic = "force-static"; diff --git a/apps/web/app/future/(individual-page-wrapper)/apps/categories/page.tsx b/apps/web/app/future/apps/categories/page.tsx similarity index 78% rename from apps/web/app/future/(individual-page-wrapper)/apps/categories/page.tsx rename to apps/web/app/future/apps/categories/page.tsx index c0d6c3d15e..c878d37732 100644 --- a/apps/web/app/future/(individual-page-wrapper)/apps/categories/page.tsx +++ b/apps/web/app/future/apps/categories/page.tsx @@ -1,14 +1,13 @@ import LegacyPage from "@pages/apps/categories/index"; import { ssrInit } from "app/_trpc/ssrInit"; import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; import { cookies, headers } from "next/headers"; import { getAppRegistry, getAppRegistryWithCredentials } from "@calcom/app-store/_appRegistry"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { APP_NAME } from "@calcom/lib/constants"; -import PageWrapper from "@components/PageWrapperAppDir"; - export const generateMetadata = async () => { return await _generateMetadata( () => `Categories | ${APP_NAME}`, @@ -43,14 +42,4 @@ async function getPageProps() { }; } -export default async function Page() { - const props = await getPageProps(); - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - return ( - - - - ); -} +export default WithLayout({ getData: getPageProps, Page: LegacyPage, getLayout: null })<"P">; diff --git a/apps/web/app/future/apps/installed/[category]/layout.tsx b/apps/web/app/future/apps/installed/[category]/layout.tsx new file mode 100644 index 0000000000..dc2fb3468f --- /dev/null +++ b/apps/web/app/future/apps/installed/[category]/layout.tsx @@ -0,0 +1,3 @@ +import { WithLayout } from "app/layoutHOC"; + +export default WithLayout({ getLayout: null })<"L">; diff --git a/apps/web/app/future/(individual-page-wrapper)/apps/installed/[category]/page.tsx b/apps/web/app/future/apps/installed/[category]/page.tsx similarity index 100% rename from apps/web/app/future/(individual-page-wrapper)/apps/installed/[category]/page.tsx rename to apps/web/app/future/apps/installed/[category]/page.tsx diff --git a/apps/web/app/future/(individual-page-wrapper)/bookings/[status]/layout.tsx b/apps/web/app/future/bookings/[status]/layout.tsx similarity index 77% rename from apps/web/app/future/(individual-page-wrapper)/bookings/[status]/layout.tsx rename to apps/web/app/future/bookings/[status]/layout.tsx index ad00ceeb78..7391f9996f 100644 --- a/apps/web/app/future/(individual-page-wrapper)/bookings/[status]/layout.tsx +++ b/apps/web/app/future/bookings/[status]/layout.tsx @@ -1,6 +1,7 @@ import { ssgInit } from "app/_trpc/ssgInit"; import type { Params } from "app/_types"; import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; import { notFound } from "next/navigation"; import type { ReactElement } from "react"; import { z } from "zod"; @@ -8,8 +9,6 @@ import { z } from "zod"; import { getLayout } from "@calcom/features/MainLayoutAppDir"; import { APP_NAME } from "@calcom/lib/constants"; -import PageWrapper from "@components/PageWrapperAppDir"; - const validStatuses = ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] as const; const querySchema = z.object({ @@ -43,14 +42,6 @@ const getData = async ({ params }: { params: Params }) => { }; }; -export default async function BookingPageLayout({ params, children }: Props) { - const props = await getData({ params }); - - return ( - - {children} - - ); -} +export default WithLayout({ getLayout, getData })<"L">; export const dynamic = "force-static"; diff --git a/apps/web/app/future/(individual-page-wrapper)/bookings/[status]/page.tsx b/apps/web/app/future/bookings/[status]/page.tsx similarity index 100% rename from apps/web/app/future/(individual-page-wrapper)/bookings/[status]/page.tsx rename to apps/web/app/future/bookings/[status]/page.tsx diff --git a/apps/web/app/future/event-types/layout.tsx b/apps/web/app/future/event-types/layout.tsx new file mode 100644 index 0000000000..9bf51a70f5 --- /dev/null +++ b/apps/web/app/future/event-types/layout.tsx @@ -0,0 +1,5 @@ +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@calcom/features/MainLayoutAppDir"; + +export default WithLayout({ getLayout })<"L">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(layout)/event-types/page.tsx b/apps/web/app/future/event-types/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(layout)/event-types/page.tsx rename to apps/web/app/future/event-types/page.tsx diff --git a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/apps/[category]/page.tsx b/apps/web/app/future/settings/admin/apps/[category]/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/apps/[category]/page.tsx rename to apps/web/app/future/settings/admin/apps/[category]/page.tsx diff --git a/apps/web/app/future/settings/admin/apps/layout.tsx b/apps/web/app/future/settings/admin/apps/layout.tsx new file mode 100644 index 0000000000..f415bae764 --- /dev/null +++ b/apps/web/app/future/settings/admin/apps/layout.tsx @@ -0,0 +1,5 @@ +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@components/auth/layouts/AdminLayoutAppDir"; + +export default WithLayout({ getLayout })<"L">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/apps/page.tsx b/apps/web/app/future/settings/admin/apps/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/apps/page.tsx rename to apps/web/app/future/settings/admin/apps/page.tsx diff --git a/apps/web/app/future/settings/admin/flags/layout.tsx b/apps/web/app/future/settings/admin/flags/layout.tsx new file mode 100644 index 0000000000..f415bae764 --- /dev/null +++ b/apps/web/app/future/settings/admin/flags/layout.tsx @@ -0,0 +1,5 @@ +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@components/auth/layouts/AdminLayoutAppDir"; + +export default WithLayout({ getLayout })<"L">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/flags/page.tsx b/apps/web/app/future/settings/admin/flags/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/flags/page.tsx rename to apps/web/app/future/settings/admin/flags/page.tsx diff --git a/apps/web/app/future/settings/admin/impersonation/layout.tsx b/apps/web/app/future/settings/admin/impersonation/layout.tsx new file mode 100644 index 0000000000..f415bae764 --- /dev/null +++ b/apps/web/app/future/settings/admin/impersonation/layout.tsx @@ -0,0 +1,5 @@ +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@components/auth/layouts/AdminLayoutAppDir"; + +export default WithLayout({ getLayout })<"L">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/impersonation/page.tsx b/apps/web/app/future/settings/admin/impersonation/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(admin-layout)/settings/admin/impersonation/page.tsx rename to apps/web/app/future/settings/admin/impersonation/page.tsx diff --git a/apps/web/app/future/settings/admin/oAuth/oAuthView/layout.tsx b/apps/web/app/future/settings/admin/oAuth/oAuthView/layout.tsx new file mode 100644 index 0000000000..dc2fb3468f --- /dev/null +++ b/apps/web/app/future/settings/admin/oAuth/oAuthView/layout.tsx @@ -0,0 +1,3 @@ +import { WithLayout } from "app/layoutHOC"; + +export default WithLayout({ getLayout: null })<"L">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(no-layout)/settings/admin/oAuth/oAuthView/page.tsx b/apps/web/app/future/settings/admin/oAuth/oAuthView/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(no-layout)/settings/admin/oAuth/oAuthView/page.tsx rename to apps/web/app/future/settings/admin/oAuth/oAuthView/page.tsx diff --git a/apps/web/app/future/settings/admin/oAuth/page.tsx b/apps/web/app/future/settings/admin/oAuth/page.tsx new file mode 100644 index 0000000000..58a8a41dd6 --- /dev/null +++ b/apps/web/app/future/settings/admin/oAuth/page.tsx @@ -0,0 +1,13 @@ +import LegacyPage from "@pages/settings/admin/oAuth/index"; +import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@components/auth/layouts/AdminLayoutAppDir"; + +export const generateMetadata = async () => + await _generateMetadata( + () => "OAuth", + () => "Add new OAuth Clients" + ); + +export default WithLayout({ getLayout, Page: LegacyPage })<"P">; diff --git a/apps/web/app/future/settings/admin/organizations/layout.tsx b/apps/web/app/future/settings/admin/organizations/layout.tsx new file mode 100644 index 0000000000..1359b26601 --- /dev/null +++ b/apps/web/app/future/settings/admin/organizations/layout.tsx @@ -0,0 +1,5 @@ +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@calcom/features/settings/layouts/SettingsLayoutAppDir"; + +export default WithLayout({ getLayout })<"L">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/organizations/page.tsx b/apps/web/app/future/settings/admin/organizations/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/organizations/page.tsx rename to apps/web/app/future/settings/admin/organizations/page.tsx diff --git a/apps/web/app/future/settings/admin/page.tsx b/apps/web/app/future/settings/admin/page.tsx new file mode 100644 index 0000000000..cfc6e0aeec --- /dev/null +++ b/apps/web/app/future/settings/admin/page.tsx @@ -0,0 +1,13 @@ +import LegacyPage from "@pages/settings/admin/index"; +import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@components/auth/layouts/AdminLayoutAppDir"; + +export const generateMetadata = async () => + await _generateMetadata( + () => "Admin", + () => "admin_description" + ); + +export default WithLayout({ getLayout, Page: LegacyPage })<"P">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/users/[id]/edit/page.tsx b/apps/web/app/future/settings/admin/users/[id]/edit/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/users/[id]/edit/page.tsx rename to apps/web/app/future/settings/admin/users/[id]/edit/page.tsx diff --git a/apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/users/add/page.tsx b/apps/web/app/future/settings/admin/users/add/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/users/add/page.tsx rename to apps/web/app/future/settings/admin/users/add/page.tsx diff --git a/apps/web/app/future/settings/admin/users/layout.tsx b/apps/web/app/future/settings/admin/users/layout.tsx new file mode 100644 index 0000000000..1359b26601 --- /dev/null +++ b/apps/web/app/future/settings/admin/users/layout.tsx @@ -0,0 +1,5 @@ +import { WithLayout } from "app/layoutHOC"; + +import { getLayout } from "@calcom/features/settings/layouts/SettingsLayoutAppDir"; + +export default WithLayout({ getLayout })<"L">; diff --git a/apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/users/page.tsx b/apps/web/app/future/settings/admin/users/page.tsx similarity index 100% rename from apps/web/app/future/(shared-page-wrapper)/(settings-layout)/settings/admin/users/page.tsx rename to apps/web/app/future/settings/admin/users/page.tsx diff --git a/apps/web/app/future/(individual-page-wrapper)/teams/page.tsx b/apps/web/app/future/teams/page.tsx similarity index 56% rename from apps/web/app/future/(individual-page-wrapper)/teams/page.tsx rename to apps/web/app/future/teams/page.tsx index 18059f5b99..0f19dd1523 100644 --- a/apps/web/app/future/(individual-page-wrapper)/teams/page.tsx +++ b/apps/web/app/future/teams/page.tsx @@ -1,28 +1,19 @@ import OldPage from "@pages/teams/index"; import { ssrInit } from "app/_trpc/ssrInit"; -import { type Params } from "app/_types"; import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; import { type GetServerSidePropsContext } from "next"; -import { headers, cookies } from "next/headers"; import { redirect } from "next/navigation"; import { getLayout } from "@calcom/features/MainLayoutAppDir"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; -import { buildLegacyCtx } from "@lib/buildLegacyCtx"; - -import PageWrapper from "@components/PageWrapperAppDir"; - export const generateMetadata = async () => await _generateMetadata( (t) => t("teams"), (t) => t("create_manage_teams_collaborative") ); -type PageProps = { - params: Params; -}; - async function getData(context: Omit) { const ssr = await ssrInit(); await ssr.viewer.me.prefetch(); @@ -41,24 +32,5 @@ async function getData(context: Omit { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - const legacyCtx = buildLegacyCtx(h, cookies(), params); - // @ts-expect-error `req` of type '{ headers: ReadonlyHeaders; cookies: ReadonlyRequestCookies; }' is not assignable to `req` in `GetServerSidePropsContext` - const props = await getData(legacyCtx); - - return ( - - - - ); -}; - -export default Page; +// @ts-expect-error getData arg +export default WithLayout({ getData, getLayout, Page: OldPage })<"P">; diff --git a/apps/web/app/future/(individual-page-wrapper)/video/[uid]/page.tsx b/apps/web/app/future/video/[uid]/page.tsx similarity index 75% rename from apps/web/app/future/(individual-page-wrapper)/video/[uid]/page.tsx rename to apps/web/app/future/video/[uid]/page.tsx index e1e473ceec..b781376423 100644 --- a/apps/web/app/future/(individual-page-wrapper)/video/[uid]/page.tsx +++ b/apps/web/app/future/video/[uid]/page.tsx @@ -1,30 +1,21 @@ import OldPage from "@pages/video/[uid]"; import { ssrInit } from "app/_trpc/ssrInit"; -import { type Params } from "app/_types"; import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; import MarkdownIt from "markdown-it"; import { type GetServerSidePropsContext } from "next"; -import { headers, cookies } from "next/headers"; import { redirect } from "next/navigation"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { APP_NAME } from "@calcom/lib/constants"; import prisma, { bookingMinimalSelect } from "@calcom/prisma"; -import { buildLegacyCtx } from "@lib/buildLegacyCtx"; - -import PageWrapper from "@components/PageWrapperAppDir"; - export const generateMetadata = async () => await _generateMetadata( () => `${APP_NAME} Video`, (t) => t("quick_video_meeting") ); -type PageProps = Readonly<{ - params: Params; -}>; - const md = new MarkdownIt("default", { html: true, breaks: true, linkify: true }); async function getData(context: Omit) { @@ -107,24 +98,5 @@ async function getData(context: Omit { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - const legacyCtx = buildLegacyCtx(headers(), cookies(), params); - // @ts-expect-error `req` of type '{ headers: ReadonlyHeaders; cookies: ReadonlyRequestCookies; }' is not assignable to `req` in `GetServerSidePropsContext` - const { dehydratedState, ...restProps } = await getData(legacyCtx); - - return ( - - - - ); -}; - -export default Page; +// @ts-expect-error getData arg +export default WithLayout({ getData, Page: OldPage, getLayout: null })<"P">; diff --git a/apps/web/app/future/(individual-page-wrapper)/video/meeting-ended/[uid]/page.tsx b/apps/web/app/future/video/meeting-ended/[uid]/page.tsx similarity index 59% rename from apps/web/app/future/(individual-page-wrapper)/video/meeting-ended/[uid]/page.tsx rename to apps/web/app/future/video/meeting-ended/[uid]/page.tsx index d0456d3047..0674d39566 100644 --- a/apps/web/app/future/(individual-page-wrapper)/video/meeting-ended/[uid]/page.tsx +++ b/apps/web/app/future/video/meeting-ended/[uid]/page.tsx @@ -1,26 +1,17 @@ import OldPage from "@pages/video/meeting-ended/[uid]"; -import { type Params } from "app/_types"; import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; import { type GetServerSidePropsContext } from "next"; -import { headers, cookies } from "next/headers"; import { redirect } from "next/navigation"; import prisma, { bookingMinimalSelect } from "@calcom/prisma"; -import { buildLegacyCtx } from "@lib/buildLegacyCtx"; - -import PageWrapper from "@components/PageWrapperAppDir"; - export const generateMetadata = async () => await _generateMetadata( () => "Meeting Unavailable", () => "Meeting Unavailable" ); -type PageProps = Readonly<{ - params: Params; -}>; - async function getData(context: Omit) { const booking = await prisma.booking.findUnique({ where: { @@ -58,19 +49,5 @@ async function getData(context: Omit { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - const legacyCtx = buildLegacyCtx(headers(), cookies(), params); - // @ts-expect-error `req` of type '{ headers: ReadonlyHeaders; cookies: ReadonlyRequestCookies; }' is not assignable to `req` in `GetServerSidePropsContext` - const props = await getData(legacyCtx); - - return ( - - - - ); -}; - -export default Page; +// @ts-expect-error getData arg +export default WithLayout({ getData, Page: OldPage, getLayout: null })<"P">; diff --git a/apps/web/app/future/(individual-page-wrapper)/video/meeting-not-started/[uid]/page.tsx b/apps/web/app/future/video/meeting-not-started/[uid]/page.tsx similarity index 63% rename from apps/web/app/future/(individual-page-wrapper)/video/meeting-not-started/[uid]/page.tsx rename to apps/web/app/future/video/meeting-not-started/[uid]/page.tsx index b15f16452e..bde0c18328 100644 --- a/apps/web/app/future/(individual-page-wrapper)/video/meeting-not-started/[uid]/page.tsx +++ b/apps/web/app/future/video/meeting-not-started/[uid]/page.tsx @@ -1,16 +1,12 @@ import OldPage from "@pages/video/meeting-not-started/[uid]"; import { type Params } from "app/_types"; import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; import { type GetServerSidePropsContext } from "next"; -import { headers, cookies } from "next/headers"; import { redirect } from "next/navigation"; import prisma, { bookingMinimalSelect } from "@calcom/prisma"; -import { buildLegacyCtx } from "@lib/buildLegacyCtx"; - -import PageWrapper from "@components/PageWrapperAppDir"; - type PageProps = Readonly<{ params: Params; }>; @@ -51,19 +47,5 @@ async function getData(context: Omit { - const h = headers(); - const nonce = h.get("x-nonce") ?? undefined; - - const legacyCtx = buildLegacyCtx(headers(), cookies(), params); - // @ts-expect-error `req` of type '{ headers: ReadonlyHeaders; cookies: ReadonlyRequestCookies; }' is not assignable to `req` in `GetServerSidePropsContext` - const props = await getData(legacyCtx); - - return ( - - - - ); -}; - -export default Page; +// @ts-expect-error getData arg +export default WithLayout({ getData, Page: OldPage, getLayout: null })<"P">; diff --git a/apps/web/app/future/video/no-meeting-found/page.tsx b/apps/web/app/future/video/no-meeting-found/page.tsx new file mode 100644 index 0000000000..31a15a2ad6 --- /dev/null +++ b/apps/web/app/future/video/no-meeting-found/page.tsx @@ -0,0 +1,20 @@ +import LegacyPage from "@pages/video/no-meeting-found"; +import { ssrInit } from "app/_trpc/ssrInit"; +import { _generateMetadata } from "app/_utils"; +import { WithLayout } from "app/layoutHOC"; + +export const generateMetadata = async () => + await _generateMetadata( + (t) => t("no_meeting_found"), + (t) => t("no_meeting_found") + ); + +const getData = async () => { + const ssr = await ssrInit(); + + return { + dehydratedState: await ssr.dehydrate(), + }; +}; + +export default WithLayout({ getData, Page: LegacyPage, getLayout: null })<"P">; diff --git a/apps/web/app/layoutHOC.tsx b/apps/web/app/layoutHOC.tsx new file mode 100644 index 0000000000..5e41ed1184 --- /dev/null +++ b/apps/web/app/layoutHOC.tsx @@ -0,0 +1,28 @@ +import type { LayoutProps, PageProps } from "app/_types"; +import { cookies, headers } from "next/headers"; + +import { buildLegacyCtx } from "@lib/buildLegacyCtx"; + +import PageWrapper from "@components/PageWrapperAppDir"; + +type WithLayoutParams> = { + getLayout: ((page: React.ReactElement) => React.ReactNode) | null; + Page?: (props: T) => React.ReactElement; + getData?: (arg: ReturnType) => Promise; +}; + +export function WithLayout>({ getLayout, getData, Page }: WithLayoutParams) { + return async

(p: P extends "P" ? PageProps : LayoutProps) => { + const h = headers(); + const nonce = h.get("x-nonce") ?? undefined; + const props = getData ? await getData(buildLegacyCtx(h, cookies(), p.params)) : ({} as T); + + const children = "children" in p ? p.children : null; + + return ( + + {Page ? : children} + + ); + }; +} diff --git a/apps/web/components/PageWrapperAppDir.tsx b/apps/web/components/PageWrapperAppDir.tsx index 08d7b9cad3..ae36417c97 100644 --- a/apps/web/components/PageWrapperAppDir.tsx +++ b/apps/web/components/PageWrapperAppDir.tsx @@ -20,7 +20,7 @@ export interface CalPageWrapper { export type PageWrapperProps = Readonly<{ getLayout: ((page: React.ReactElement) => ReactNode) | null; - children: React.ReactElement; + children: React.ReactNode; requiresLicense: boolean; nonce: string | undefined; themeBasis: string | null; @@ -62,7 +62,7 @@ function PageWrapper(props: PageWrapperProps) { dangerouslySetInnerHTML={{ __html: `window.CalComPageStatus = '${pageStatus}'` }} /> {getLayout( - props.requiresLicense ? {props.children} : props.children + props.requiresLicense ? {props.children} : <>{props.children} )}