/* Contact — functional form. Submits to FormSubmit (delivers to info@qafactory.ai). FormSubmit needs a one-time activation: the first submission emails info@qafactory.ai a confirmation link; click it once and all later submissions arrive in the inbox. */ const CONTACT_ENDPOINT = 'https://formsubmit.co/ajax/info@qafactory.ai'; function Contact() { const [status, setStatus] = React.useState('idle'); // idle | sending | sent | error const [error, setError] = React.useState(''); async function handleSubmit(e) { e.preventDefault(); const form = e.target; const fd = new FormData(form); // honeypot — bots fill this, humans don't if (fd.get('_honey')) return; const payload = Object.fromEntries(fd.entries()); payload._subject = 'New qafactory.ai contact enquiry'; payload._template = 'table'; setStatus('sending'); setError(''); try { const res = await fetch(CONTACT_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify(payload), }); const json = await res.json().catch(() => ({})); if (res.ok && (json.success === 'true' || json.success === true)) { setStatus('sent'); form.reset(); } else { throw new Error(json.message || 'Submission failed. Please try again or email us directly.'); } } catch (err) { setStatus('error'); setError(err.message || 'Network error. Please try again, or email info@qafactory.ai.'); } } return (
{/* Left — intro */}
09 — Contact

Talk to a QA lead.

Tell us what you're shipping and where it hurts. A senior QA lead — not a sales bot — reads every message and replies within one business day.

info@qafactory.ai
{/* Right — form card */}
{status === 'sent' ? (

Message sent.

Thanks — it's on its way to info@qafactory.ai. Your QA lead will reply within one business day.

) : (