feat(web): complete MVP0 public layout, banner, and SEO baseline
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
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 { 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"
|
||||
|
||||
@@ -12,6 +17,28 @@ type LocaleLayoutProps = {
|
||||
}>
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -19,9 +46,16 @@ export default async function LocaleLayout({ children, params }: LocaleLayoutPro
|
||||
notFound()
|
||||
}
|
||||
|
||||
const banner = await getPublicHeaderBanner()
|
||||
|
||||
return (
|
||||
<NextIntlClientProvider locale={locale}>
|
||||
<Providers>{children}</Providers>
|
||||
<Providers>
|
||||
<PublicHeaderBanner banner={banner} />
|
||||
<PublicSiteHeader />
|
||||
<main>{children}</main>
|
||||
<PublicSiteFooter />
|
||||
</Providers>
|
||||
</NextIntlClientProvider>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user