web-next: paginar /changelogs (10 por página + navegación)

getCommits ahora recibe page/limit y devuelve {commits, totalPages} (del
header X-PageCount de Gitea). La página lee ?page, muestra 10 commits y usa
el componente Pagination (Anterior/1 2 3…/Siguiente).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-13 13:23:38 +00:00
parent e448f34305
commit acd3305a3f
2 changed files with 23 additions and 10 deletions
+16 -5
View File
@@ -1,6 +1,7 @@
import type { Metadata } from 'next' import type { Metadata } from 'next'
import { setRequestLocale } from 'next-intl/server' import { setRequestLocale } from 'next-intl/server'
import { getCommits } from '@/lib/changelog' import { getCommits } from '@/lib/changelog'
import { Pagination } from '@/components/Pagination'
export const metadata: Metadata = { title: 'Changelogs' } export const metadata: Metadata = { title: 'Changelogs' }
@@ -17,10 +18,18 @@ function formatFecha(iso: string): string {
}) })
} }
export default async function ChangelogsPage({ params }: { params: Promise<{ locale: string }> }) { export default async function ChangelogsPage({
params,
searchParams,
}: {
params: Promise<{ locale: string }>
searchParams: Promise<{ page?: string }>
}) {
const { locale } = await params const { locale } = await params
const sp = await searchParams
const page = Math.max(1, Number(sp.page) || 1)
setRequestLocale(locale) setRequestLocale(locale)
const commits = await getCommits(50) const { commits, totalPages } = await getCommits(page, 10)
return ( return (
<div className="main-page"> <div className="main-page">
@@ -52,9 +61,11 @@ export default async function ChangelogsPage({ params }: { params: Promise<{ loc
<br /> <br />
</div> </div>
))} ))}
<p className="centered third-brown"> <Pagination
<i>* Mostrando los últimos 50 cambios</i> page={page}
</p> totalPages={totalPages}
hrefFor={(p) => (p === 1 ? '/changelogs' : `/changelogs?page=${p}`)}
/>
<br /> <br />
</> </>
)} )}
+7 -5
View File
@@ -20,16 +20,17 @@ interface GiteaCommit {
author?: { login?: string } | null author?: { login?: string } | null
} }
export async function getCommits(limit = 50): Promise<Commit[]> { export async function getCommits(page = 1, limit = 10): Promise<{ commits: Commit[]; totalPages: number }> {
try { try {
const res = await fetch(`${GITEA}/api/v1/repos/${REPO}/commits?limit=${limit}`, { const res = await fetch(`${GITEA}/api/v1/repos/${REPO}/commits?page=${page}&limit=${limit}`, {
headers: { Accept: 'application/json' }, headers: { Accept: 'application/json' },
// Cache corto para no golpear Gitea en cada visita. // Cache corto para no golpear Gitea en cada visita.
next: { revalidate: 300 }, next: { revalidate: 300 },
}) })
if (!res.ok) return [] if (!res.ok) return { commits: [], totalPages: 1 }
const totalPages = Math.max(1, Number(res.headers.get('x-pagecount') || '1'))
const data = (await res.json()) as GiteaCommit[] const data = (await res.json()) as GiteaCommit[]
return data.map((c) => { const commits = data.map((c) => {
const msg = c.commit?.message ?? '' const msg = c.commit?.message ?? ''
const lines = msg.split('\n') const lines = msg.split('\n')
const title = lines[0].trim() const title = lines[0].trim()
@@ -49,7 +50,8 @@ export async function getCommits(limit = 50): Promise<Commit[]> {
url: c.html_url, url: c.html_url,
} }
}) })
return { commits, totalPages }
} catch { } catch {
return [] return { commits: [], totalPages: 1 }
} }
} }