// RSVP form — POSTs to Google Apps Script (saves to Sheet + emails the novios)
// Pega aquí la URL del web app de Google Apps Script (paso 6 de rsvp-apps-script.js).
// Si la dejas vacía, el formulario hace fallback a mailto.
const RSVP_ENDPOINT = 'https://script.google.com/macros/s/AKfycbxllg0IHUELnGMDFDMtQlRM0F67GZn1JJmq4gOT_1fXYobblPgpi_q1N2dHgPvHhe-cHw/exec';
const FALLBACK_EMAIL = 'aroabarrio@gmail.com';
const RSVP = () => {
const [form, setForm] = React.useState({
nombre: '',
asiste: null,
adultos: 1,
ninos: 0,
bebes: 0,
comentariosNinos: '',
autobusIda: null,
pasajerosIda: 1,
autobusVuelta: null,
pasajerosVuelta: 1,
alergias: null,
alergiasDetalle: '',
mesaNinos: null, // 'monitora' | 'padres'
preboda: null,
prebodaNum: 1,
mensaje: '',
});
const [status, setStatus] = React.useState('idle'); // idle | sending | sent | error
const upd = (k, v) => setForm(f => ({ ...f, [k]: v }));
const buildMessage = () => {
const lines = [
`Confirmación boda Aroa & Daniel`,
`──────────────────────`,
`Nombre: ${form.nombre}`,
`Asistencia: ${form.asiste ? 'SÍ' : 'NO'}`,
];
if (form.asiste) {
lines.push(`Adultos: ${form.adultos}`);
lines.push(`Niños (2-12): ${form.ninos}`);
lines.push(`Bebés (0-2): ${form.bebes}`);
if (form.comentariosNinos) lines.push(`Comentarios niños: ${form.comentariosNinos}`);
lines.push(`Autobús ida: ${form.autobusIda ? `SÍ (${form.pasajerosIda} pax)` : 'NO'}`);
lines.push(`Autobús vuelta: ${form.autobusVuelta ? `SÍ (${form.pasajerosVuelta} pax)` : 'NO'}`);
lines.push(`Alergias: ${form.alergias ? `SÍ — ${form.alergiasDetalle}` : 'NO'}`);
if (form.ninos > 0) {
lines.push(`Mesa niños: ${form.mesaNinos === 'monitora' ? 'Mesa infantil con monitora' : form.mesaNinos === 'padres' ? 'Mesa de padres' : '-'}`);
}
lines.push(`Preboda 5 junio: ${form.preboda ? `SÍ (${form.prebodaNum} pax)` : 'NO'}`);
}
if (form.mensaje) lines.push(`Mensaje: ${form.mensaje}`);
return lines.join('\n');
};
const submit = async () => {
if (!RSVP_ENDPOINT) { sendEmailFallback(); return; }
setStatus('sending');
try {
// Apps Script web apps no devuelven CORS para application/json,
// así que mandamos como text/plain con el JSON dentro.
await fetch(RSVP_ENDPOINT, {
method: 'POST',
mode: 'no-cors',
headers: { 'Content-Type': 'text/plain;charset=utf-8' },
body: JSON.stringify(form),
});
// Con no-cors no podemos leer la respuesta — asumimos OK si fetch no lanzó.
setStatus('sent');
} catch (e) {
setStatus('error');
}
};
const sendEmailFallback = () => {
const body = encodeURIComponent(buildMessage());
const subj = encodeURIComponent(`RSVP Boda — ${form.nombre || 'Invitado'}`);
window.location.href = `mailto:${FALLBACK_EMAIL}?subject=${subj}&body=${body}`;
setStatus('sent');
};
const canSubmit = form.nombre.trim().length > 1 && form.asiste !== null &&
(!form.asiste || (
form.autobusIda !== null && form.autobusVuelta !== null &&
form.alergias !== null && form.preboda !== null &&
(form.ninos === 0 || form.mesaNinos !== null)
));
if (status === 'sent') {
return (
Tu confirmación se ha enviado correctamente.
Os pedimos que rellenéis este pequeño formulario para tenerlo todo preparado.
Al enviarlo, los novios recibirán vuestra confirmación al instante.
Se valora poner una mesa infantil con monitora para que los niños coman juntos.
¿Preferís que coman en esa mesa o en la mesa de padres con el horario del comedor?
Completa los campos obligatorios para continuar.
No se pudo enviar. { e.preventDefault(); sendEmailFallback(); }} style={{ borderBottom: '1px solid currentColor' }}>Enviar por email.
¡Gracias!
Confírmanos tu asistencia