* chore: apps/[slug] remove pages router * remove apps/[slug] pages from /future * chore: apps/installed remove pages router * chore: apps/installation remove pages router * remove Head element * fix metadata * fix test * fix another test * chore: apps/categories remove pages router * revert unneeded changes * update middleware * Remove <Head> * remove unused import and code * remove unused import and code again * fix * fix category page * add split icon * add /routing paths to middleware matcher * wip * remove HeadSeo from App.tsx * clean up head-seo test * add generateAppMetadata * use generateAppMetadata in apps/[slug] page * delete file * remove log * fix * fix * fix apps/installed pages * fix cateogires pages * fix * fix imports * wip * fix * fix * fix metadata * fix * redirect /apps/routing-forms to /routing * replace all usages of /apps/routing-forms to /routing * better naming * /routing -> /routing/forms * fix * fix * fix * fix * remove backPath as it is irrelevant when withoutMain is true * fix type checks * fix type check in apps/[slug] * refactors * fix * fix test * fix * fix * fix * Replace multiple leading slashes with a single slash * migrate routing-forms too * add re routing * fix * add redirection --------- Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
77 lines
2.4 KiB
TypeScript
77 lines
2.4 KiB
TypeScript
"use client";
|
|
|
|
import { useParams } from "next/navigation";
|
|
|
|
import RoutingFormsRoutingConfig from "@calcom/app-store/routing-forms/pages/app-routing.config";
|
|
import type { AppGetServerSideProps } from "@calcom/types/AppGetServerSideProps";
|
|
import type { inferSSRProps } from "@calcom/types/inferSSRProps";
|
|
|
|
import type { AppProps } from "@lib/app-providers";
|
|
import type { getServerSideProps } from "@lib/apps/[slug]/[...pages]/getServerSideProps";
|
|
|
|
type RoutingPageType = {
|
|
getServerSideProps: AppGetServerSideProps;
|
|
// A component than can accept any properties
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
default: ((props: any) => JSX.Element) &
|
|
Pick<AppProps["Component"], "isBookingPage" | "getLayout" | "PageWrapper">;
|
|
};
|
|
|
|
type Found = {
|
|
notFound: false;
|
|
Component: RoutingPageType["default"];
|
|
getServerSideProps: RoutingPageType["getServerSideProps"];
|
|
};
|
|
|
|
type NotFound = {
|
|
notFound: true;
|
|
};
|
|
|
|
function getRoute(pages: string[]) {
|
|
const routingConfig = RoutingFormsRoutingConfig as unknown as Record<string, RoutingPageType>;
|
|
const mainPage = pages[0];
|
|
const appPage = routingConfig.layoutHandler || (routingConfig[mainPage] as RoutingPageType);
|
|
if (!appPage) {
|
|
return {
|
|
notFound: true,
|
|
} as NotFound;
|
|
}
|
|
return { notFound: false, Component: appPage.default, ...appPage } as Found;
|
|
}
|
|
export type PageProps = inferSSRProps<typeof getServerSideProps>;
|
|
|
|
const RoutingFormsPage: RoutingPageType["default"] = function RoutingFormsPage(props: PageProps) {
|
|
const params = useParams();
|
|
const _pages = params?.pages ?? [];
|
|
const pages = Array.isArray(_pages) ? _pages : _pages.split("/");
|
|
const route = getRoute(pages);
|
|
|
|
const componentProps = {
|
|
...props,
|
|
pages: pages.slice(1),
|
|
};
|
|
|
|
if (!route || route.notFound) {
|
|
throw new Error("Route can't be undefined");
|
|
}
|
|
return <route.Component {...componentProps} />;
|
|
};
|
|
|
|
export const getLayout: NonNullable<(typeof RoutingFormsPage)["getLayout"]> = (page) => {
|
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
const params = useParams();
|
|
const _pages = params?.pages ?? [];
|
|
const pages = Array.isArray(_pages) ? _pages : _pages.split("/");
|
|
const route = getRoute(pages as string[]);
|
|
|
|
if (route.notFound) {
|
|
return null;
|
|
}
|
|
if (!route.Component.getLayout) {
|
|
return page;
|
|
}
|
|
return route.Component.getLayout(page);
|
|
};
|
|
|
|
export default RoutingFormsPage;
|