"use client" import type React from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Checkbox } from "@/components/ui/checkbox" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import Link from "next/link" import { useState } from "react" export default function RegisterPage() { const [step, setStep] = useState<"form" | "payment">("form") const [isSubmitting, setIsSubmitting] = useState(false) const [includeAccommodation, setIncludeAccommodation] = useState(true) const [accommodationType, setAccommodationType] = useState<"dorm" | "double">("dorm") const [includeFood, setIncludeFood] = useState(true) const [formData, setFormData] = useState({ name: "", contact: "", contributions: "", expectations: "", howHeard: "", dietary: [] as string[], dietaryOther: "", crewConsent: "", }) const baseTicketPrice = 80 // Early bird price €80 const dormPrice = 235.20 // €39.20/night x 6 nights const doublePrice = 301.20 // €50.20/night x 6 nights const foodPrice = 135 // 6 days of meals const accommodationPrice = accommodationType === "dorm" ? dormPrice : doublePrice const totalPrice = baseTicketPrice + (includeAccommodation ? accommodationPrice : 0) + (includeFood ? foodPrice : 0) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() // Validate required fields if ( !formData.name || !formData.contact || !formData.contributions || !formData.expectations || !formData.crewConsent ) { alert("Please fill in all required fields") return } setIsSubmitting(true) try { // Submit registration to Google Sheet first const dietaryString = formData.dietary.join(", ") + (formData.dietaryOther ? `, ${formData.dietaryOther}` : "") const response = await fetch("/api/register", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ name: formData.name, contact: formData.contact, contributions: formData.contributions, expectations: formData.expectations, howHeard: formData.howHeard, dietary: dietaryString, crewConsent: formData.crewConsent, }), }) if (!response.ok) { throw new Error("Failed to record registration") } // Proceed to payment step setStep("payment") } catch (error) { console.error("Registration error:", error) alert("There was an error recording your registration. Please try again.") } finally { setIsSubmitting(false) } } const handleDietaryChange = (value: string, checked: boolean) => { setFormData((prev) => ({ ...prev, dietary: checked ? [...prev.dietary, value] : prev.dietary.filter((item) => item !== value), })) } if (step === "payment") { return (
{/* Header */}
CCG

Complete Your Registration

Choose your payment method

Event Registration Early bird pricing available until March 31, 2026
{/* Ticket */}
CCG 2026 Ticket
€80 Early bird (until Mar 31) · €120 Regular (Apr-Jun) · €150 Late (after Jul 1)
CCA members: Bring two newcomers, get a free ticket!
€{baseTicketPrice.toFixed(2)}
{/* Accommodation */}
setIncludeAccommodation(checked as boolean)} className="mt-1" />
{includeAccommodation && ( €{accommodationPrice.toFixed(2)} )}
{includeAccommodation ? (
setAccommodationType(value as "dorm" | "double")} className="space-y-2" >

30 beds on-site. Nearby options (Herrnhof.at, Gasthof Kobald) also available — see{" "} Transparency page.

) : (

I'll arrange my own accommodation

)}
{/* Food */}
setIncludeFood(checked as boolean)} className="mt-1" />
{includeFood && ( €{foodPrice.toFixed(2)} )}
{includeFood ? (

Breakfast buffet, catered lunches & dinners (vegetarian/vegan + meat options), coffee & tea throughout the day.

) : (

I'll arrange my own meals

)}
{(includeAccommodation || includeFood) && (

We'll follow up with you closer to the event to confirm accommodation and food details, including room assignments and any dietary needs.

)} {/* Total */}
Total Amount
Ticket{includeAccommodation ? " + accommodation" : ""}{includeFood ? " + food" : ""}
€{totalPrice.toFixed(2)}
{/* Payment Methods */}
Payment Options Choose your preferred payment method

You'll be redirected to Mollie's secure checkout where you can pay by credit card, SEPA bank transfer, iDEAL, PayPal, or other methods.

All payments are processed securely through Mollie. You'll receive a confirmation email after successful payment.

{/* Footer */}
) } return (
{/* Header */}
CCG

Register for CCG 2026

August 16-22, 2026 at the Commons Hub in Austria

Registration Form Tell us about yourself and what you'd like to bring to CCG
{/* Name */}
setFormData({ ...formData, name: e.target.value })} />
{/* Contact */}
setFormData({ ...formData, contact: e.target.value })} />
{/* Contributions */}