"use client"; import { useMemo, useState, useTransition } from "react"; import { EventParticipationStatus } from "@prisma/client"; import { format } from "date-fns"; import { de } from "date-fns/locale"; import { AlertTriangle, Check, X } from "lucide-react"; import { toast } from "sonner"; import { submitEventRsvp } from "@/actions/rsvp"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; export type DashboardRsvpEventDto = { id: string; title: string; startDate: string; rsvpDeadline: string | null; children: { id: string; name: string; status: EventParticipationStatus | null; }[]; }; export function RsvpActionCard({ events }: { events: DashboardRsvpEventDto[] }) { if (events.length === 0) return null; return ( Aktion erforderlich Für diese Termine fehlt noch mindestens eine Rückmeldung deiner Familie. {events.map((event) => (

{event.title}

Rückmeldung bis{" "} {format( new Date(event.rsvpDeadline ?? event.startDate), "dd.MM.yyyy HH:mm", { locale: de }, )}

))}
); } function RsvpDialog({ event }: { event: DashboardRsvpEventDto }) { const [open, setOpen] = useState(false); const [isPending, startTransition] = useTransition(); const initialSelection = useMemo( () => Object.fromEntries( event.children.map((child) => [child.id, child.status ?? ""]), ) as Record, [event.children], ); const [selection, setSelection] = useState(initialSelection); function submit() { const missingChild = event.children.find((child) => !selection[child.id]); if (missingChild) { toast.error(`Bitte Rückmeldung für ${missingChild.name} auswählen.`); return; } startTransition(async () => { for (const child of event.children) { const status = selection[child.id]; if (!status) continue; const result = await submitEventRsvp({ eventId: event.id, childId: child.id, status, }); if (result.error) { toast.error(result.error); return; } } toast.success("Rückmeldung gespeichert."); setOpen(false); }); } return ( { setOpen(nextOpen); if (nextOpen) setSelection(initialSelection); }} > Rückmeldung für {event.title} Wähle pro Kind aus, ob es am Termin teilnimmt.
{event.children.map((child) => (

{child.name}

{child.status && ( bereits gemeldet )}
))}
); }