"use client"; import { type FormEvent, useState, useTransition } from "react"; import { Pencil, Plus, Trash2 } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { ConfirmDialog } from "@/components/ui/confirm-dialog"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { getChildBirthdateRange } from "@/lib/child-birthdate"; import { createMyChild, deleteMyChild, updateMyChild } from "../actions"; export type MyChild = { id: string; firstName: string; lastName: string; dateOfBirth: string | null; }; type ChildPayload = { firstName: string; lastName: string; dateOfBirth: string; }; const emptyChildPayload: ChildPayload = { firstName: "", lastName: "", dateOfBirth: "", }; export function MyChildrenManager({ items, canManage, }: { items: MyChild[]; canManage: boolean; }) { const [createOpen, setCreateOpen] = useState(false); const [createPayload, setCreatePayload] = useState(emptyChildPayload); const [editingChild, setEditingChild] = useState(null); const [editPayload, setEditPayload] = useState(emptyChildPayload); const [childToDelete, setChildToDelete] = useState(null); const [isPending, startTransition] = useTransition(); function openEditor(child: MyChild) { setEditingChild(child); setEditPayload(payloadFromChild(child)); } function handleCreate(event: FormEvent) { event.preventDefault(); startTransition(async () => { const result = await createMyChild(createPayload); if (result.error) { toast.error(result.error); return; } toast.success("Kind angelegt."); setCreatePayload(emptyChildPayload); setCreateOpen(false); }); } function handleUpdate(event: FormEvent) { event.preventDefault(); if (!editingChild) return; startTransition(async () => { const result = await updateMyChild(editingChild.id, editPayload); if (result.error) { toast.error(result.error); return; } toast.success("Kind aktualisiert."); setEditingChild(null); }); } function handleDelete(child: MyChild) { startTransition(async () => { const result = await deleteMyChild(child.id); if (result.error) { toast.error(result.error); return; } toast.success("Kind entfernt."); setChildToDelete(null); }); } return (
{items.length === 0 ? (

Keine Kinder verknüpft.

) : (
{items.map((child) => (
{getInitials(child)}

{child.firstName} {child.lastName}

{child.dateOfBirth ? (

Geboren am{" "} {new Date(child.dateOfBirth).toLocaleDateString("de-DE")}

) : (

Geburtsdatum fehlt

)}
))}
)} {canManage ? ( { setCreateOpen(open); if (!open) setCreatePayload(emptyChildPayload); }} >
Kind hinzufügen Dieses Kind wird mit deinem Haushalt verknüpft.
) : (

Dein Account ist noch keinem Haushalt zugeordnet.

)} !open && setEditingChild(null)} >
Kind bearbeiten {editingChild && ( )}
{ if (!open) setChildToDelete(null); }} title="Kind entfernen?" description={ childToDelete ? `${childToDelete.firstName} ${childToDelete.lastName} wird aus deinem Haushalt entfernt.` : "Dieses Kind wird aus deinem Haushalt entfernt." } confirmLabel="Entfernen" pendingLabel="Wird entfernt..." isPending={isPending} onConfirm={() => { if (childToDelete) handleDelete(childToDelete); }} />
); } function ChildFields({ idPrefix, value, onChange, }: { idPrefix: string; value: ChildPayload; onChange: (value: ChildPayload) => void; }) { const birthdateRange = getChildBirthdateRange(); return (
onChange({ ...value, firstName: event.target.value }) } required />
onChange({ ...value, lastName: event.target.value }) } required />
onChange({ ...value, dateOfBirth: event.target.value }) } />
); } function payloadFromChild(child: MyChild): ChildPayload { return { firstName: child.firstName, lastName: child.lastName, dateOfBirth: child.dateOfBirth ?? "", }; } function getInitials(child: MyChild) { return `${child.firstName[0] ?? ""}${child.lastName[0] ?? ""}`.toUpperCase(); }