import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; import { prisma } from "@/lib/prisma"; import { redirect } from "next/navigation"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; 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() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.SHOP_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.calendar"); 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 = []; } 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 {} const enabledCount = campaigns.filter((c) => c.enabled === "1").length; return (
0 ? "ok" : "neutral"} icon="โœ…" />
{campaigns.length === 0 ? (
{t("noCampaigns")}
) : (
{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 || `#${c.id}`}

{enabled ? t("statusEnabled") : t("statusDisabled")}

{t("campaignMeta", { id: c.id, days: c.totalDays, rewards: count, })}

{t("startsAt", { date: fmtDate(c.startTimestamp) })} {c.lockExpired === "1" ? ` ยท ${t("locksExpired")}` : ""}

); })}
)}
); }