import Link from "next/link"; import { StatusCard } from "@/components/admin/dashboard"; import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; type Campaign = { id: number; name: string; image: string; startTimestamp: number; totalDays: number; lockExpired: string; enabled: string; }; function fmtDate(ts: number): string { if (!ts) return "—"; return new Date(ts * 1000).toISOString().slice(0, 10); } export default async function AdminCalendar() { let campaigns: Campaign[] = []; try { campaigns = await prisma.calendarCampaigns.findMany({ select: { id: true, name: true, image: true, startTimestamp: true, totalDays: true, lockExpired: true, enabled: true, }, orderBy: { id: "desc" }, }); } catch { campaigns = []; } // Tally reward counts per campaign in JS (avoid prisma.groupBy). const rewardCounts = new Map(); let totalRewards = 0; try { const rewards = await prisma.calendarRewards.findMany({ select: { campaignId: true }, }); totalRewards = rewards.length; for (const r of rewards) { rewardCounts.set(r.campaignId, (rewardCounts.get(r.campaignId) ?? 0) + 1); } } catch { // leave map empty on failure } const enabledCount = campaigns.filter((c) => c.enabled === "1").length; return (

Calendar campaigns

Read-only · {campaigns.length} campaign{campaigns.length === 1 ? "" : "s"}.

0 ? "ok" : "neutral"} icon="✅" />
{campaigns.length === 0 ? (

No calendar campaigns found.

) : (
{campaigns.map((c) => { const enabled = c.enabled === "1"; const count = rewardCounts.get(c.id) ?? 0; return ( {c.image ? ( // eslint-disable-next-line @next/next/no-img-element {c.name} ) : (
)}

{c.name || `Campaign #${c.id}`}

{enabled ? "enabled" : "disabled"}

#{c.id} · {c.totalDays} day{c.totalDays === 1 ? "" : "s"} · {count} reward {count === 1 ? "" : "s"}

Starts {fmtDate(c.startTimestamp)} {c.lockExpired === "1" ? " · Locks expired" : ""}

); })}
)}
); }