// 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 (

¡Gracias!

Tu confirmación se ha enviado correctamente.

); } return (
07 · Confirmación

Confírmanos tu asistencia

Os pedimos que rellenéis este pequeño formulario para tenerlo todo preparado. Al enviarlo, los novios recibirán vuestra confirmación al instante.

upd('nombre', e.target.value)} placeholder="Ej: Laura y Marcos" />
{form.asiste === false && (