"use client"; import { useMemo, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { ticketTiers, paymentMethods } from "@/content/tickets"; import { calculateTotal } from "@/lib/payment"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { DataConsentField } from "@/components/forms/DataConsentField"; import { dataConsent } from "@/content/consent"; import { cn } from "@/lib/utils"; export function PaymentForm() { const searchParams = useSearchParams(); const router = useRouter(); const initialTicket = searchParams.get("ticket") ?? ticketTiers[0].id; const [ticketId, setTicketId] = useState(initialTicket); const [quantity, setQuantity] = useState(1); const [paymentMethod, setPaymentMethod] = useState<"card" | "bank">("card"); const [status, setStatus] = useState<"idle" | "loading" | "error">("idle"); const [error, setError] = useState(""); const [consent, setConsent] = useState(false); const tier = ticketTiers.find((t) => t.id === ticketId) ?? ticketTiers[0]; const total = useMemo(() => calculateTotal(ticketId, quantity), [ticketId, quantity]); async function onSubmit(e: React.FormEvent) { e.preventDefault(); if (!consent) { setError(dataConsent.errorMessage); return; } setStatus("loading"); setError(""); const form = e.currentTarget; const data = new FormData(form); try { const res = await fetch("/api/payment", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ticketId, quantity, paymentMethod, name: data.get("name"), email: data.get("email"), company: data.get("company") || undefined, phone: data.get("phone") || undefined, consent: true, }), }); const json = await res.json(); if (!res.ok || !json.ok) { throw new Error(json.error || "Payment failed"); } router.push(`/payment/success?order=${json.orderId}&total=${json.totalUsd}`); } catch (err) { setStatus("error"); setError(err instanceof Error ? err.message : "Payment failed"); } } return (
{ticketTiers.map((t) => ( ))}
{paymentMethods.map((m) => ( ))}
{error &&

{error}

}
Order summary {tier.description}
    {tier.features.map((f) => (
  • · {f}
  • ))}
{tier.name} × {quantity} ${tier.priceUsd * quantity}
Total ${total} USD

Payments are processed securely. v1 records your order for follow-up.

); }