PageSourceSearch

https://airshopapp.com/js/guide-signup.js

js airshopapp.com collected 2026-10-05 19:23:49 UTC 2,550 bytes, 68 lines download raw bytes

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.