diff --git a/apps/web/lib/app-providers.tsx b/apps/web/lib/app-providers.tsx index 8db171261a..ead9218664 100644 --- a/apps/web/lib/app-providers.tsx +++ b/apps/web/lib/app-providers.tsx @@ -22,6 +22,7 @@ export type AppProps = Omit & { Component: NextAppProps["Component"] & { requiresLicense?: boolean; isThemeSupported?: boolean | ((arg: { router: NextRouter }) => boolean); + getLayout?: (page: React.ReactElement) => ReactNode; }; /** Will be defined only is there was an error */ err?: Error; diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index fb36ee4182..fb9815d3e2 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -1,8 +1,25 @@ import { collectEvents } from "next-collect/server"; +// eslint-disable-next-line @next/next/no-server-import-in-page +import { NextMiddleware, NextResponse } from "next/server"; import { extendEventData, nextCollectBasicSettings } from "@calcom/lib/telemetry"; +const V2_WHITELIST = ["/settings/admin"]; + +const middleware: NextMiddleware = async (req) => { + const url = req.nextUrl; + + /** Display available V2 pages to users who opted-in to early access */ + if (req.cookies.has("calcom-v2-early-access") && V2_WHITELIST.some((p) => url.pathname.startsWith(p))) { + // rewrite to the current subdomain under the pages/sites folder + url.pathname = `/v2${url.pathname}`; + } + + return NextResponse.rewrite(url); +}; + export default collectEvents({ + middleware, ...nextCollectBasicSettings, cookieName: "__clnds", extend: extendEventData, diff --git a/apps/web/pages/_app.tsx b/apps/web/pages/_app.tsx index 7cc4341a48..0edb252a06 100644 --- a/apps/web/pages/_app.tsx +++ b/apps/web/pages/_app.tsx @@ -29,6 +29,9 @@ function MyApp(props: AppProps) { } else if (router.pathname === "/500") { pageStatus = "500"; } + // Use the layout defined at the page level, if available + const getLayout = Component.getLayout ?? ((page) => page); + return ( @@ -37,12 +40,14 @@ function MyApp(props: AppProps) {