68 lines
1.8 KiB
TypeScript
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>
|
|
);
|
|
}
|
|
|