'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 awariaFormSchema = baseContactSchema.omit({ consent: true }).extend({ isUrgent: z.boolean().optional(), brand: z.string().min(1, "Wymagana nazwa urządzenia"), model: z.string().optional(), errorCode: z.string().optional(), problemType: z.string().optional(), description: z.string().optional(), warranty: z.string().optional(), lastService: z.string().optional(), city: z.string().min(1, "Wymagane miasto"), preferredDate: z.string().optional(), preferredTime: z.string().optional(), recaptchaToken: z.string().optional(), }); export async function submitAwariaForm(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." }; } // Default missing fields for zod validation const parsedData = awariaFormSchema.parse({ ...data, email: data.email || 'brak@email.pl', }); await mailClient.resend.emails.send({ from: mailClient.fromEmail, to: mailClient.toEmail, subject: `${parsedData.isUrgent ? '🚨 PILNE — ' : ''}Zgłoszenie serwisowe: ${escapeHtml(parsedData.brand)} — ${escapeHtml(parsedData.city)}`, html: `

${parsedData.isUrgent ? '🚨 PILNE — ' : ''}Zgłoszenie serwisowe ThermCool

Dane klienta

Imię: ${escapeHtml(parsedData.name)}

Telefon: ${escapeHtml(parsedData.phone)}

Miasto: ${escapeHtml(parsedData.city)}

${parsedData.preferredDate ? `

Preferowany termin: ${escapeHtml(parsedData.preferredDate)} ${escapeHtml(parsedData.preferredTime || '')}

` : ''}

Urządzenie

Marka: ${escapeHtml(parsedData.brand)}

${parsedData.model ? `

Model: ${escapeHtml(parsedData.model)}

` : ''} ${parsedData.warranty ? `

Gwarancja: ${escapeHtml(parsedData.warranty)}

` : ''} ${parsedData.lastService ? `

Ostatni serwis: ${escapeHtml(parsedData.lastService)}

` : ''}

Problem

Typ problemu: ${escapeHtml(parsedData.problemType || '')}

${parsedData.errorCode ? `

Kod błędu: ${escapeHtml(parsedData.errorCode)}

` : ''} ${parsedData.description ? `

Opis: ${escapeHtml(parsedData.description)}

` : ''}
`, }); return { success: true }; } catch { return { success: false, message: 'Wystąpił błąd podczas wysyłania.' }; } }