import { asc } from "drizzle-orm"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { uploadBadge } from "@/actions/admin-badge-upload"; import { giveBadge } from "@/actions/admin-badges"; import { Button } from "@/components/ui/button"; import { db, WebsiteBadges } from "@/lib/db"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; export const metadata = { title: "Badges" }; export default async function AdminBadges({ searchParams, }: { searchParams: Promise<{ uploaded?: string; error?: string }>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.CATALOG_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.badges"); const { uploaded, error } = await searchParams; let badges: (typeof WebsiteBadges.$inferSelect)[] = []; try { badges = await db .select() .from(WebsiteBadges) .orderBy(asc(WebsiteBadges.badgeName)) .limit(500); } catch { badges = []; } return (
{uploaded && (
{t("uploadedMessage", { code: uploaded })}
)} {error && (
{t("errorMessage", { error })}
)}

{t("uploadTitle")}

{t("uploadSubtitle")}

{t("giveTitle")}

{badges.map((b) => ( ))}

{t("catalogueTitle")} ({badges.length})

{badges.length === 0 ? (
{t("noBadges")}
) : (
{badges.map((b) => ( ))}
{t("colCode")} {t("colName")} {t("colDescription")}
{b.badgeKey} {b.badgeName} {b.badgeDescription}
)}
); }