import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; // state == 1 → an active, unsold offer in the Arcturus marketplace. const STATE_ACTIVE = 1; function listedAgo(ts: number): string { const now = Math.floor(Date.now() / 1000); const diff = Math.max(0, now - ts); if (diff < 60) return "just now"; const mins = Math.floor(diff / 60); if (mins < 60) return `${mins}m ago`; const hours = Math.floor(mins / 60); if (hours < 24) return `${hours}h ago`; const days = Math.floor(hours / 24); return `${days}d ago`; } function listedAt(ts: number): string { return new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " "); } export default async function MarketplacePage() { let offers: { id: number; itemId: number; userId: number; price: number; timestamp: number; }[] = []; try { offers = await prisma.marketplaceItems.findMany({ where: { state: STATE_ACTIVE }, select: { id: true, itemId: true, userId: true, price: true, timestamp: true }, orderBy: { timestamp: "desc" }, take: 100, }); } catch { offers = []; } // Resolve seller usernames in a single query (read-only display join). let sellers = new Map(); try { const ids = [...new Set(offers.map((o) => o.userId))]; if (ids.length > 0) { const users = await prisma.user.findMany({ where: { id: { in: ids } }, select: { id: true, username: true }, }); sellers = new Map(users.map((u) => [u.id, u.username])); } } catch { sellers = new Map(); } const total = offers.reduce((sum, o) => sum + o.price, 0); return (

Marketplace

Browse furniture and rares listed by players. Listings are placed in-game and update live — head into the hotel to make an offer.

Active offers

{offers.length}

Sellers

{new Set(offers.map((o) => o.userId)).size}

Total value

{total.toLocaleString()} cr

{offers.length === 0 ? (

There are no active marketplace offers right now. Check back later.

) : (
{offers.map((o) => ( ))}
Offer Item Seller Price Listed
#{o.id} Item #{o.itemId} {sellers.get(o.userId) ?? `User #${o.userId}`} {o.price.toLocaleString()} cr {listedAgo(o.timestamp)}
)}
); }