From 582d5aea802e14ed8cb4daee030d3b5d5ae13cda Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 12:49:40 +0000 Subject: [PATCH] Changes Co-authored-by: wolfoftyreso-debug <250630591+wolfoftyreso-debug@users.noreply.github.com> --- src/components/AbonnemangCheckout.tsx | 93 -------- src/components/AbonnemangForm.tsx | 328 -------------------------- src/hooks/useShopifyProducts.ts | 33 --- 3 files changed, 454 deletions(-) delete mode 100644 src/components/AbonnemangCheckout.tsx delete mode 100644 src/components/AbonnemangForm.tsx delete mode 100644 src/hooks/useShopifyProducts.ts diff --git a/src/components/AbonnemangCheckout.tsx b/src/components/AbonnemangCheckout.tsx deleted file mode 100644 index 4a4c4d2..0000000 --- a/src/components/AbonnemangCheckout.tsx +++ /dev/null @@ -1,93 +0,0 @@ -interface Plan { - kg: number; - pricePerKg: number; - shopifyLink: string; -} - -interface AbonnemangCheckoutProps { - selectedPlan: string; - onBack?: () => void; -} - -const plans: Record = { - "Liten": { - kg: 3, - pricePerKg: 325, - shopifyLink: "#" // Replace with actual Shopify link - }, - "Mellan": { - kg: 5, - pricePerKg: 325, - shopifyLink: "#" - }, - "Stor": { - kg: 10, - pricePerKg: 400, - shopifyLink: "#" - }, -}; - -const AbonnemangCheckout = ({ selectedPlan, onBack }: AbonnemangCheckoutProps) => { - const planName = selectedPlan.split(" (")[0]; // Extract plan name from "Liten (3 kg/vecka)" - const plan = plans[planName] || plans["Mellan"]; - const weeklyPrice = plan.kg * plan.pricePerKg; - const monthlyPrice = weeklyPrice * 4; - - return ( -
-
- -

- Ditt abonnemang: {planName} -

- -
-

- Du beställer {plan.kg} kg kakor per vecka. -

-

- Pris: {weeklyPrice.toLocaleString("sv-SE")} kr/vecka{" "} - (~{monthlyPrice.toLocaleString("sv-SE")} kr/månad exkl. moms) -

-

- Kakorna levereras nästa tisdag! -

-
- -

- Betala direkt via kort eller med Klarna. Ingen manuell kontakt behövs. -

- -
- - Betala med kort - - - Betala med Klarna - -
- -

- När betalningen är genomförd skickas automatiskt ett bekräftelsemail - och kakorna levereras nästa tisdag. -

- - {onBack && ( - - )} -
- ); -}; - -export default AbonnemangCheckout; diff --git a/src/components/AbonnemangForm.tsx b/src/components/AbonnemangForm.tsx deleted file mode 100644 index c82fa4d..0000000 --- a/src/components/AbonnemangForm.tsx +++ /dev/null @@ -1,328 +0,0 @@ -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 */} -
- -