import { createDefaultForm } from "@/app/admin/form/actions"; import { AdminShellServer } from "@/components/admin-shell-server"; import { RealtimeRefresh } from "@/components/realtime-refresh"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { getAdminDashboardData } from "@/lib/admin-dashboard"; import { ClipboardList, FilePlus2, Inbox, ListChecks, Server, } from "lucide-react"; import Link from "next/link"; export const dynamic = "force-dynamic"; function formatNumber(value: number) { return new Intl.NumberFormat("en-US").format(value); } function formatDate(date: Date | null) { if (!date) return "No responses"; return date.toLocaleString("en-GB", { timeZone: "Asia/Bangkok", hour12: false, }); } function respondentName(submission: { userName: string | null; userDiscordId: string | null; }) { return submission.userName || submission.userDiscordId || "Anonymous"; } function StatCard({ title, value, description, icon: Icon, }: { title: string; value: number; description: string; icon: typeof ClipboardList; }) { return ( {title} {formatNumber(value)} {description} ); } export default async function AdminPage() { const { summary, recentSubmissions, activeForms } = await getAdminDashboardData(); return ( Dashboard Forms, responses, and activity at a glance. Create form Recent responses Latest submissions across all forms. View forms {recentSubmissions.length === 0 ? ( Responses will appear here after people submit a form. ) : ( <> Respondent Form Submitted Status {recentSubmissions.map((submission) => ( {respondentName(submission)} {submission.userName && submission.userDiscordId && ( {submission.userDiscordId} )} {submission.formTitle} {formatDate(submission.submittedAt)} {submission.edited ? "Edited" : "Original"} ))} {recentSubmissions.map((submission) => ( {respondentName(submission)} {submission.formTitle} {submission.edited ? "Edited" : "Original"} {formatDate(submission.submittedAt)} ))} > )} Forms Manage forms and view submissions Backend Follower API settings and cache Form activity Forms ranked by responses in the last 7 days. {activeForms.length === 0 ? ( No forms found. Create one to start collecting responses. Create form ) : ( <> Form Status Today Last 7 days Total Last response Actions {activeForms.map((form) => ( {form.title} {form.isOpen ? "Open" : "Closed"} {formatNumber(form.responsesToday)} {formatNumber(form.responsesLast7Days)} {formatNumber(form.totalResponses)} {formatDate(form.lastResponseAt)} Responses ))} {activeForms.map((form) => ( {form.title} Last response: {formatDate(form.lastResponseAt)} {form.isOpen ? "Open" : "Closed"} {formatNumber(form.responsesLast7Days)} this week ยท{" "} {formatNumber(form.totalResponses)} total Responses ))} > )} ); }
{description}
Forms, responses, and activity at a glance.
{submission.userDiscordId}
No forms found. Create one to start collecting responses.