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 Achievement = { name: string; category: string; level: number; rewardAmount: number; rewardType: number; points: number | null; progressNeeded: number; }; export default async function AdminAchievements() { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.CATALOG_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.achievements"); let achievements: Achievement[]; try { achievements = await prisma.achievements.findMany({ select: { name: true, category: true, level: true, rewardAmount: true, rewardType: true, points: true, progressNeeded: true, }, orderBy: [{ category: "asc" }, { name: "asc" }, { level: "asc" }], }); } catch { achievements = []; } const groups = new Map(); for (const a of achievements) { const list = groups.get(a.category) ?? []; list.push(a); groups.set(a.category, list); } const distinctNames = new Set(achievements.map((a) => a.name)).size; return (
{groups.size === 0 ? (
{t("noAchievements")}
) : ( [...groups.entries()].map(([category, rows]) => (

{category}{" "} {rows.length}

{rows.map((a) => ( ))}
{t("colName")} {t("colLevel")} {t("colProgress")} {t("colRewardType")} {t("colRewardAmount")} {t("colPoints")}
{a.name} {a.level} {a.progressNeeded} {a.rewardType} {a.rewardAmount} {a.points ?? 0}
)) )}
); }