wwwlayermeshusa/src/app/(frontend)/en/[slug]/page.tsx

88 lines
2.5 KiB
TypeScript

import type { Metadata } from 'next'
import { PayloadRedirects } from '@/components/PayloadRedirects'
import configPromise from '@payload-config'
import { getPayload, type RequiredDataFromCollectionSlug } from 'payload'
import { draftMode } from 'next/headers'
import React, { cache } from 'react'
import { RenderBlocks } from '@/blocks/RenderBlocks'
import type { Page } from '@/payload-types'
import { generateMeta } from '@/utilities/generateMeta'
import PageClient from '../../[slug]/page.client'
import { LivePreviewListener } from '@/components/LivePreviewListener'
export const dynamic = 'force-dynamic'
export const dynamicParams = true
type Args = {
params: Promise<{
slug?: string
}>
}
export default async function PageEN({ params: paramsPromise }: Args) {
const { isEnabled: draft } = await draftMode()
const { slug = 'home' } = await paramsPromise
const decodedSlug = decodeURIComponent(slug)
const url = '/en/' + decodedSlug
const page = await queryPageBySlugEN({ slug: decodedSlug })
if (!page) {
return <PayloadRedirects url={url} />
}
const { layout } = page as Page
return (
<article>
<PageClient />
<PayloadRedirects disableNotFound url={url} />
{draft && <LivePreviewListener />}
<RenderBlocks blocks={layout} />
</article>
)
}
export async function generateMetadata({ params: paramsPromise }: Args): Promise<Metadata> {
const { slug = 'home' } = await paramsPromise
const decodedSlug = decodeURIComponent(slug)
const page = await queryPageBySlugEN({ slug: decodedSlug })
return generateMeta({ doc: page })
}
export async function generateStaticParams() {
const payload = await getPayload({ config: configPromise })
const pages = await payload.find({
collection: 'pages',
draft: false,
limit: 1000,
pagination: false,
overrideAccess: false,
select: { slug: true },
locale: 'en',
})
return pages.docs?.map(({ slug }) => ({ slug })) ?? []
}
const queryPageBySlugEN = cache(async ({ slug }: { slug: string }) => {
const { isEnabled: draft } = await draftMode()
const payload = await getPayload({ config: configPromise })
const result = await payload.find({
collection: 'pages',
draft,
limit: 1,
pagination: false,
overrideAccess: draft,
locale: 'en', // ← only difference from the sv route
fallbackLocale: 'sv', // ← if en field is empty, fall back to Swedish
where: {
slug: {
equals: slug,
},
},
})
return result.docs?.[0] || null
})