Files
website/app/beach/actions.ts
T
2026-03-06 15:33:05 +01:00

130 lines
5.1 KiB
TypeScript

// 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 || '10.10.0.113', // Använder .env med fallback
port: 25,
secure: false,
tls: { rejectUnauthorized: false }
});
try {
const dateStr = new Date().toLocaleString('sv-SE');
// Mail till klubben
await transporter.sendMail({
from: `"Beach-anmälan: ${rawData.name}" <no-reply@lerbergetsvolleyboll.se>`,
to: 'beach@lerbergetsvolleyboll.se',
replyTo: rawData.email,
subject: `Anmälan: ${rawData.team}`,
html: `
<div style="font-family: sans-serif; max-width: 600px; border: 1px solid #eee; padding: 20px;">
<h2 style="color: #406185;">Ny anmälan: ${rawData.team}</h2>
<p><strong>Kontaktperson:</strong> ${rawData.name}</p>
<p><strong>E-post:</strong> ${rawData.email}</p>
<p><strong>Telefon:</strong> ${formattedTel}</p>
<p><strong>Antal spelare:</strong> ${rawData.count}</p>
<p><strong>Nivå:</strong> ${rawData.level}</p>
<p><strong>Meddelande:</strong><br>${rawData.message || 'Inget meddelande'}</p>
<hr>
<p style="font-size: 10px; color: #999;">Skickat: ${dateStr}</p>
</div>
`
});
// Bekräftelse till användaren
await transporter.sendMail({
from: `"LVS" <no-reply@lerbergetsvolleyboll.se>`,
to: rawData.email,
subject: `Vi har tagit emot din anmälan för ${rawData.team}`,
html: `<div style="font-family: sans-serif; padding: 20px;">
<h2>Hej ${rawData.name}!</h2>
<p>Tack för din anmälan till beachturneringen. Vi återkommer så snart vi har granskat era uppgifter.</p>
<p>Ses på stranden!<br><strong>Lerbergets Volleybollsällskap</strong></p>
</div>`
});
// 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
};
}
}