Files

48 lines
1.5 KiB
TypeScript

import type { Metadata } from 'next';
import { getTranslations } from 'next-intl/server';
import { notFound } from 'next/navigation';
import { resolvePageRenderData } from '#web-runtime/api/render-data';
import { pageMetadata } from '#web-runtime/lib/page-metadata';
import PageRenderer from '#web-runtime/renderer';
import { getPathname } from '#i18n/navigation';
import { routing } from '#i18n/routing';
interface PageRouteProps {
params: Promise<{
locale: string;
path?: string[];
}>;
searchParams: Promise<Record<string, string | string[] | undefined>>;
}
function routePath(path?: string[]): string {
return path?.join('/') ?? '';
}
function publicPath(locale: string, path: string): string {
return getPathname({ locale, href: path ? `/${path}` : '/' });
}
export async function generateMetadata({ params }: PageRouteProps): Promise<Metadata> {
const { locale, path } = await params;
const data = await resolvePageRenderData(locale, routePath(path));
if (!data) {
const t = await getTranslations({ locale, namespace: 'Pages.NotFoundPage' });
return { title: t('metaTitle') };
}
return pageMetadata(data, routing.defaultLocale, publicPath);
}
export default async function PublicPage({ params, searchParams }: PageRouteProps) {
const { locale, path } = await params;
const data = await resolvePageRenderData(locale, routePath(path));
if (!data) {
notFound();
}
return <PageRenderer data={data} searchParams={await searchParams} />;
}