import type { Metadata } from "next"; import { notFound } from "next/navigation"; import { db, users, recipes, userUsage, eq, desc, count, and } from "@epicure/db"; import { getStorageUsedMb } from "@/lib/tiers"; 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"; import { requireFullAdminPage } from "@/lib/require-admin-page"; 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", family: "default", } as const; export default async function AdminUserDetailPage({ params }: PageProps) { await requireFullAdminPage(); 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], storageUsedMb] = await Promise.all([ db.select({ count: count() }).from(recipes).where(eq(recipes.authorId, id)), getStorageUsedMb(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 (
{user.email}
Joined {user.createdAt.toLocaleDateString()}
No recipes yet.
) : (| Title | Visibility | Created | Link |
|---|---|---|---|
| {recipe.title} |
|
{recipe.createdAt.toLocaleDateString()} | View |