import type { Metadata } from "next"; import { db, count } from "@epicure/db"; import { users } from "@epicure/db"; import { desc } from "@epicure/db"; import { Badge } from "@/components/ui/badge"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { CreateUserDialog } from "@/components/admin/create-user-dialog"; import Link from "next/link"; export const metadata: Metadata = {}; const PAGE_SIZE = 100; interface PageProps { searchParams: Promise<{ page?: string }>; } const ROLE_COLORS = { user: "secondary", moderator: "outline", admin: "destructive", } as const; const TIER_COLORS = { free: "secondary", pro: "default", team: "default", } as const; export default async function AdminUsersPage({ searchParams }: PageProps) { const { page: pageParam } = await searchParams; const page = Math.max(1, parseInt(pageParam ?? "1", 10) || 1); const offset = (page - 1) * PAGE_SIZE; const [allUsers, totalRow] = await Promise.all([ db .select() .from(users) .orderBy(desc(users.createdAt)) .limit(PAGE_SIZE) .offset(offset), db.select({ count: count() }).from(users), ]); const total = totalRow[0]?.count ?? 0; return (

Users

{allUsers.map((user) => ( ))}
User Role Tier Joined
{user.name.slice(0, 2).toUpperCase()}
{user.name}
{user.email}
{user.role} {user.tier} {user.createdAt.toLocaleDateString()}
{page > 1 && ( Previous )} {offset + allUsers.length < total && ( Next )}
); }