import type { Metadata } from "next"; import { notFound } from "next/navigation"; import { db, users, recipes, userUsage, eq, desc, count, and, sql } from "@epicure/db"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { UserEditor } from "@/components/admin/user-editor"; import { ResetUsageButton } from "@/components/admin/reset-usage-button"; import Link from "next/link"; import { ArrowLeft } from "lucide-react"; export const metadata: Metadata = {}; interface PageProps { params: Promise<{ id: 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 AdminUserDetailPage({ params }: PageProps) { const { id } = await params; const [user] = await db.select().from(users).where(eq(users.id, id)).limit(1); if (!user) notFound(); const currentMonth = new Date().toISOString().slice(0, 7); const [usage] = await db .select() .from(userUsage) .where(and(eq(userUsage.userId, id), eq(userUsage.month, currentMonth))) .limit(1); const [recipeCountRow] = await db .select({ count: count() }) .from(recipes) .where(eq(recipes.authorId, id)); const recentRecipes = await db .select({ id: recipes.id, title: recipes.title, visibility: recipes.visibility, createdAt: recipes.createdAt, }) .from(recipes) .where(eq(recipes.authorId, id)) .orderBy(desc(recipes.createdAt)) .limit(10); return (
Back to Users
{user.name.slice(0, 2).toUpperCase()}

{user.name}

{user.email}

Joined {user.createdAt.toLocaleDateString()}

{user.role} {user.tier}
Edit Role & Tier Usage This Month ({currentMonth})
AI Calls Used {usage?.aiCallsUsed ?? 0}
Total Recipes {recipeCountRow?.count ?? 0}
Storage Used {usage?.storageUsedMb ?? 0} MB

Recent Recipes

{recentRecipes.length === 0 ? (

No recipes yet.

) : (
{recentRecipes.map((recipe) => ( ))}
Title Visibility Created Link
{recipe.title} {recipe.visibility} {recipe.createdAt.toLocaleDateString()} View
)}
); }