// app/beach/actions.ts 'use server'; import nodemailer from 'nodemailer'; export async function submitRegistration(prevState: any, formData: FormData) { // 1. Spara all rådata direkt för att kunna skicka tillbaka den vid fel const rawData = { name: formData.get('name') as string, email: formData.get('email') as string, tel: formData.get('tel') as string, team: formData.get('team') as string, count: formData.get('count') as string, level: formData.get('level') as string, message: formData.get('message') as string, }; const honeypot = formData.get('website'); if (honeypot) { return { success: false, message: 'Spam detekterat.', values: rawData }; } // 2. Hämta Turnstile Token och Secret (MATCHING .env NAME) const turnstileToken = formData.get('cf-turnstile-response'); const secretKey = process.env.TURNSTILE_SECRET; // Matchar din .env exakt if (!secretKey) { console.error("Saknar TURNSTILE_SECRET i miljön."); return { success: false, message: 'Serverkonfiguration saknas. Kontakta administratör.', values: rawData }; } // 3. Verifiera mot Cloudflare try { const turnstileRes = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ secret: secretKey, response: turnstileToken?.toString() || '', }), }); const turnstileData = await turnstileRes.json(); if (!turnstileData.success) { console.error("Turnstile failed:", turnstileData); return { success: false, message: 'Säkerhetsverifieringen misslyckades. Ladda om sidan och försök igen.', values: rawData // Returnerar värdena så användaren slipper skriva om dem }; } } catch (error) { console.error("Turnstile fetch error:", error); return { success: false, message: 'Kunde inte nå verifieringsservern.', values: rawData }; } // 4. Formatera telefonnummer let cleanTel = rawData.tel.replace(/\D/g, ''); if (cleanTel.startsWith('46')) cleanTel = cleanTel.substring(2); else if (cleanTel.startsWith('0')) cleanTel = cleanTel.substring(1); const formattedTel = cleanTel.length === 9 ? `+46 (0)${cleanTel.substring(0, 2)}-${cleanTel.substring(2, 5)} ${cleanTel.substring(5, 7)} ${cleanTel.substring(7, 9)}` : rawData.tel; // 5. Nodemailer setup const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST || 'localhost', port: 25, secure: false, tls: { rejectUnauthorized: false } }); try { const dateStr = new Date().toLocaleString('sv-SE', { timeZone: 'Europe/Stockholm', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); const cleanMessage = rawData.message ? rawData.message.replace(/[\r\n;]/g, " ") : ""; // Mail till klubben await transporter.sendMail({ from: `"Beach-anmälan: ${rawData.name}" `, to: 'beach@lerbergetsvolleyboll.se', replyTo: rawData.email, subject: `Anmälan: ${rawData.team}`, html: `

Beach-anmälan

Lagnamn:${rawData.team}
Kontakt:${rawData.name}
E-post:${rawData.email}
Telefon:${formattedTel}
Spelare:${rawData.count}
Nivå:${rawData.level}

Meddelande:
${rawData.message ? rawData.message.replace(/\n/g, '
') : 'Inget meddelande'}


Visa kopierbar tabell för Excel
${rawData.team} ${rawData.count} ${rawData.level} ${rawData.name} ${formattedTel} ${rawData.email} ${dateStr} ${cleanMessage}
` }); // Bekräftelse till användaren await transporter.sendMail({ from: `"LVS" `, to: rawData.email, replyTo: `"LVS Beach" `, subject: `Vi har tagit emot din anmälan för ${rawData.team}`, html: `

Hej ${rawData.name}!

Tack för din anmälan till beachturneringen. Vi återkommer så snart vi har granskat era uppgifter.

Ses på stranden!
Lerbergets Volleybollsällskap

` }); // Returnerar INGA värden här, vilket gör att formuläret kan rensas rent return { success: true, message: 'Tack! Din anmälan har skickats. Håll utkik i din inkorg efter bekräftelse.' }; } catch (e) { console.error("Nodemailer error:", e); return { success: false, message: 'Kunde inte skicka mail. Kontakta oss manuellt istället.', values: rawData }; } }