"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 April 30, 2026
{/* Ticket */}
CCG 2026 Ticket
€80 Early bird (until Apr 30) · €120 Regular (May-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

All payments are processed securely through Stripe. 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 */}