"use client"; import { useEffect, useState } from "react"; import Image from "next/image"; import { useRouter } from "next/navigation"; interface EventContent { volunteerAreas: string; } const isValidEmail = (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value); const normalizeMobileNumber = (value: string) => { const digitsOnly = value.replace(/\D/g, ""); if (digitsOnly.startsWith("0046")) return `0${digitsOnly.slice(4)}`; if (digitsOnly.startsWith("46")) return `0${digitsOnly.slice(2)}`; if (digitsOnly.startsWith("7")) return `0${digitsOnly}`; return digitsOnly; }; const isValidMobileNumber = (value: string) => /^07\d{8}$/.test(normalizeMobileNumber(value)); export default function VolunteerPage() { const router = useRouter(); const [content, setContent] = useState(null); const [formData, setFormData] = useState({ firstName: "", surName: "", phoneNumber: "", email: "", hasApprovedGdpr: false, selectedAreas: [] as string[], }); const [isSubmitting, setIsSubmitting] = useState(false); const [message, setMessage] = useState({ type: "", text: "" }); const [fieldErrors, setFieldErrors] = useState>({}); useEffect(() => { fetch("/api/Content") .then((res) => res.json()) .then((data) => setContent(data)) .catch((err) => console.error("Failed to fetch content", err)); }, []); const handleInputChange = (e: React.ChangeEvent) => { const { name, value, type, checked } = e.target; setFormData((prev) => ({ ...prev, [name]: type === "checkbox" ? checked : value, })); setFieldErrors((prev) => ({ ...prev, [name]: "", })); }; const handleAreaToggle = (area: string) => { setFormData((prev) => { const areas = prev.selectedAreas.includes(area) ? prev.selectedAreas.filter((a) => a !== area) : [...prev.selectedAreas, area]; return { ...prev, selectedAreas: areas }; }); setFieldErrors((prev) => ({ ...prev, selectedAreas: "", })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const trimmedFirstName = formData.firstName.trim(); const trimmedSurName = formData.surName.trim(); const trimmedPhoneNumber = formData.phoneNumber.trim(); const trimmedEmail = formData.email.trim(); const normalizedPhoneNumber = normalizeMobileNumber(trimmedPhoneNumber); const nextFieldErrors: Record = {}; if (!trimmedFirstName) nextFieldErrors.firstName = "Förnamn är obligatoriskt."; if (!trimmedSurName) nextFieldErrors.surName = "Efternamn är obligatoriskt."; if (!trimmedPhoneNumber) nextFieldErrors.phoneNumber = "Mobilnummer är obligatoriskt."; if (!trimmedEmail) nextFieldErrors.email = "E-post är obligatorisk."; if (trimmedEmail && !isValidEmail(trimmedEmail)) { nextFieldErrors.email = "E-postadressen är ogiltig."; } if (trimmedPhoneNumber && !isValidMobileNumber(trimmedPhoneNumber)) { nextFieldErrors.phoneNumber = "Mobilnummer måste vara ett giltigt svenskt mobilnummer."; } if (formData.selectedAreas.length === 0) { nextFieldErrors.selectedAreas = "Vänligen välj minst ett område du vill hjälpa till med."; } if (Object.keys(nextFieldErrors).length > 0) { setFieldErrors(nextFieldErrors); setMessage({ type: "error", text: "Kontrollera markerade fält och försök igen.", }); return; } setFieldErrors({}); setIsSubmitting(true); setMessage({ type: "info", text: "Skickar in din ansökan..." }); try { const payload = { firstName: trimmedFirstName, surName: trimmedSurName, phoneNumber: normalizedPhoneNumber, email: trimmedEmail, hasApprovedGdpr: formData.hasApprovedGdpr, areasOfInterest: formData.selectedAreas.map((name) => ({ name: name.trim(), })), }; const response = await fetch("/api/Volunteer/register", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(payload), }); if (response.ok) { setMessage({ type: "success", text: "Tack för din ansökan! Vi kommer kontakta dig snart.", }); setFormData({ firstName: "", surName: "", phoneNumber: "", email: "", hasApprovedGdpr: false, selectedAreas: [], }); } else { const errorData = await response.json(); setMessage({ type: "error", text: errorData.message || "Ett fel uppstod vid registreringen.", }); } } catch (error) { console.error("Volunteer registration error:", error); setMessage({ type: "error", text: "Kunde inte ansluta till servern. Försök igen senare.", }); } finally { setIsSubmitting(false); } }; const areas = content?.volunteerAreas?.split("\n").filter((a) => a.trim()) || []; return (
vBytes

Bli Funktionär

Fyll i formuläret för att anmäla ditt intresse som funktionär under LANet.

{fieldErrors.firstName && (

{fieldErrors.firstName}

)}
{fieldErrors.surName && (

{fieldErrors.surName}

)}
{fieldErrors.phoneNumber && (

{fieldErrors.phoneNumber}

)}
{fieldErrors.email && (

{fieldErrors.email}

)}
{areas.map((area) => ( ))}
{fieldErrors.selectedAreas && (

{fieldErrors.selectedAreas}

)}

Jag godkänner att mina personuppgifter behandlas i syfte för detta evenemang.

{message.text && (
{message.text}
)}
); }