feature: pagination

This commit is contained in:
Benno Tielen 2026-07-16 13:58:03 +02:00
parent 9afd2726b2
commit fd4aab561b
2 changed files with 39 additions and 7 deletions

View file

@ -3,21 +3,34 @@ import { fetchBlogPosts } from '@/fetch/blog'
import { BlogExcerpt } from '@/components/BlogExcerpt/BlogExcerpt' import { BlogExcerpt } from '@/components/BlogExcerpt/BlogExcerpt'
import { Section } from '@/components/Section/Section' import { Section } from '@/components/Section/Section'
import { Container } from '@/components/Container/Container' import { Container } from '@/components/Container/Container'
import { NextPrevButtons } from '@/components/NextPrevButtons/NextPrevButtons'
import { getPhoto } from '@/utils/dto/gallery' import { getPhoto } from '@/utils/dto/gallery'
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
export default async function Page() { const buildHref = (page: number): string =>
const blogs = await fetchBlogPosts(false); page > 1 ? `/blog?page=${page}` : '/blog'
export default async function Page({
searchParams,
}: {
searchParams: Promise<{ page?: string }>
}) {
const query = await searchParams
const parsedPage = parseInt(query.page ?? '1', 10)
const page = Number.isFinite(parsedPage) && parsedPage > 0 ? parsedPage : 1
const blogs = await fetchBlogPosts(false, page)
return ( return (
<> <>
<PageHeader <PageHeader
title={"Aktuelle Nachrichten"} title={'Aktuelle Nachrichten'}
description={"Im Blog der Pfarrei finden Sie aktuelle Nachrichten und erfahren alles über das Gemeindeleben, kommende Veranstaltungen und besondere Gottesdienste."} description={'Im Blog der Pfarrei finden Sie aktuelle Nachrichten und erfahren alles über das Gemeindeleben, kommende Veranstaltungen und besondere Gottesdienste.'}
/> />
<Section padding={"small"}> <Section padding={'small'}>
<Container> <Container>
{ {
blogs?.docs.map(blog => blogs?.docs.map(blog =>
@ -31,6 +44,23 @@ export default async function Page() {
} }
</Container> </Container>
</Section> </Section>
{(blogs?.hasPrevPage || blogs?.hasNextPage) && (
<Section padding={'small'}>
<NextPrevButtons
prev={
blogs.hasPrevPage && blogs.prevPage
? { href: buildHref(blogs.prevPage), text: 'Vorige Seite' }
: undefined
}
next={
blogs.hasNextPage && blogs.nextPage
? { href: buildHref(blogs.nextPage), text: 'Nächste Seite' }
: undefined
}
/>
</Section>
)}
</> </>
) )
} }

View file

@ -5,8 +5,9 @@ import config from '@/payload.config'
* Fetches blog posts based on given criteria. * Fetches blog posts based on given criteria.
* *
* @param {boolean} displayOnFrontpage - Indicates whether to display posts on the front page. * @param {boolean} displayOnFrontpage - Indicates whether to display posts on the front page.
* @param {number} page - Page number for pagination.
*/ */
export const fetchBlogPosts = async (displayOnFrontpage: boolean) => { export const fetchBlogPosts = async (displayOnFrontpage: boolean, page: number = 1) => {
const today = new Date() const today = new Date()
today.setHours(23, 59) today.setHours(23, 59)
@ -69,6 +70,7 @@ export const fetchBlogPosts = async (displayOnFrontpage: boolean) => {
}, },
where: query, where: query,
limit: 18, limit: 18,
page,
}) })
} }