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:
parent
8131e9cac2
commit
7524d34e46
166
app/page.tsx
166
app/page.tsx
|
|
@ -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"}
|
||||
|
|
|
|||
|
|
@ -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 = "20–28 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) ──
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue