"use server"; import { z } from "zod"; import { Resend } from "resend"; import { verifyRecaptcha } from "@/lib/recaptcha"; const resend = new Resend(process.env.RESEND_API_KEY); // Schemat walidacji zgodny z tym po stronie klienta const contactFormSchema = z.object({ name: z.string().min(2, "Imię musi mieć min. 2 znaki"), phone: z.string().min(9, "Wprowadź poprawny numer telefonu"), email: z.union([z.literal(''), z.string().email("Niepoprawny adres e-mail")]).optional(), city: z.string().min(1, "Wybierz miasto"), subject: z.string().optional(), message: z.string().optional(), consent: z.boolean().refine((val) => val === true, "Zgoda RODO jest wymagana"), }); export async function submitContactForm(prevState: unknown, 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"), phone: formData.get("phone"), email: formData.get("email"), city: formData.get("city"), subject: formData.get("subject"), message: formData.get("message"), consent: formData.get("consent") === "true" || formData.get("consent") === "on", }; const validatedData = contactFormSchema.parse(rawData); // 2. Wysłanie e-maila przez Resend const { data, error } = await resend.emails.send({ from: process.env.RESEND_FROM_EMAIL || "noreply@thermcool.pl", to: process.env.RESEND_TO_EMAIL || "biuro@thermcool.pl", // Docelowy e-mail (odbiorca) replyTo: validatedData.email, subject: `Nowa wiadomość ze strony: ${validatedData.subject}`, html: `
`, }); if (error) { console.error("Resend Error:", error); return { success: false, message: "Nie udało się wysłać wiadomości ze względu na błąd serwera pocztowego.", }; } console.log("Wysłano e-mail (ID):", data?.id); // 3. Zwrotka o sukcesie return { success: true, message: "Dziękujemy za wiadomość! Skontaktujemy się z Tobą najszybciej jak to możliwe.", }; } catch (error) { if (error instanceof z.ZodError) { return { success: false, message: "Wystąpił błąd walidacji. Sprawdź poprawność danych.", errors: error.flatten().fieldErrors, }; } return { success: false, message: "Wystąpił nieoczekiwany błąd serwera. Spróbuj ponownie później.", }; } }