import Link from "next/link"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Kbd } from "@/components/ui/kbd"; import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { DeleteAllSubmissionsButton, DeleteSubmissionButton } from "@/components/delete-buttons"; import { RealtimeRefresh } from "@/components/realtime-refresh"; import { ResultsFilters } from "./client"; import { getDiscordMemberProfile, type DiscordMemberProfile } from "@/lib/discord/discord"; import { getFilteredSubmissions, parseResultFilters, resultFiltersToSearchParams, type ResultFilters, } from "@/lib/form/admin-form-results"; export const dynamic = "force-dynamic"; type ResultRow = Awaited>["rows"][number]; function formatDate(value: Date) { return value.toLocaleString("en-GB", { timeZone: "Asia/Bangkok", hour12: false, }); } function RespondentName({ row, profile }: { row: ResultRow; profile: DiscordMemberProfile | null }) { const displayName = profile?.globalName || profile?.username || row.userName || row.userDiscordId || "Anonymous"; const username = profile?.username || row.userName; return ( {displayName} {username && username !== displayName && ({username})} ); } function pageHref(formId: string, filters: ResultFilters, page: number) { const query = resultFiltersToSearchParams(filters, { page }); return `/admin/form/${formId}/result${query ? `?${query}` : ""}`; } export default async function ResultsListPage({ params, searchParams, }: { params: Promise<{ id: string }>; searchParams: Promise>; }) { const [{ id }, rawFilters] = await Promise.all([params, searchParams]); const filters = parseResultFilters(rawFilters); const { rows, total, page, pageCount } = await getFilteredSubmissions(id, filters); const discordIds = [ ...new Set( rows .map((row) => row.userDiscordId) .filter((value): value is string => Boolean(value)), ), ]; const profiles = Object.fromEntries( await Promise.all( discordIds.map(async (discordId) => [ discordId, await getDiscordMemberProfile(discordId), ]), ), ); const returnQuery = resultFiltersToSearchParams(filters, { page }); const detailHref = (submissionId: string) => `/admin/form/${id}/result/${submissionId}${returnQuery ? `?return=${encodeURIComponent(returnQuery)}` : ""}`; return (

Responses

{total} matching {total === 1 ? "response" : "responses"}

{total > 0 && }
{rows.length === 0 ? ( No responses found Try changing or clearing the current filters. ) : ( <> Respondent Submitted Note Actions {rows.map((row) => ( {row.userName && row.userDiscordId && (

{row.userDiscordId}

)}
{formatDate(row.submittedAt)} {row.adminNote ? (

{row.adminNote}

) : ( No note )}
))}
{rows.map((row) => ( {formatDate(row.submittedAt)}

Note

{row.adminNote ? (

{row.adminNote}

) : (

No note

)}
))}
)} {pageCount > 1 && ( {page} / {pageCount} )}
); }