diff --git a/apps/static-site/content/pages/en/collections-listing.mdx b/apps/static-site/content/pages/en/collections-listing.mdx new file mode 100644 index 00000000..3d43a6c7 --- /dev/null +++ b/apps/static-site/content/pages/en/collections-listing.mdx @@ -0,0 +1,4 @@ +--- +title: Collections +path: "/collections" +--- diff --git a/apps/static-site/content/pages/en/exhibitions-listing.mdx b/apps/static-site/content/pages/en/exhibitions-listing.mdx new file mode 100644 index 00000000..1c991189 --- /dev/null +++ b/apps/static-site/content/pages/en/exhibitions-listing.mdx @@ -0,0 +1,4 @@ +--- +title: Exhibitions +path: "/exhibitions" +--- diff --git a/apps/static-site/content/pages/en/home.mdx b/apps/static-site/content/pages/en/home.mdx new file mode 100644 index 00000000..f33a1f68 --- /dev/null +++ b/apps/static-site/content/pages/en/home.mdx @@ -0,0 +1,4 @@ +--- +title: Academic Heritage, History and Art +path: "/" +--- diff --git a/apps/static-site/content/pages/en/publications-listing.mdx b/apps/static-site/content/pages/en/publications-listing.mdx new file mode 100644 index 00000000..64971fd7 --- /dev/null +++ b/apps/static-site/content/pages/en/publications-listing.mdx @@ -0,0 +1,4 @@ +--- +title: Publications +path: "/publications" +--- diff --git a/apps/static-site/content/pages/en/search.mdx b/apps/static-site/content/pages/en/search.mdx new file mode 100644 index 00000000..33e347be --- /dev/null +++ b/apps/static-site/content/pages/en/search.mdx @@ -0,0 +1,4 @@ +--- +title: Search +path: "/search" +--- diff --git a/apps/static-site/content/pages/nl/collections-listing.mdx b/apps/static-site/content/pages/nl/collections-listing.mdx new file mode 100644 index 00000000..e557a973 --- /dev/null +++ b/apps/static-site/content/pages/nl/collections-listing.mdx @@ -0,0 +1,4 @@ +--- +title: Collecties +path: "/collections" +--- diff --git a/apps/static-site/content/pages/nl/exhibitions-listing.mdx b/apps/static-site/content/pages/nl/exhibitions-listing.mdx new file mode 100644 index 00000000..c3ffe909 --- /dev/null +++ b/apps/static-site/content/pages/nl/exhibitions-listing.mdx @@ -0,0 +1,4 @@ +--- +title: Tentoonstellingen +path: "/exhibitions" +--- diff --git a/apps/static-site/content/pages/nl/home.mdx b/apps/static-site/content/pages/nl/home.mdx new file mode 100644 index 00000000..3e48f9e4 --- /dev/null +++ b/apps/static-site/content/pages/nl/home.mdx @@ -0,0 +1,4 @@ +--- +title: Academisch Erfgoed, Geschiedenis en Kunst +path: "/" +--- diff --git a/apps/static-site/content/pages/nl/publications-listing.mdx b/apps/static-site/content/pages/nl/publications-listing.mdx new file mode 100644 index 00000000..4b1d318a --- /dev/null +++ b/apps/static-site/content/pages/nl/publications-listing.mdx @@ -0,0 +1,4 @@ +--- +title: Publicaties +path: "/publications" +--- diff --git a/apps/static-site/content/pages/nl/search.mdx b/apps/static-site/content/pages/nl/search.mdx new file mode 100644 index 00000000..63dd1a43 --- /dev/null +++ b/apps/static-site/content/pages/nl/search.mdx @@ -0,0 +1,4 @@ +--- +title: Zoek +path: "/search" +--- diff --git a/apps/static-site/contentlayer.config.ts b/apps/static-site/contentlayer.config.ts index 9ee97d74..b9b8e061 100644 --- a/apps/static-site/contentlayer.config.ts +++ b/apps/static-site/contentlayer.config.ts @@ -11,6 +11,7 @@ const Pages = defineDocumentType(() => ({ title: { type: "string", required: true }, path: { type: "string", required: true }, description: { type: "string", required: false }, + image: { type: "string", required: false }, }, computedFields: { lang: { diff --git a/apps/static-site/src/app/[locale]/about/page.tsx b/apps/static-site/src/app/[locale]/about/page.tsx index 2a95cc2a..422e5f0d 100644 --- a/apps/static-site/src/app/[locale]/about/page.tsx +++ b/apps/static-site/src/app/[locale]/about/page.tsx @@ -1,4 +1,3 @@ -import { allPages } from ".contentlayer/generated"; import { Slot } from "@/blocks/slot"; import { SlotContext } from "@/blocks/slot-context"; import { Page } from "@/components/Page"; @@ -6,35 +5,28 @@ import { Illustration } from "@/components/blocks/Illustration"; import { useMDXComponent } from "next-contentlayer/hooks"; import { Metadata } from "next"; import { getTranslations } from "next-intl/server"; -import { getSiteName, getBasicMetadata, makeTitle } from "@/helpers/metadata"; - -function getAboutPage({ params }: { params: { locale: string } }) { - const aboutPages = allPages.filter((page) => page.path === "/about"); - const aboutPage = aboutPages.find((page) => page.lang === params.locale) || aboutPages[0]; - if (!aboutPage) throw new Error(`No about page found for locale ${params.locale}`); - return aboutPage; -} +import { getSiteName, getBasicMetadata, makeTitle, getMdx } from "@/helpers/metadata"; export async function generateMetadata({ params }: { params: { locale: string } }): Promise { const t = await getTranslations(); const siteName = await getSiteName(); - const aboutPage = getAboutPage({ params: params }); - const aboutTitle = aboutPage.title || t("About"); - const title = makeTitle([aboutTitle, siteName]); - const description = aboutPage.description || t("aboutDesc"); - return getBasicMetadata(params.locale, siteName, title, description); + const page = getMdx({ params: { pageName: "About", path: "/about", locale: params.locale } }); + const title = makeTitle([page.title || t("About"), siteName]); + const description = page.description || t("defaultDesc"); + const image = page.image; + return getBasicMetadata(params.locale, siteName, title, description, image); } export default async function AboutPage({ params }: { params: { locale: string } }) { - const aboutPage = getAboutPage({ params: params }); - const MDXContent = useMDXComponent(aboutPage.body.code); + const page = getMdx({ params: { pageName: "About", path: "/about", locale: params.locale } }); + const MDXContent = useMDXComponent(page.body.code); const CustomSlot = (inner: any) => { return ; }; return ( -

{aboutPage.title}

+

{page.title}

diff --git a/apps/static-site/src/app/[locale]/collections/page.tsx b/apps/static-site/src/app/[locale]/collections/page.tsx index ff1e367f..5ffeb957 100644 --- a/apps/static-site/src/app/[locale]/collections/page.tsx +++ b/apps/static-site/src/app/[locale]/collections/page.tsx @@ -2,15 +2,17 @@ import { Page } from "@/components/Page"; import { Slot } from "@/blocks/slot"; import { getTranslations, unstable_setRequestLocale } from "next-intl/server"; import { CollectionListing } from "@/components/pages/CollectionListing"; -import { getSiteName, getBasicMetadata, makeTitle } from "@/helpers/metadata"; +import { getSiteName, getBasicMetadata, makeTitle, getMdx } from "@/helpers/metadata"; import { Metadata } from "next"; export async function generateMetadata({ params }: { params: { locale: string } }): Promise { const t = await getTranslations(); const siteName = await getSiteName(); - const title = makeTitle([t("Collections"), siteName]); - const description = t("collectionsDesc"); - return getBasicMetadata(params.locale, siteName, title, description); + const page = getMdx({ params: { pageName: "Collections", path: "/collections", locale: params.locale } }); + const title = makeTitle([page.title || t("Collections"), siteName]); + const description = page.description || t("defaultDesc"); + const image = page.image; + return getBasicMetadata(params.locale, siteName, title, description, image); } export default async function Collections(props: { params: { locale: string } }) { diff --git a/apps/static-site/src/app/[locale]/exhibitions/page.tsx b/apps/static-site/src/app/[locale]/exhibitions/page.tsx index b28d9a3e..0088051d 100644 --- a/apps/static-site/src/app/[locale]/exhibitions/page.tsx +++ b/apps/static-site/src/app/[locale]/exhibitions/page.tsx @@ -5,14 +5,16 @@ import { Slot } from "@/blocks/slot"; import exhibitions from "@repo/iiif/build/collections/exhibitions/collection.json"; import { Metadata } from "next"; import { getTranslations } from "next-intl/server"; -import { getSiteName, getBasicMetadata, makeTitle } from "@/helpers/metadata"; +import { getSiteName, getBasicMetadata, makeTitle, getMdx } from "@/helpers/metadata"; export async function generateMetadata({ params }: { params: { locale: string } }): Promise { const t = await getTranslations(); const siteName = await getSiteName(); - const title = makeTitle([t("Exhibitions"), siteName]); - const description = t("exhibitionsDesc"); - return getBasicMetadata(params.locale, siteName, title, description); + const page = getMdx({ params: { pageName: "Exhibitions", path: "/exhibitions", locale: params.locale } }); + const title = makeTitle([page.title || t("Exhibitions"), siteName]); + const description = page.description || t("defaultDesc"); + const image = page.image; + return getBasicMetadata(params.locale, siteName, title, description, image); } export default function ExhibitionsPage({ params }: { params: { locale: string } }) { diff --git a/apps/static-site/src/app/[locale]/layout.tsx b/apps/static-site/src/app/[locale]/layout.tsx index d38f6c9b..489617a5 100644 --- a/apps/static-site/src/app/[locale]/layout.tsx +++ b/apps/static-site/src/app/[locale]/layout.tsx @@ -8,15 +8,17 @@ import { GlobalHeader } from "@/components/GlobalHeader"; import localFont from "next/font/local"; import { SlotContext } from "@/blocks/slot-context"; import { GlobalFooter } from "@/components/GlobalFooter"; -import { getSiteName, getBasicMetadata } from "@/helpers/metadata"; +import { getSiteName, getBasicMetadata, makeTitle, getMdx } from "@/helpers/metadata"; import { $ } from "bun"; export async function generateMetadata({ params }: { params: { locale: string } }): Promise { const t = await getTranslations(); const siteName = await getSiteName(); - const title = siteName; - const description = t("homeDesc"); - return getBasicMetadata(params.locale, siteName, title, description); + const page = getMdx({ params: { pageName: "Home", path: "/", locale: params.locale } }); + const title = makeTitle([page.title, siteName]); + const description = page.description || t("defaultDesc"); + const image = page.image; + return getBasicMetadata(params.locale, siteName, title, description, image); } if (process.env.NODE_ENV !== "production") { diff --git a/apps/static-site/src/app/[locale]/publications/page.tsx b/apps/static-site/src/app/[locale]/publications/page.tsx index e9aa954f..dcbdfb33 100644 --- a/apps/static-site/src/app/[locale]/publications/page.tsx +++ b/apps/static-site/src/app/[locale]/publications/page.tsx @@ -3,14 +3,17 @@ import { getTranslations, unstable_setRequestLocale } from "next-intl/server"; import { PublicationListPage } from "@/components/pages/PublicationListPage"; import { Page } from "@/components/Page"; import { Metadata } from "next"; -import { getSiteName, getBasicMetadata, makeTitle } from "@/helpers/metadata"; +import { getSiteName, getBasicMetadata, makeTitle, getMdx } from "@/helpers/metadata"; export async function generateMetadata({ params }: { params: { locale: string } }): Promise { const t = await getTranslations(); const siteName = await getSiteName(); - const title = makeTitle([t("Publications"), siteName]); - const description = t("publicationsDesc"); - return getBasicMetadata(params.locale, siteName, title, description); + const page = getMdx({ params: { pageName: "Publications", path: "/publications", locale: params.locale } }); + const title = makeTitle([page.title || t("Publications"), siteName]); + const description = page.description || t("defaultDesc"); + const image = page.image; + + return getBasicMetadata(params.locale, siteName, title, description, image); } export default async function PublicationsList({ params }: { params: { locale: string } }) { diff --git a/apps/static-site/src/app/[locale]/search/page.tsx b/apps/static-site/src/app/[locale]/search/page.tsx index 5575e569..82f5b993 100644 --- a/apps/static-site/src/app/[locale]/search/page.tsx +++ b/apps/static-site/src/app/[locale]/search/page.tsx @@ -2,22 +2,24 @@ import { SearchPage } from "@/components/pages/SearchPage"; import { Page } from "@/components/Page"; import { getTranslations, unstable_setRequestLocale } from "next-intl/server"; import { Metadata } from "next"; -import { getSiteName, getBasicMetadata, makeTitle } from "@/helpers/metadata"; +import { getSiteName, getBasicMetadata, makeTitle, getMdx } from "@/helpers/metadata"; export async function generateMetadata({ params }: { params: { locale: string } }): Promise { const t = await getTranslations(); const siteName = await getSiteName(); - const title = makeTitle([t("Search"), siteName]); - const description = t("searchDesc"); - return getBasicMetadata(params.locale, siteName, title, description); + const page = getMdx({ params: { pageName: "Search", path: "/search", locale: params.locale } }); + const title = makeTitle([page.title || t("Search"), siteName]); + const description = page.description || t("defaultDesc"); + const image = page.image; + return getBasicMetadata(params.locale, siteName, title, description, image); } export default async function Search({ params }: { params: { locale: string } }) { unstable_setRequestLocale(params.locale); - const t = await getTranslations(); + const page = getMdx({ params: { pageName: "Search", path: "/search", locale: params.locale } }); return ( - + ); } diff --git a/apps/static-site/src/helpers/metadata.ts b/apps/static-site/src/helpers/metadata.ts index b4b7f600..06dd6c89 100644 --- a/apps/static-site/src/helpers/metadata.ts +++ b/apps/static-site/src/helpers/metadata.ts @@ -1,5 +1,6 @@ import { Metadata } from "next"; import { getTranslations } from "next-intl/server"; +import { allPages } from ".contentlayer/generated"; export const siteURL = "https://heritage.tudelft.nl"; export const fallbackImage = "/logo/TUDelft_logo_rgb.png"; @@ -20,7 +21,15 @@ export function makeTitle(parts: (string | undefined | null)[]) { return partsArray.join(" | "); } -export function getBasicMetadata(locale: string, siteName: string, title: string, description: string): Metadata { +export const defaultImage = "/metadata/default.jpg"; + +export function getBasicMetadata( + locale: string, + siteName: string, + title: string, + description: string, + image: string | null | undefined +): Metadata { return { metadataBase: new URL(siteURL), title: title, @@ -30,7 +39,7 @@ export function getBasicMetadata(locale: string, siteName: string, title: string description: description, images: [ { - url: "/metadata/default.jpg", + url: image || defaultImage, width: 800, height: 800, }, @@ -42,3 +51,10 @@ export function getBasicMetadata(locale: string, siteName: string, title: string }, }; } + +export function getMdx({ params }: { params: { pageName: string; path: string; locale: string } }) { + const pages = allPages.filter((page) => page.path === params.path); + const page = pages.find((p) => p.lang === params.locale) || pages[0]; + if (!page) throw new Error(`No ${params.pageName} page found for locale ${params.locale}`); + return page; +} diff --git a/apps/static-site/translations/en.json b/apps/static-site/translations/en.json index 85047ffc..8e6a4618 100644 --- a/apps/static-site/translations/en.json +++ b/apps/static-site/translations/en.json @@ -24,11 +24,6 @@ "Contact and accessibility": "Contact and accessibility", "Article": "Article", "Table of contents": "Table of contents", - "homeTitle": "Academic Heritage, History and Art", - "homeDesc": "Explore the history of Delft University of Technology and the Special Collections of TU Delft Library", - "aboutDesc": "Explore the history of Delft University of Technology and the Special Collections of TU Delft Library", - "searchDesc": "Explore the history of Delft University of Technology and the Special Collections of TU Delft Library", - "exhibitionsDesc": "Explore the history of Delft University of Technology and the Special Collections of TU Delft Library", - "collectionsDesc": "Explore the history of Delft University of Technology and the Special Collections of TU Delft Library", - "publicationsDesc": "Explore the history of Delft University of Technology and the Special Collections of TU Delft Library" + "defaultTitle": "Academic Heritage, History and Art", + "defaultDesc": "Explore the history of Delft University of Technology and the Special Collections of TU Delft Library" } diff --git a/apps/static-site/translations/nl.json b/apps/static-site/translations/nl.json index bdaaeec8..7c0c90a2 100644 --- a/apps/static-site/translations/nl.json +++ b/apps/static-site/translations/nl.json @@ -24,11 +24,6 @@ "Contact and accessibility": "Contact en bereikbaarheid", "Article": "Artikel", "Table of contents": "Inhoudsopgave", - "homeTitle": "Academisch Erfgoed, Geschiedenis en Kunst", - "homeDesc": "Verken de geschiedenis van de TU Delft en de bijzondere collecties van de TU Delft Library", - "aboutDesc": "Verken de geschiedenis van de TU Delft en de bijzondere collecties van de TU Delft Library", - "searchDesc": "Verken de geschiedenis van de TU Delft en de bijzondere collecties van de TU Delft Library", - "exhibitionsDesc": "Verken de geschiedenis van de TU Delft en de bijzondere collecties van de TU Delft Library", - "collectionsDesc": "Verken de geschiedenis van de TU Delft en de bijzondere collecties van de TU Delft Library", - "publicationsDesc": "Verken de geschiedenis van de TU Delft en de bijzondere collecties van de TU Delft Library" + "defaultTitle": "Academisch Erfgoed, Geschiedenis en Kunst", + "defaultDesc": "Verken de geschiedenis van de TU Delft en de bijzondere collecties van de TU Delft Library" }