1/** 2 * Guide signup form - POSTs to AirShop API 3 * Replaces Zapier webhook flow. API handles contact creation, segment, topic, welcome email. 4 */ 5(function() { 6 const API_URL = 'https://airshop.work/api/leads/guide-signup'; 7 8 const form = document.getElementById('email-signup-form'); 9 const messageEl = document.getElementById('signup-message'); 10 11 if (!form || !messageEl) return; 12 13 form.addEventListener('submit', async function(e) { 14 e.preventDefault(); 15 16 const emailInput = document.getElementById('signup-email'); 17 const submitBtn = form.querySelector('button[type="submit"]'); 18 const honeypot = form.querySelector('input[name="website"]'); 19 const firstNameInput = form.querySelector('input[name="firstName"]'); 20 const lastNameInput = form.querySelector('input[name="lastName"]'); 21 22 const email = emailInput ? emailInput.value.trim() : ''; 23 const firstName = firstNameInput ? firstNameInput.value.trim() : ''; 24 const lastName = lastNameInput ? lastNameInput.value.trim() : ''; 25 26 if (honeypot && honeypot.value.trim()) { 27 return; 28 } 29 30 if (!email) { 31 messageEl.textContent = 'Please enter your email.'; 32 messageEl.className = 'email-signup-message error'; 33 return; 34 } 35 36 submitBtn.disabled = true; 37 messageEl.textContent = ''; 38 messageEl.className = 'email-signup-message'; 39 40 try { 41 const params = new URLSearchParams(); 42 params.append('email', email); 43 if (firstName) params.append('firstName', firstName); 44 if (lastName) params.append('lastName', lastName); 45 46 const response = await fetch(API_URL, { 47 method: 'POST', 48 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 49 body: params.toString() 50 }); 51 52 const data = await response.json().catch(() => ({})); 53 54 if (response.ok) { 55 messageEl.textContent = 'Check your inbox for the guide.'; 56 messageEl.className = 'email-signup-message success'; 57 form.reset(); 58 } else { 59 throw new Error(data.error || 'Something went wrong'); 60 } 61 } catch (err) { 62 messageEl.textContent = err.message || 'Failed to sign up. Please try again.'; 63 messageEl.className = 'email-signup-message error'; 64 } finally { 65 submitBtn.disabled = false; 66 } 67 }); 68})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.