// RegisterForm.jsx — waitlist register modal + newsletter form. // Publishes window.RegisterModal, window.openRegister, window.NewsletterForm. // POSTs to the showcase API (same-origin in prod; base from ). (function () { function apiBase() { const m = document.querySelector('meta[name="showcase-api-base"]'); return (m && m.content) || ''; } const listeners = new Set(); window.openRegister = () => listeners.forEach((fn) => fn(true)); function useRegister() { const [open, setOpen] = React.useState(false); React.useEffect(() => { const fn = (v) => setOpen(v); listeners.add(fn); return () => listeners.delete(fn); }, []); return [open, setOpen]; } function Field({ label, children }) { return ( ); } const inputCls = 'w-full h-10 px-3 rounded-md border border-zinc-200 text-[13px] focus:outline-none focus:border-zinc-400'; function RegisterModal() { const [open, setOpen] = useRegister(); const [state, setState] = React.useState('form'); // form | sending | done | error const [number, setNumber] = React.useState(''); const [errMsg, setErrMsg] = React.useState(''); const [form, setForm] = React.useState({ name: '', company: '', email: '', nif: '', city: '', phone: '', segment: '', current_erp: '', consent: false, hp: '', }); if (!open) return null; const set = (k) => (e) => setForm({ ...form, [k]: e.target.type === 'checkbox' ? e.target.checked : e.target.value }); async function submit(e) { e.preventDefault(); setState('sending'); setErrMsg(''); try { const res = await fetch(apiBase() + '/api/waitlist', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form), }); if (res.status === 429) { setErrMsg('Demasiados pedidos. Tente novamente mais tarde.'); setState('error'); return; } if (!res.ok) { setErrMsg('Verifique os campos e o consentimento.'); setState('error'); return; } const data = await res.json(); setNumber(data.number); setState('done'); } catch (_) { setErrMsg('Falha de ligação. Tente novamente.'); setState('error'); } } return (
Enviámos a sua carta de convite por email. Veja a caixa de entrada (e o spam, por garantia).