63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
import { getPublicHeaderBanner } from "@cms/db"
|
|
import { notFound } from "next/navigation"
|
|
import { hasLocale, NextIntlClientProvider } from "next-intl"
|
|
import { getTranslations } from "next-intl/server"
|
|
import type { ReactNode } from "react"
|
|
import { PublicAnnouncements } from "@/components/public-announcements"
|
|
import { PublicHeaderBanner } from "@/components/public-header-banner"
|
|
import { PublicSiteFooter } from "@/components/public-site-footer"
|
|
import { PublicSiteHeader } from "@/components/public-site-header"
|
|
import { routing } from "@/i18n/routing"
|
|
import { Providers } from "../providers"
|
|
|
|
type LocaleLayoutProps = {
|
|
children: ReactNode
|
|
params: Promise<{
|
|
locale: string
|
|
}>
|
|
}
|
|
|
|
export async function generateMetadata({ params }: LocaleLayoutProps) {
|
|
const { locale } = await params
|
|
|
|
if (!hasLocale(routing.locales, locale)) {
|
|
return {}
|
|
}
|
|
|
|
const t = await getTranslations({
|
|
locale,
|
|
namespace: "Seo",
|
|
})
|
|
|
|
return {
|
|
title: t("title"),
|
|
description: t("description"),
|
|
openGraph: {
|
|
title: t("title"),
|
|
description: t("description"),
|
|
},
|
|
}
|
|
}
|
|
|
|
export default async function LocaleLayout({ children, params }: LocaleLayoutProps) {
|
|
const { locale } = await params
|
|
|
|
if (!hasLocale(routing.locales, locale)) {
|
|
notFound()
|
|
}
|
|
|
|
const banner = await getPublicHeaderBanner()
|
|
|
|
return (
|
|
<NextIntlClientProvider locale={locale}>
|
|
<Providers>
|
|
<PublicHeaderBanner banner={banner} />
|
|
<PublicAnnouncements placement="global_top" />
|
|
<PublicSiteHeader />
|
|
<main>{children}</main>
|
|
<PublicSiteFooter />
|
|
</Providers>
|
|
</NextIntlClientProvider>
|
|
)
|
|
}
|