import { useState, useEffect } from "react"; import { z } from "zod"; import { useAuth } from "@/hooks/useAuth"; import { supabase } from "@/integrations/supabase/client"; // Validate Stockholm postal codes (100 00 - 199 99) const isStockholmPostalCode = (postalCode: string) => { const cleaned = postalCode.replace(/\s/g, ""); if (!/^\d{5}$/.test(cleaned)) return false; const num = parseInt(cleaned, 10); return num >= 10000 && num <= 19999; }; // Get error message for postal code (for real-time validation display) const getPostalCodeError = (postalCode: string) => { if (!postalCode || postalCode.trim() === "") return null; const cleaned = postalCode.replace(/\s/g, ""); if (cleaned.length < 5) return null; // Don't show error while typing if (!/^\d{5}$/.test(cleaned)) return "Ange ett giltigt postnummer (5 siffror)"; const num = parseInt(cleaned, 10); if (num < 10000 || num > 19999) { return "Vi levererar endast inom Storstockholm (100 00 – 199 99)"; } return null; }; const formSchema = z.object({ företag: z.string().trim().min(1, "Fyll i företagsnamn").max(100), 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() .min(1, "Fyll i postnummer för leverans") .max(10) .refine( (val) => isStockholmPostalCode(val), { message: "Vi levererar endast inom Storstockholm (100 00 – 199 99)" } ), 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 { user } = useAuth(); const [formData, setFormData] = useState({ företag: "", epost: "", telefon: "", adress: "", postnummer: "", stad: "", abonnemang: selectedPlan || "", kommentarer: "", }); const [submitted, setSubmitted] = useState(false); const [errors, setErrors] = useState>({}); // Pre-fill form with user's profile data if logged in useEffect(() => { const fetchProfileData = async () => { if (user) { const { data } = await supabase .from("profiles") .select("display_name, phone, address") .eq("user_id", user.id) .maybeSingle(); if (data) { setFormData((prev) => ({ ...prev, telefon: data.phone || prev.telefon, epost: user.email || prev.epost, adress: data.address?.split(",")[0]?.trim() || prev.adress, })); } else { setFormData((prev) => ({ ...prev, epost: user.email || prev.epost, })); } } }; fetchProfileData(); }, [user]); 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 saveAddressToProfile = async () => { if (!user) return; // Combine address fields into one string const fullAddress = [ formData.adress, formData.postnummer && formData.stad ? `${formData.postnummer} ${formData.stad}` : formData.postnummer || formData.stad, ] .filter(Boolean) .join(", "); if (fullAddress) { await supabase .from("profiles") .update({ address: fullAddress, phone: formData.telefon || null, }) .eq("user_id", user.id); } }; 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; } // Save address to profile if user is logged in await saveAddressToProfile(); // 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}

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

{errors.epost}

)}
{/* Adress */}
{/* Postnummer & Stad */}
{(errors.postnummer || getPostalCodeError(formData.postnummer)) && (

{errors.postnummer || getPostalCodeError(formData.postnummer)}

)}
{/* Abonnemang */}
{errors.abonnemang && (

{errors.abonnemang}

)}
{/* Kommentarer */}