// app/beach/BeachRegistrationForm.tsx 'use client'; import { Turnstile, TurnstileInstance } from '@marsidev/react-turnstile'; import React, { useRef, useState } from 'react'; import { PiCheckCircle, PiWarningCircle } from "react-icons/pi"; interface AlertState { show: boolean; type: 'success' | 'danger' | ''; message: string; } interface SubmitResponse { success: boolean; message: string; detail?: string; } export default function BeachRegistrationForm() { const [isSubmitting, setIsSubmitting] = useState(false); const [wasValidated, setWasValidated] = useState(false); const [alert, setAlert] = useState({ show: false, type: '', message: '' }); const formRef = useRef(null); const turnstileRef = useRef(null); const handleSubmit: React.FormEventHandler = async (e) => { e.preventDefault(); const form = formRef.current; if (!form) return; setWasValidated(true); if (!form.checkValidity()) return; setIsSubmitting(true); setAlert({ show: false, type: '', message: '' }); const formData = new FormData(form); try { const response = await fetch('/api/submit', { method: 'POST', body: formData, }); if (!response.ok) throw new Error(`Network error: ${response.status}`); const result = (await response.json()) as SubmitResponse; const message = result.detail ? `${result.message} ${result.detail}` : result.message; setAlert({ show: true, type: result.success ? 'success' : 'danger', message: message, }); if (result.success) { form.reset(); setWasValidated(false); if (turnstileRef.current) turnstileRef.current.reset(); } } catch (error) { setAlert({ show: true, type: 'danger', message: 'Ett tekniskt fel uppstod. Försök igen senare.', }); } finally { setIsSubmitting(false); } }; return (

Anmälningsformulär

{/* INPUT FÄLT (Namn, Email, Tel, Lagnamn, Antal) */} {[ { name: 'name', type: 'text', placeholder: 'Ditt namn', auto: 'name', error: 'Glöm inte ditt namn!' }, { name: 'email', type: 'email', placeholder: 'Email', auto: 'email', error: 'Emailadressen är inte giltig.' }, { name: 'tel', type: 'tel', placeholder: 'Telefonnummer', auto: 'tel', error: 'Glöm inte ett telefonnummer!' }, { name: 'team', type: 'text', placeholder: 'Lagnamn', auto: 'organization', error: 'Glöm inte ert lagnamn!' }, ].map((f) => (
{f.error}
))}
Glöm inte ange antal lagmedlemmar!
{/* RADIOS */}
{[ { id: 'level-gron', val: 'Grön', label: 'Grön', color: 'text-green-700', accent: 'accent-green-600', desc: '(Nybörjare)' }, { id: 'level-bla', val: 'Blå', label: 'Blå', color: 'text-[#0f65bf]', accent: 'accent-[#0f65bf]', desc: '(Spelat lite)' }, { id: 'level-svart', val: 'Svart', label: 'Svart', color: 'text-black', accent: 'accent-black', desc: '(Spelat mycket)' }, ].map((l) => (
))}
Glöm inte ange spelarnivå!