import Link from "next/link" import { CopyInviteButton } from "@/components/admin/copy-invite-button" 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 { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { listInvitations } from "@/lib/db/queries/invitations" import { getLanguageLabel } from "@/lib/i18n/config" export const dynamic = "force-dynamic" function getInviteUrl(token: string) { return new URL(`/invite/${token}`, process.env.APP_URL ?? "http://localhost:3000").toString() } function getStatusVariant(status: string): "default" | "secondary" | "outline" { if (status === "Attending") return "default" if (status === "Pending") return "secondary" return "outline" } export default async function GuestsPage({ searchParams, }: { searchParams: Promise<{ deleted?: string }> }) { const { deleted } = await searchParams const invitations = await listInvitations() return (

Guests

Manage invitation groups and private invite links.

{deleted ? ( Guest group deleted The invitation and its associated guest information were permanently removed. ) : null} Invitation list One row per invitation group, household, couple, family, or individual guest. {invitations.length === 0 ? (

No invitations yet

Create the first invitation to generate a private guest link.

) : ( Invitation Language Members Status Contact Actions {invitations.map((invitation) => { const inviteUrl = getInviteUrl(invitation.token) return (

Max party size: {invitation.maxPartySize}

{getLanguageLabel(invitation.language)}

{invitation.membersCount}

{invitation.attendingCount} attending · {invitation.pendingCount} pending

{invitation.derivedStatus}

{invitation.contactEmail ?? "—"}

{invitation.contactPhone ?? "—"}

) })}
)}
) }