import { Store } from "lucide-react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { cancelMarketplaceListing } from "@/actions/admin-marketplace"; import { AdminPageShell } from "@/components/admin/admin-page-shell"; import { AdminSimplePager } from "@/components/admin/admin-simple-pager"; import { StatusCard } from "@/components/admin/dashboard"; import { Button } from "@/components/ui/button"; import { calcPagination, parseListParams } from "@/lib/admin-helpers"; import { formatDate } from "@/lib/format-date"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; export default async function AdminMarketplacePage({ searchParams, }: { searchParams: Promise>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.SHOP_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.marketplace"); const canEdit = canAccess(permissions, PERMS.SHOP_EDIT, session.user.rank); const raw = await searchParams; const parsed = parseListParams(new URLSearchParams(raw)); const filter = raw.filter === "sold" ? "sold" : "active"; const where = filter === "sold" ? { state: 2 } : { state: 1 }; let total = 0; let rows: Awaited> = []; let activeCount = 0; let soldCount = 0; let loadError = false; try { [total, activeCount, soldCount] = await Promise.all([ prisma.marketplaceItems.count({ where }), prisma.marketplaceItems.count({ where: { state: 1 } }), prisma.marketplaceItems.count({ where: { state: 2 } }), ]); const pagination = calcPagination(total, parsed.page, parsed.perPage); rows = await prisma.marketplaceItems.findMany({ where, orderBy: { timestamp: "desc" }, skip: pagination.offset, take: pagination.perPage, }); } catch { loadError = true; } const pagination = calcPagination(total, parsed.page, parsed.perPage); const userIds = [ ...new Set(rows.map((r) => r.userId).filter((id) => id > 0)), ]; const users = userIds.length > 0 ? await prisma.user .findMany({ where: { id: { in: userIds } }, select: { id: true, username: true }, }) .catch(() => []) : []; const usernameById = new Map(users.map((u) => [u.id, u.username])); return (
{loadError ? (
{t("loadError")}
) : null}

{filter === "sold" ? t("soldListings") : t("activeListings")} ( {total})

{rows.length === 0 ? (
{t("empty")}
) : (
{filter === "sold" ? : null} {canEdit && filter === "active" ? ( ) : null} {rows.map((row) => ( {filter === "sold" ? ( ) : null} {canEdit && filter === "active" ? ( ) : null} ))}
{t("colId")} {t("colItem")} {t("colSeller")} {t("colPrice")} {t("colListed")}{t("colSold")}{t("colActions")}
{row.id} {row.itemId} {usernameById.get(row.userId) ?? `#${row.userId}`} {row.price} {formatDate(new Date(row.timestamp * 1000))} {formatDate( row.soldTimestamp ? new Date(row.soldTimestamp * 1000) : null, )}
)}
); }