Blockerade utom STN postnummer

X-Lovable-Edit-ID: edt-5913ff75-18ce-490d-82b4-60cb95b991bd
Co-authored-by: wolfoftyreso-debug <250630591+wolfoftyreso-debug@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-07-11 13:08:30 +00:00
2 changed files with 17 additions and 14 deletions
+16 -13
View File
@@ -18,6 +18,8 @@ const isStockholmPostalCode = (postalCode: string) => {
return num >= 10000 && num <= 19999; return num >= 10000 && num <= 19999;
}; };
const stockholmDeliveryMessage = "Vi levererar endast till företag inom Storstockholm.";
const formSchema = z.object({ const formSchema = z.object({
företag: z.string().trim().min(1, "Fyll i företagsnamn").max(100), 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), epost: z.string().trim().email("Ange en giltig e-postadress").max(255),
@@ -65,7 +67,7 @@ const PlansSection = () => {
(async () => { (async () => {
const { data } = await supabase const { data } = await supabase
.from("profiles") .from("profiles")
.select("company_name, phone, street_address, postal_code, city") .select("company_name, phone, street_address, postal_code")
.eq("user_id", user.id) .eq("user_id", user.id)
.maybeSingle(); .maybeSingle();
setForm((prev) => ({ setForm((prev) => ({
@@ -75,7 +77,6 @@ const PlansSection = () => {
telefon: prev.telefon || data?.phone || "", telefon: prev.telefon || data?.phone || "",
adress: prev.adress || data?.street_address || "", adress: prev.adress || data?.street_address || "",
postnummer: prev.postnummer || data?.postal_code || "", postnummer: prev.postnummer || data?.postal_code || "",
stad: prev.stad || data?.city || "",
})); }));
})(); })();
}, [user, showForm]); }, [user, showForm]);
@@ -86,6 +87,9 @@ const PlansSection = () => {
const { name, value } = e.target; const { name, value } = e.target;
setForm((p) => ({ ...p, [name]: value })); setForm((p) => ({ ...p, [name]: value }));
if (errors[name]) setErrors((p) => ({ ...p, [name]: "" })); if (errors[name]) setErrors((p) => ({ ...p, [name]: "" }));
if (name === "postnummer" && errors.postnummer) {
setErrors((p) => ({ ...p, postnummer: "" }));
}
}; };
const handleSubmit = async (e: React.FormEvent) => { const handleSubmit = async (e: React.FormEvent) => {
@@ -116,7 +120,7 @@ const PlansSection = () => {
phone: result.data.telefon ?? "", phone: result.data.telefon ?? "",
address: result.data.adress ?? "", address: result.data.adress ?? "",
postal_code: result.data.postnummer, postal_code: result.data.postnummer,
city: result.data.stad ?? "", city: "Storstockholm",
comments: result.data.kommentarer ?? "", comments: result.data.kommentarer ?? "",
return_url: `${window.location.origin}/?checkout=success&session_id={CHECKOUT_SESSION_ID}`, return_url: `${window.location.origin}/?checkout=success&session_id={CHECKOUT_SESSION_ID}`,
environment: getStripeEnvironment(), environment: getStripeEnvironment(),
@@ -318,6 +322,10 @@ const PlansSection = () => {
</div> </div>
</div> </div>
<div className="border border-primary/30 bg-primary/5 px-4 py-3 rounded-sm text-sm text-foreground">
{stockholmDeliveryMessage} Ange postnummer 100 00199 99 för att vidare.
</div>
<div> <div>
<label className="block mb-1.5 text-sm font-semibold"> <label className="block mb-1.5 text-sm font-semibold">
Företagsnamn <span className="text-primary">*</span> Företagsnamn <span className="text-primary">*</span>
@@ -371,7 +379,7 @@ const PlansSection = () => {
/> />
</div> </div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4"> <div>
<div> <div>
<label className="block mb-1.5 text-sm font-semibold"> <label className="block mb-1.5 text-sm font-semibold">
Postnummer <span className="text-primary">*</span> Postnummer <span className="text-primary">*</span>
@@ -381,20 +389,15 @@ const PlansSection = () => {
placeholder="t.ex. 114 32" placeholder="t.ex. 114 32"
value={form.postnummer} value={form.postnummer}
onChange={handleChange} onChange={handleChange}
aria-invalid={!!errors.postnummer}
className="w-full px-4 py-3 rounded-sm bg-background border border-border focus:outline-none focus:ring-2 focus:ring-primary/30" className="w-full px-4 py-3 rounded-sm bg-background border border-border focus:outline-none focus:ring-2 focus:ring-primary/30"
/> />
{errors.postnummer && ( {errors.postnummer && (
<p className="text-destructive text-xs mt-1">{errors.postnummer}</p> <p className="text-destructive text-xs mt-1">{errors.postnummer}</p>
)} )}
</div> <p className="text-muted-foreground text-xs mt-1">
<div> Beställningen kan endast fortsätta för postnummer inom Storstockholm.
<label className="block mb-1.5 text-sm font-semibold">Stad</label> </p>
<input
name="stad"
value={form.stad}
onChange={handleChange}
className="w-full px-4 py-3 rounded-sm bg-background border border-border focus:outline-none focus:ring-2 focus:ring-primary/30"
/>
</div> </div>
</div> </div>
+1 -1
View File
@@ -3,7 +3,7 @@ import { type StripeEnv, createStripeClient } from "../_shared/stripe.ts";
const corsHeaders = { const corsHeaders = {
"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "authorization, x-client-info, apikey, content-type", "Access-Control-Allow-Headers": "authorization, x-client-info, x-supabase-client-platform, x-supabase-api-version, apikey, content-type",
"Access-Control-Allow-Methods": "POST, OPTIONS", "Access-Control-Allow-Methods": "POST, OPTIONS",
}; };