"use server"; import { z } from "zod"; import { headers } from "next/headers"; import { escapeHtml, rateLimit, verifyRecaptcha, baseContactSchema } from "@/lib/security"; import { getMailClient } from "@/lib/mail"; const multisplitFormSchema = baseContactSchema.extend({ city: z.string().min(1, "Wybierz miasto"), rooms: z.string().optional(), message: z.string().optional(), productName: z.string(), productSku: z.string(), recaptchaToken: z.string().optional(), }); export async function submitMultisplitForm(data: Record) { try { const ip = (await headers()).get('x-forwarded-for') || 'unknown'; if (!rateLimit(ip)) { return { success: false, message: 'Wysłano zbyt wiele zapytań. Spróbuj ponownie później.' }; } if (process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY && process.env.RECAPTCHA_SECRET_KEY) { if (!data.recaptchaToken || typeof data.recaptchaToken !== 'string') { return { success: false, message: "Weryfikacja bezpieczeństwa nie powiodła się. Odśwież stronę i spróbuj ponownie." }; } const success = await verifyRecaptcha(data.recaptchaToken); if (!success) { return { success: false, message: "Weryfikacja bezpieczeństwa nie powiodła się. Odśwież stronę i spróbuj ponownie." }; } } const mailClient = getMailClient(); if (!mailClient) { return { success: false, message: "Funkcja wysyłania wiadomości jest tymczasowo niedostępna." }; } // Convert boolean consent to string for base schema compatibility if it comes as boolean const processData = { ...data }; if (typeof processData.consent === 'boolean') { processData.consent = processData.consent ? "true" : "false"; } const validatedData = multisplitFormSchema.parse(processData); const { error } = await mailClient.resend.emails.send({ from: mailClient.fromEmail, to: mailClient.toEmail, replyTo: validatedData.email || undefined, subject: `Zapytanie o multisplit: ${escapeHtml(validatedData.productName)} (${escapeHtml(validatedData.productSku)})`, html: `

Zapytanie o multisplit

Imię: ${escapeHtml(validatedData.name)}
Telefon: ${escapeHtml(validatedData.phone)}
E-mail: ${escapeHtml(validatedData.email || 'Brak')}
Miasto: ${escapeHtml(validatedData.city)}
Produkt: ${escapeHtml(validatedData.productName)} (${escapeHtml(validatedData.productSku)})
Pokoje: ${escapeHtml(validatedData.rooms || '')}

Dodatkowe informacje:

${escapeHtml(validatedData.message || 'Brak')}
`, }); if (error) { return { success: false, message: "Wystąpił problem z wysłaniem. Spróbuj ponownie." }; } return { success: true, message: "Dziękujemy za zapytanie! Skontaktujemy się z Tobą najszybciej jak to możliwe." }; } catch (error) { return { success: false, message: "Błąd walidacji lub błąd serwera. Spróbuj ponownie później." }; } }