From 1801c9e1923db14af8182570d1247b666ae6aa7f Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 19:58:28 +0000 Subject: [PATCH] Changes --- src/components/AbonnemangForm.tsx | 249 ++++++++++++++++++++++++++++++ src/components/PlansSection.tsx | 33 +++- 2 files changed, 278 insertions(+), 4 deletions(-) create mode 100644 src/components/AbonnemangForm.tsx diff --git a/src/components/AbonnemangForm.tsx b/src/components/AbonnemangForm.tsx new file mode 100644 index 0000000..65a923f --- /dev/null +++ b/src/components/AbonnemangForm.tsx @@ -0,0 +1,249 @@ +import { useState } from "react"; +import { z } from "zod"; + +const formSchema = z.object({ + företag: z.string().trim().min(1, "Fyll i företagsnamn").max(100), + kontaktperson: z.string().trim().max(100).optional(), + epost: z.string().trim().email("Ange en giltig e-postadress").max(255), + telefon: z.string().trim().max(20).optional(), + adress: z.string().trim().max(200).optional(), + postnummer: z.string().trim().max(10).optional(), + stad: z.string().trim().max(100).optional(), + abonnemang: z.string().min(1, "Välj ett abonnemang"), + kommentarer: z.string().trim().max(1000).optional(), +}); + +interface AbonnemangFormProps { + selectedPlan?: string; + onClose?: () => void; +} + +const AbonnemangForm = ({ selectedPlan, onClose }: AbonnemangFormProps) => { + const [formData, setFormData] = useState({ + företag: "", + kontaktperson: "", + epost: "", + telefon: "", + adress: "", + postnummer: "", + stad: "", + abonnemang: selectedPlan || "", + kommentarer: "", + }); + + const [submitted, setSubmitted] = useState(false); + const [errors, setErrors] = useState>({}); + + const handleChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; + setFormData({ ...formData, [name]: value }); + // Clear error when user types + if (errors[name]) { + setErrors({ ...errors, [name]: "" }); + } + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setErrors({}); + + const result = formSchema.safeParse(formData); + if (!result.success) { + const fieldErrors: Record = {}; + result.error.errors.forEach((err) => { + if (err.path[0]) { + fieldErrors[err.path[0] as string] = err.message; + } + }); + setErrors(fieldErrors); + return; + } + + // For now, just show success - backend integration can be added later + setSubmitted(true); + }; + + if (submitted) { + return ( +
+
+ +
+

+ Tack för din beställning! +

+

+ Vi har tagit emot din beställning för{" "} + {formData.abonnemang} och + kontaktar dig inom kort. +

+ {onClose && ( + + )} +
+ ); + } + + return ( +
+
+

+ Beställ abonnemang +

+

+ Fyll i formuläret så kontaktar vi dig +

+
+ + {/* Företagsnamn */} +
+ + + {errors.företag && ( +

{errors.företag}

+ )} +
+ + {/* Kontaktperson */} +
+ + +
+ + {/* E-post & Telefon */} +
+
+ + + {errors.epost && ( +

{errors.epost}

+ )} +
+
+ + +
+
+ + {/* Adress */} +
+ + +
+ + {/* Postnummer & Stad */} +
+
+ + +
+
+ + +
+
+ + {/* Abonnemang */} +
+ + + {errors.abonnemang && ( +

{errors.abonnemang}

+ )} +
+ + {/* Kommentarer */} +
+ +