import { Box, Stack, TextField, FormControlLabel, Checkbox, Button, Alert, } from "@mui/material"; import { useTranslation } from "react-i18next"; import { useState } from "react"; const phonePattern = /^[+]?[- 0-9()]{7,}$/; const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; export const MainForm = () => { const { t } = useTranslation(); const [invoice, setInvoice] = useState(false); const [paymentMethod, setPaymentMethod] = useState< "cash" | "paypal" | "transfer" | null >(null); const [formValues, setFormValues] = useState({ firstName: "", lastName: "", email: "", phoneNumber: "", tickets: "", code: "", companyName: "", invoiceFirstName: "", invoiceLastName: "", street: "", postalCode: "", invoicePhoneNumber: "", invoiceEmail: "", }); const [errors, setErrors] = useState>({}); const [submitting, setSubmitting] = useState(false); const [submitMessage, setSubmitMessage] = useState(null); const updateField = (field: keyof typeof formValues) => (event: React.ChangeEvent) => { setFormValues((prev) => ({ ...prev, [field]: event.target.value })); }; const validate = () => { const nextErrors: Record = {}; if (!formValues.firstName.trim()) nextErrors.firstName = "Required"; if (!formValues.lastName.trim()) nextErrors.lastName = "Required"; if (!formValues.email.trim()) nextErrors.email = "Required"; else if (!emailPattern.test(formValues.email)) nextErrors.email = "Invalid email"; if (!formValues.phoneNumber.trim()) nextErrors.phoneNumber = "Required"; else if (!phonePattern.test(formValues.phoneNumber)) nextErrors.phoneNumber = "Invalid phone number"; const ticketsNumber = Number(formValues.tickets); if (!formValues.tickets.trim()) nextErrors.tickets = "Required"; else if (!Number.isFinite(ticketsNumber) || ticketsNumber <= 0) nextErrors.tickets = "Must be a positive number"; if (!paymentMethod) nextErrors.paymentMethod = "Select a payment method"; if (!formValues.code.trim()) nextErrors.code = "Required"; if (invoice) { if (!formValues.companyName.trim()) nextErrors.companyName = "Required"; if (!formValues.invoiceFirstName.trim()) nextErrors.invoiceFirstName = "Required"; if (!formValues.invoiceLastName.trim()) nextErrors.invoiceLastName = "Required"; if (!formValues.street.trim()) nextErrors.street = "Required"; if (!formValues.postalCode.trim()) nextErrors.postalCode = "Required"; if (!formValues.invoicePhoneNumber.trim()) nextErrors.invoicePhoneNumber = "Required"; else if (!phonePattern.test(formValues.invoicePhoneNumber)) nextErrors.invoicePhoneNumber = "Invalid phone number"; if (!formValues.invoiceEmail.trim()) nextErrors.invoiceEmail = "Required"; else if (!emailPattern.test(formValues.invoiceEmail)) nextErrors.invoiceEmail = "Invalid email"; } setErrors(nextErrors); return Object.keys(nextErrors).length === 0; }; const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); setSubmitMessage(null); const isValid = validate(); if (!isValid) return; setSubmitting(true); try { const payload = { invoice, paymentMethod, firstName: formValues.firstName.trim(), lastName: formValues.lastName.trim(), email: formValues.email.trim(), phoneNumber: formValues.phoneNumber.trim(), tickets: Number(formValues.tickets), code: Number(formValues.code), invoiceDetails: invoice ? { companyName: formValues.companyName.trim(), firstName: formValues.invoiceFirstName.trim(), lastName: formValues.invoiceLastName.trim(), street: formValues.street.trim(), postalCode: formValues.postalCode.trim(), phoneNumber: formValues.invoicePhoneNumber.trim(), email: formValues.invoiceEmail.trim(), } : null, }; const response = await fetch("http://localhost:8004/default/frontend", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }); if (!response.ok) { throw new Error(`Request failed with status ${response.status}`); } setSubmitMessage("Submitted successfully."); } catch (error) { setSubmitMessage("Submit failed. Please try again."); } finally { setSubmitting(false); } }; return ( setInvoice(event.target.checked)} /> } label={t("invoice")} /> {invoice && ( )} {/* Payment methods - only one must be selected */} setPaymentMethod((current) => current === "cash" ? null : "cash" ) } /> } label={t("cash")} sx={{ color: errors.paymentMethod ? "error.main" : undefined }} /> setPaymentMethod((current) => current === "paypal" ? null : "paypal" ) } /> } label={t("paypal")} sx={{ color: errors.paymentMethod ? "error.main" : undefined }} /> setPaymentMethod((current) => current === "transfer" ? null : "transfer" ) } /> } label={t("transfer")} sx={{ color: errors.paymentMethod ? "error.main" : undefined }} /> {submitMessage && ( {submitMessage} )} ); };