import PreviewSuspense from 'components/preview-suspense'; import getQueryFromSlug from 'helpers/getQueryFromSlug'; import { docQuery } from 'lib/sanity/queries'; import { client } from 'lib/sanity/sanity.client'; import type { Metadata } from 'next'; import { draftMode } from 'next/headers'; import CategoryPage from './category-page'; import CategoryPagePreview from './category-page-preview'; import HomePage from './home-page'; import HomePagePreview from './home-page-preview'; import ProductPage from './product-page'; import ProductPagePreview from './product-page-preview'; import SinglePage from './single-page'; import SinglePagePreview from './single-page-preview'; /** * Render pages depending on type. */ export default async function Page({ params }: { params: { slug: string[]; locale: string } }) { const { isEnabled } = draftMode(); const { slug, locale } = params; const { query = '', queryParams, docType } = getQueryFromSlug(slug, locale); const pageData = await client.fetch(query, queryParams); const data = filterDataToSingleItem(pageData, isEnabled); if (isEnabled) { return ( {docType === 'home' && } {docType === 'page' && } {docType === 'product' && } {docType === 'category' && } ); } return ( <> {docType === 'home' && } {docType === 'product' && } {docType === 'category' && } {docType === 'page' && } ); } // Background revalidate once every day. // export const revalidate = 86400; /** * Get paths for each page. */ export async function generateStaticParams() { const paths = await client.fetch(docQuery); return paths.map((path: { slug: string; locale: string }) => ({ slug: path.slug.split('/').filter((p) => p), locale: path.locale })); } /** * Helper function to return the correct version of the document * If we're in "preview mode" and have multiple documents, return the draft */ function filterDataToSingleItem(data: any, preview = false) { if (!Array.isArray(data)) { return data; } if (data.length === 1) { return data[0]; } if (preview) { return data.find((item) => item._id.startsWith(`drafts.`)) || data[0]; } return data[0]; } /** * Generate metadata for each page. */ export async function generateMetadata({ params }: { params: { slug: string[]; locale: string }; }): Promise { const { slug, locale } = params; const { query = '', queryParams } = getQueryFromSlug(slug, locale); const pageData = await client.fetch(query, queryParams); const data = filterDataToSingleItem(pageData, false); const { seo } = data ?? {}; return { title: seo?.title ? seo?.title : data?.title, description: seo?.description ? seo.description : 'Webb och digitalbyrå från Göteborg', openGraph: { images: [ { url: seo?.image?.asset?.url ? seo.image.asset.url : '/og-image.jpg', width: 1200, height: 630, alt: seo?.coverImage?.alt ? seo.coverImage.alt : 'Kodamera AB' } ] } }; }