feat: include pagination in news feed and clean up report scripts
This commit is contained in:
parent
81ccb397f5
commit
1179f0ed54
Binary file not shown.
@ -9,7 +9,7 @@ import { decodeHtmlEntities } from '@/lib/utils';
|
|||||||
import { Settings } from '@/types/settings';
|
import { Settings } from '@/types/settings';
|
||||||
import { Post, MediaItem } from '@/types/publications';
|
import { Post, MediaItem } from '@/types/publications';
|
||||||
|
|
||||||
async function fetchHomeData() {
|
async function fetchHomeData(page: number = 1) {
|
||||||
try {
|
try {
|
||||||
const client = await createAdminClient();
|
const client = await createAdminClient();
|
||||||
|
|
||||||
@ -36,17 +36,22 @@ async function fetchHomeData() {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
let posts: Post[] = [];
|
let posts: Post[] = [];
|
||||||
|
let totalPages = 1;
|
||||||
if (typeRes.documents.length > 0) {
|
if (typeRes.documents.length > 0) {
|
||||||
const firstType = typeRes.documents[0];
|
const firstType = typeRes.documents[0];
|
||||||
const typeId = firstType?.$id;
|
const typeId = firstType?.$id;
|
||||||
if (!typeId) return { posts: [], cardSettings };
|
if (!typeId) return { posts: [], cardSettings, totalPages: 1 };
|
||||||
|
|
||||||
|
const offset = (page - 1) * postsCount;
|
||||||
const postsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', [
|
const postsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', [
|
||||||
Query.equal('tipo_publicacion_id', typeId),
|
Query.equal('tipo_publicacion_id', typeId),
|
||||||
Query.equal('estado', 'Publicado'),
|
Query.equal('estado', 'Publicado'),
|
||||||
Query.orderDesc('fecha_publicacion'),
|
Query.orderDesc('fecha_publicacion'),
|
||||||
Query.limit(postsCount)
|
Query.limit(postsCount),
|
||||||
|
Query.offset(offset)
|
||||||
]);
|
]);
|
||||||
posts = postsRes.documents as unknown as Post[];
|
posts = postsRes.documents as unknown as Post[];
|
||||||
|
totalPages = Math.ceil(postsRes.total / postsCount);
|
||||||
|
|
||||||
// 3. Resolve Media
|
// 3. Resolve Media
|
||||||
const mediaIds = posts.map(p => p.imagen_destacada_id).filter(id => id && typeof id === 'string');
|
const mediaIds = posts.map(p => p.imagen_destacada_id).filter(id => id && typeof id === 'string');
|
||||||
@ -62,17 +67,19 @@ async function fetchHomeData() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return { posts, cardSettings };
|
return { posts, cardSettings, totalPages };
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Home fetch error", e);
|
console.error("Home fetch error", e);
|
||||||
return { posts: [], cardSettings: { showCategory: false, showFooterDate: true, showFooterButton: true, footerText: "" } };
|
return { posts: [], cardSettings: { showCategory: false, showFooterDate: true, showFooterButton: true, footerText: "" }, totalPages: 1 };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const dynamic = "force-dynamic";
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
export default async function Home() {
|
export default async function Home(props: { searchParams: Promise<{ [key: string]: string | string[] | undefined }> }) {
|
||||||
const { posts, cardSettings } = await fetchHomeData();
|
const searchParams = await props.searchParams;
|
||||||
|
const page = Number(searchParams?.page) || 1;
|
||||||
|
const { posts, cardSettings, totalPages } = await fetchHomeData(page);
|
||||||
const hasSidebar = await hasSidebarContent();
|
const hasSidebar = await hasSidebarContent();
|
||||||
|
|
||||||
const user = await getLoggedInUser();
|
const user = await getLoggedInUser();
|
||||||
@ -173,6 +180,31 @@ export default async function Home() {
|
|||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Pagination Controls */}
|
||||||
|
{totalPages > 1 && (
|
||||||
|
<div className="flex justify-center items-center gap-4 mt-12">
|
||||||
|
{page > 1 ? (
|
||||||
|
<a href={`/?page=${page - 1}#noticias`} className="px-6 py-3 rounded-xl bg-slate-800/80 text-white font-bold hover:bg-slate-700 transition-colors border border-white/10">
|
||||||
|
Anterior
|
||||||
|
</a>
|
||||||
|
) : (
|
||||||
|
<div className="px-6 py-3 rounded-xl bg-slate-800/40 text-slate-500 font-bold border border-white/5 cursor-not-allowed">
|
||||||
|
Anterior
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<span className="text-slate-400 font-medium">Página {page} de {totalPages}</span>
|
||||||
|
{page < totalPages ? (
|
||||||
|
<a href={`/?page=${page + 1}#noticias`} className="px-6 py-3 rounded-xl bg-cyan-600 text-white font-bold hover:bg-cyan-500 transition-colors shadow-[0_0_15px_rgba(6,182,212,0.3)]">
|
||||||
|
Siguiente
|
||||||
|
</a>
|
||||||
|
) : (
|
||||||
|
<div className="px-6 py-3 rounded-xl bg-slate-800/40 text-slate-500 font-bold border border-white/5 cursor-not-allowed">
|
||||||
|
Siguiente
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{hasSidebar && (
|
{hasSidebar && (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user