import Link from "next/link" import { Camera, CheckCircle2, Clock3, MailCheck, MessageSquareText, TrendingUp, UserRoundCheck, UserRoundX, UsersRound, } from "lucide-react" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card" import { Progress } from "@/components/ui/progress" import { getAdminDashboardMetrics } from "@/lib/db/queries/dashboard" export const dynamic = "force-dynamic" function percentage(value: number, total: number) { if (total <= 0) return 0 return Math.round((value / total) * 100) } function formatNumber(value: number) { return new Intl.NumberFormat("en").format(value) } export default async function AdminPage() { const metrics = await getAdminDashboardMetrics() const attendanceRows = [ { label: "Attending", value: metrics.attendingMembers, percent: percentage(metrics.attendingMembers, metrics.totalMembers), className: "bg-emerald-600", }, { label: "Declined", value: metrics.declinedMembers, percent: percentage(metrics.declinedMembers, metrics.totalMembers), className: "bg-rose-600", }, { label: "Pending", value: metrics.pendingMembers, percent: percentage(metrics.pendingMembers, metrics.totalMembers), className: "bg-amber-500", }, ] const submittedPercent = percentage( metrics.submittedInvitations, metrics.totalInvitations, ) const uploadedPhotoPercent = percentage(metrics.uploadedPhotos, metrics.totalInvitations) const metricCards = [ { title: "Invitation groups", value: metrics.totalInvitations, description: `${formatNumber(metrics.pendingInvitations)} awaiting RSVP`, icon: UsersRound, }, { title: "Invited people", value: metrics.totalMembers, description: "Across all invitation groups", icon: UsersRound, }, { title: "Attending", value: metrics.attendingMembers, description: `${percentage(metrics.attendingMembers, metrics.totalMembers)}% of invited people`, icon: UserRoundCheck, }, { title: "Declined", value: metrics.declinedMembers, description: `${percentage(metrics.declinedMembers, metrics.totalMembers)}% of invited people`, icon: UserRoundX, }, { title: "Pending responses", value: metrics.pendingMembers, description: `${percentage(metrics.pendingMembers, metrics.totalMembers)}% of invited people`, icon: Clock3, }, { title: "Submitted RSVPs", value: metrics.submittedInvitations, description: `${submittedPercent}% of invitation groups`, icon: MailCheck, }, { title: "Uploaded photos", value: metrics.uploadedPhotos, description: `${uploadedPhotoPercent}% of invitation groups`, icon: Camera, }, { title: "Pending toasts", value: metrics.pendingToastRequests, description: metrics.pendingToastRequests > 0 ? "Need review or scheduling" : "No pending toast requests", icon: MessageSquareText, }, ] return (
Track invitation groups, RSVP answers, photo uploads, and toast requests.
{formatNumber(metrics.submittedInvitations)}
{formatNumber(metrics.pendingInvitations)}