Files
Nele-Till-Hochzeit/src/app/page.tsx
T

68 lines
1.8 KiB
TypeScript

export const dynamic = 'force-dynamic';
import { prisma } from '@/lib/db';
import Header from '@/components/Header';
import MediaWall from '@/components/MediaWall';
async function getInitialMedia() {
try {
const items = await prisma.mediaItem.findMany({
where: { published: true },
take: 51,
orderBy: [
{ featured: 'desc' },
{ sortOrder: 'asc' },
{ createdAt: 'desc' },
],
include: { _count: { select: { likes: true } } },
});
let nextCursor: number | null = null;
if (items.length > 50) {
const extra = items.pop();
nextCursor = extra!.id;
}
// Fetch voting status for the client
const settings = await prisma.appSettings.findUnique({ where: { id: 1 } });
// Fetch available directories for filtering
const dirs = await prisma.mediaItem.findMany({
where: { published: true },
select: { directory: true },
distinct: ['directory'],
orderBy: { directory: 'asc' }
});
const directories = dirs.map(d => d.directory).filter(Boolean);
// Serialize BigInt values for client
return {
items: JSON.parse(JSON.stringify(items, (_key, value) =>
typeof value === 'bigint' ? Number(value) : value
)),
nextCursor,
votingOpen: settings?.votingOpen ?? false,
directories,
};
} catch (error) {
console.error('[Page] Error fetching initial media:', error);
return { items: [], nextCursor: null, votingOpen: false, directories: [] };
}
}
export default async function HomePage() {
const data = await getInitialMedia();
return (
<main>
<Header />
<MediaWall
initialItems={data.items}
initialCursor={data.nextCursor}
initialVotingOpen={data.votingOpen}
directories={data.directories}
/>
</main>
);
}