From e338c95da07e1a033c262362179fc2aace9ae842 Mon Sep 17 00:00:00 2001 From: MichalC <103170279+wSBMichalee@users.noreply.github.com> Date: Mon, 27 Jul 2026 21:45:23 +0200 Subject: [PATCH] fix(forms): Naprawa formularza multisplit i dodanie reCAPTCHA v3 do wszystkich formularzy --- app/kontakt/actions.ts | 13 ++- app/layout.tsx | 7 ++ app/zamowienie/actions.ts | 12 +++ app/zamowienie/page.tsx | 17 +++- app/zapytanie-multisplit/actions.ts | 117 ++++++++++++++++++++++ app/zgloszenie-awarii/actions.ts | 12 +++ components/awaria/AwariaClient.tsx | 9 ++ components/forms/ContactForm.tsx | 8 ++ components/shop/MultisplitContactForm.tsx | 35 ++++--- lib/recaptcha.ts | 9 ++ 10 files changed, 223 insertions(+), 16 deletions(-) create mode 100644 app/zapytanie-multisplit/actions.ts create mode 100644 lib/recaptcha.ts diff --git a/app/kontakt/actions.ts b/app/kontakt/actions.ts index 47ad527..b482751 100644 --- a/app/kontakt/actions.ts +++ b/app/kontakt/actions.ts @@ -1,8 +1,8 @@ "use server"; import { z } from "zod"; - import { Resend } from "resend"; +import { verifyRecaptcha } from "@/lib/recaptcha"; const resend = new Resend(process.env.RESEND_API_KEY); @@ -19,6 +19,17 @@ const contactFormSchema = z.object({ export async function submitContactForm(prevState: any, formData: FormData) { try { + if (process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY && process.env.RECAPTCHA_SECRET_KEY) { + const token = formData.get('recaptchaToken') as string; + if (!token) { + return { success: false, message: "Weryfikacja bezpieczeństwa nie powiodła się. Odśwież stronę i spróbuj ponownie." }; + } + const { success } = await verifyRecaptcha(token); + if (!success) { + return { success: false, message: "Weryfikacja bezpieczeństwa nie powiodła się. Odśwież stronę i spróbuj ponownie." }; + } + } + // 1. Walidacja danych z formularza const rawData = { name: formData.get("name"), diff --git a/app/layout.tsx b/app/layout.tsx index f89bd69..7468915 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -4,6 +4,7 @@ import { Header } from "@/components/layout/Header"; import { TrustBar } from "@/components/layout/TrustBar"; import { Footer } from "@/components/layout/Footer"; import CookieBanner from '@/components/CookieBanner'; +import Script from 'next/script'; import { CompareBar } from '@/components/shop/CompareBar'; import { AnalyticsWrapper } from "@/components/ui/AnalyticsWrapper"; import { CookieSettingsFloatingIcon } from "@/components/ui/CookieSettingsFloatingIcon"; @@ -67,6 +68,12 @@ export default function RootLayout({ + {process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY && ( +