import { PageContentTypeEnum } from "@scandic-hotels/trpc/enums/contentType" import { type RawMetadataSchema } from "@scandic-hotels/trpc/routers/contentstack/metadata/output" import { env } from "@/env/server" import { serverClient } from "@/lib/trpc/server" import { getDescription } from "./description" import { getImage } from "./image" import { getTitle } from "./title" import type { Metadata } from "next" export async function generateMetadata({ searchParams, }: { searchParams: Promise<{ subpage?: string; filterFromUrl?: string }> }) { const { subpage, filterFromUrl, ...otherSearchParams } = await searchParams // If there are other (real) search params, we don't want to index the page as this will // cause duplicate content issues. const noIndexOnSearchParams = !!Object.keys(otherSearchParams).length const caller = await serverClient() const { rawMetadata, alternates, robots } = await caller.contentstack.metadata.get({ subpage, filterFromUrl, noIndex: noIndexOnSearchParams, }) if (!rawMetadata) { return { robots: { index: true, follow: true, }, } } const metadata = await getTransformedMetadata(rawMetadata, alternates, robots) if (typeof metadata?.robots === "string") { return metadata } return { ...metadata, robots: { ...metadata.robots, index: metadata.robots?.index ?? true, follow: metadata.robots?.follow ?? true, }, } } function isNoIndexFromMetadata(data: RawMetadataSchema) { const isDestinationPage = [ PageContentTypeEnum.destinationCityPage, PageContentTypeEnum.destinationCountryPage, ].includes(data.system.content_type_uid as PageContentTypeEnum) if (isDestinationPage) { const filter = data.destinationData?.filter if (filter) { const foundSeoFilter = data.seo_filters?.find( (f) => f.filterConnection.edges[0]?.node?.slug === filter ) if (foundSeoFilter) { return !!foundSeoFilter.seo_metadata?.noindex } } } return !!data.web?.seo_metadata?.noindex } async function getTransformedMetadata( data: RawMetadataSchema, alternates: Metadata["alternates"] | null, robots: Metadata["robots"] | null = null ) { const metadata: Metadata = { metadataBase: env.PUBLIC_URL ? new URL(env.PUBLIC_URL) : undefined, title: { absolute: await getTitle(data) }, description: await getDescription(data), openGraph: { images: getImage(data), }, alternates, robots, } if (isNoIndexFromMetadata(data)) { metadata.robots = { index: false, follow: false, } } return metadata }