>
);
}
// ---------------------------------------------------------------------------
// Main manage page
// ---------------------------------------------------------------------------
function ManageRegistrationPage() {
const { token } = useParams({ from: "/manage/$token" });
const queryClient = useQueryClient();
const [isEditing, setIsEditing] = useState(false);
const { data, isLoading, error } = useQuery({
...orpc.getRegistrationByToken.queryOptions({ input: { token } }),
});
const cancelMutation = useMutation({
...orpc.cancelRegistration.mutationOptions(),
onSuccess: () => {
toast.success("Inschrijving geannuleerd");
queryClient.invalidateQueries({ queryKey: ["getRegistrationByToken"] });
},
onError: (err) => {
toast.error(`Annuleren mislukt: ${err.message}`);
},
});
const checkoutMutation = useMutation({
...orpc.getCheckoutUrl.mutationOptions(),
onSuccess: (result) => {
window.location.href = result.checkoutUrl;
},
onError: (err) => {
toast.error(`Betaling starten mislukt: ${err.message}`);
},
});
function handleCancel() {
if (
confirm(
"Weet je zeker dat je je inschrijving wilt annuleren? Dit kan niet ongedaan worden gemaakt.",
)
) {
cancelMutation.mutate({ token });
}
}
function handleSaved() {
queryClient.invalidateQueries({ queryKey: ["getRegistrationByToken"] });
setIsEditing(false);
}
// Loading state
if (isLoading) {
return (
Jouw inschrijving
Open Mic Night — vrijdag 24 april 2026
{/* Type badge */}
{isPerformer ? "Artiest" : "Bezoeker"}
{!isPerformer && (
— Drinkkaart €{data.drinkCardValue ?? 5}
{viewGuests.length > 0 && ` (${1 + viewGuests.length} personen)`}
)}
{/* Payment status badge:
- performers only see a badge if they have a gift to pay, or already paid one
- watchers always have a payment (drink card), so always show a badge */}
{(isPerformer ? (data.giftAmount ?? 0) > 0 : true) && (
{data.paymentStatus === "paid" ? (
) : data.paymentStatus === "extra_payment_pending" ? (
) : (
)}
)}
{/* Gift display */}
{(data.giftAmount ?? 0) > 0 && (
Vrijwillige gift: €{(data.giftAmount ?? 0) / 100}
)}
{/* Registration details */}
Voornaam
{data.firstName}
Achternaam
{data.lastName}
Telefoon
{data.phone || "—"}
{isPerformer && (
Optreden
{data.artForm || "—"}
{data.experience && (
({data.experience})
)}
{data.isOver16 ? "16+ bevestigd" : "Leeftijd niet bevestigd"}
)}
{!isPerformer && viewGuests.length > 0 && (
Medebezoekers ({viewGuests.length})
{viewGuests.map((g, idx) => (
{g.firstName} {g.lastName}
{g.email && (
{g.email}
)}
{g.phone && (
{g.phone}
)}
))}
)}
{data.extraQuestions && (
Vragen of opmerkingen
{data.extraQuestions}
)}
{/* Actions */}
{/* Show pay button if there's something to pay (for watchers: drink card, for performers: gift) */}
{(data.paymentStatus === "pending" ||
data.paymentStatus === "extra_payment_pending") &&
(!isPerformer || (data.giftAmount ?? 0) > 0) && (
checkoutMutation.mutate({ token })}
disabled={checkoutMutation.isPending}
className={`px-8 py-3 font-['Intro',sans-serif] text-lg transition-all hover:scale-105 disabled:opacity-50 ${data.paymentStatus === "extra_payment_pending" ? "bg-orange-400 text-white hover:bg-orange-300" : isPerformer ? "bg-pink-400 text-white hover:bg-pink-300" : "bg-teal-400 text-[#214e51] hover:bg-teal-300"}`}
>
{checkoutMutation.isPending
? "Laden..."
: data.paymentStatus === "extra_payment_pending"
? `Extra betalen (€${((data.paymentAmount ?? 0) / 100).toFixed(0)})`
: isPerformer
? `Gift betalen (€${((data.giftAmount ?? 0) / 100).toFixed(0)})`
: "Nu betalen"}
)}
setIsEditing(true)}
className="bg-white px-8 py-3 font-['Intro',sans-serif] text-[#214e51] text-lg transition-all hover:scale-105 hover:bg-gray-100"
>
Bewerken
{cancelMutation.isPending ? "Annuleren..." : "Inschrijving annuleren"}
Deze link is uniek voor jouw inschrijving. Bewaar deze pagina of de
bevestigingsmail om je gegevens later aan te passen.
);
}