Simplify registration form to name/email only, set event dates and location

- Remove contact, contributions, expectations, howHeard, dietary, and participation commitment fields
- Set event dates to 20–28 June 2026, location to Commons Hub Austria (Reichenau an der Rax)
- Update accommodation to 8 nights with recalculated prices

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-03-20 12:57:41 -07:00
parent 8131e9cac2
commit 7524d34e46
2 changed files with 9 additions and 171 deletions

View File

@ -6,7 +6,7 @@ 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"
@ -42,13 +42,6 @@ export default function RegisterPage() {
const [formData, setFormData] = useState({
name: "",
email: "",
contact: "",
contributions: "",
expectations: "",
howHeard: "",
dietary: [] as string[],
dietaryOther: "",
crewConsent: "",
})
const tier = getClientTier()
@ -66,11 +59,7 @@ export default function RegisterPage() {
// Validate required fields
if (
!formData.name ||
!formData.email ||
!formData.contact ||
!formData.contributions ||
!formData.expectations ||
!formData.crewConsent
!formData.email
) {
alert("Please fill in all required fields")
return
@ -80,10 +69,6 @@ export default function RegisterPage() {
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: {
@ -92,13 +77,6 @@ export default function RegisterPage() {
body: JSON.stringify({
name: formData.name,
email: formData.email,
contact: formData.contact,
contributions: formData.contributions,
expectations: formData.expectations,
howHeard: formData.howHeard,
dietary: dietaryString,
crewConsent: formData.crewConsent,
}),
})
@ -116,13 +94,6 @@ export default function RegisterPage() {
}
}
const handleDietaryChange = (value: string, checked: boolean) => {
setFormData((prev) => ({
...prev,
dietary: checked ? [...prev.dietary, value] : prev.dietary.filter((item) => item !== value),
}))
}
// Pricing summary line
const pricingSummary = PRICING_TIERS.map(
(t) => `${t.price} ${t.label}${t === tier ? " (current)" : ""}`
@ -359,139 +330,6 @@ export default function RegisterPage() {
</p>
</div>
{/* Contact */}
<div className="space-y-2">
<Label htmlFor="contact">How can we contact you besides via email? *</Label>
<Input
id="contact"
required
placeholder="Telegram, Signal, phone, etc."
value={formData.contact}
onChange={(e) => setFormData({ ...formData, contact: e.target.value })}
/>
</div>
{/* Contributions */}
<div className="space-y-2">
<Label htmlFor="contributions">What do you want to contribute to {EVENT_SHORT}? *</Label>
<Textarea
id="contributions"
required
placeholder="This could be a talk, workshop, research inquiry, prototype, game, performance, etc."
className="min-h-[120px]"
value={formData.contributions}
onChange={(e) => setFormData({ ...formData, contributions: e.target.value })}
/>
<p className="text-sm text-muted-foreground">
This event is participant-driven each attendee is invited to co-create the program.
</p>
</div>
{/* Expectations */}
<div className="space-y-2">
<Label htmlFor="expectations">What do you expect to gain from participating? *</Label>
<Textarea
id="expectations"
required
placeholder="What are you looking for in particular?"
className="min-h-[100px]"
value={formData.expectations}
onChange={(e) => setFormData({ ...formData, expectations: e.target.value })}
/>
</div>
{/* How heard */}
<div className="space-y-2">
<Label htmlFor="howHeard">How did you hear about {EVENT_SHORT}?</Label>
<Input
id="howHeard"
placeholder="First timers: Did anyone recommend it to you?"
value={formData.howHeard}
onChange={(e) => setFormData({ ...formData, howHeard: e.target.value })}
/>
</div>
{/* Dietary Requirements */}
<div className="space-y-3">
<Label>Dietary Requirements</Label>
<p className="text-sm text-muted-foreground">
Do you have any special dietary requirements?
</p>
<div className="space-y-2">
{["vegetarian", "vegan", "gluten free", "lactose free"].map((diet) => (
<div key={diet} className="flex items-center space-x-2">
<Checkbox
id={diet}
checked={formData.dietary.includes(diet)}
onCheckedChange={(checked) => handleDietaryChange(diet, checked as boolean)}
/>
<Label htmlFor={diet} className="font-normal cursor-pointer">
{diet.charAt(0).toUpperCase() + diet.slice(1)}
</Label>
</div>
))}
<div className="flex items-start space-x-2 mt-2">
<Checkbox
id="other"
checked={!!formData.dietaryOther}
onCheckedChange={(checked) => {
if (!checked) setFormData({ ...formData, dietaryOther: "" })
}}
/>
<div className="flex-1">
<Label htmlFor="other" className="font-normal cursor-pointer">
Other:
</Label>
<Input
id="dietaryOther"
className="mt-1"
placeholder="Please specify..."
value={formData.dietaryOther}
onChange={(e) => setFormData({ ...formData, dietaryOther: e.target.value })}
/>
</div>
</div>
</div>
</div>
{/* Participation Consent */}
<div className="space-y-3">
<Label>Participation Commitment *</Label>
<div className="bg-muted p-4 rounded-lg space-y-2 text-sm">
<p>
{EVENT_SHORT} is a collaborative event participants co-create its program,
activities, and atmosphere together.
</p>
<p className="font-medium">
You will be expected to actively contribute to the event beyond just attending sessions.
</p>
</div>
<RadioGroup
required
value={formData.crewConsent}
onValueChange={(value) => setFormData({ ...formData, crewConsent: value })}
>
<div className="flex items-center space-x-2">
<RadioGroupItem value="cant-wait" id="cant-wait" />
<Label htmlFor="cant-wait" className="font-normal cursor-pointer">
Can't wait
</Label>
</div>
<div className="flex items-center space-x-2">
<RadioGroupItem value="yes-please" id="yes-please" />
<Label htmlFor="yes-please" className="font-normal cursor-pointer">
Yes please, sign me up!
</Label>
</div>
<div className="flex items-center space-x-2">
<RadioGroupItem value="love-it" id="love-it" />
<Label htmlFor="love-it" className="font-normal cursor-pointer">
I love getting my hands dirty :D
</Label>
</div>
</RadioGroup>
</div>
<div className="pt-4">
<Button type="submit" className="w-full" size="lg" disabled={isSubmitting}>
{isSubmitting ? "Recording registration..." : "Continue to Payment"}

View File

@ -12,8 +12,8 @@ export const EVENT_NAME = "CoFi"
export const EVENT_FULL_NAME = "Collaborative Finance"
export const EVENT_YEAR = 2026
export const EVENT_TAGLINE = "Reimagining finance for the commons"
export const EVENT_DATES = "TBD, 2026"
export const EVENT_LOCATION = "TBD"
export const EVENT_DATES = "2028 June 2026"
export const EVENT_LOCATION = "Commons Hub Austria (Reichenau an der Rax)"
export const EVENT_SHORT = `${EVENT_NAME} ${EVENT_YEAR}`
// ── Ticket pricing tiers (EUR) ────────────────────────────────────
@ -74,7 +74,7 @@ export const ACCOMMODATION_VENUES: AccommodationVenue[] = [
{
id: "va-shared",
label: "Bed in shared room",
price: 275,
price: 312,
nightlyRate: 39,
venue: "Venue A",
venueKey: "venue-a",
@ -82,7 +82,7 @@ export const ACCOMMODATION_VENUES: AccommodationVenue[] = [
{
id: "va-double",
label: "Bed in double room",
price: 350,
price: 400,
nightlyRate: 50,
venue: "Venue A",
venueKey: "venue-a",
@ -97,7 +97,7 @@ export const ACCOMMODATION_VENUES: AccommodationVenue[] = [
{
id: "vb-single",
label: "Single room",
price: 665,
price: 760,
nightlyRate: 95,
venue: "Venue B",
venueKey: "venue-b",
@ -105,7 +105,7 @@ export const ACCOMMODATION_VENUES: AccommodationVenue[] = [
{
id: "vb-double",
label: "Double room (per person)",
price: 350,
price: 400,
nightlyRate: 50,
venue: "Venue B",
venueKey: "venue-b",
@ -120,7 +120,7 @@ export const ACCOMMODATION_MAP: Record<string, AccommodationOption> = Object.fro
)
/** Number of nights (used in display) */
export const ACCOMMODATION_NIGHTS = 7
export const ACCOMMODATION_NIGHTS = 8
// ── Booking sheet criteria (maps accommodation IDs to bed search criteria) ──