{"version":3,"file":"newsletter-signup.js","names":[],"sources":["../resources/modern-javascript/newsletter-signup.js"],"sourcesContent":["const newsletterSignup = () => {\n    const form = document.getElementById('newsletter-signup-form');\n    if (!form) return;\n\n    form.addEventListener('submit', async e => {\n        e.preventDefault();\n        clearErrors(form);\n\n        const email = form.querySelector('[name=\"enquiry_email\"]').value;\n\n        if (!validateEmail(email)) {\n            showFieldError(form, 'enquiry_email', 'Please enter a valid email');\n            return;\n        }\n\n        const submitButton = form.querySelector('button[type=\"submit\"]');\n        submitButton.disabled = true;\n\n        try {\n            const response = await fetch('/newsletter', {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/x-www-form-urlencoded',\n                },\n                body: new URLSearchParams(new FormData(form)),\n            });\n\n            if (response.ok) {\n                const data = await response.json();\n\n                if (data.message === 'success') {\n                    showSuccess(form);\n                } else {\n                    showFormError(form);\n                }\n            } else if (isCloudflareChallenge(response)) {\n                showSuccess(form);\n            } else {\n                showFormError(form);\n            }\n        } catch {\n            showFormError(form);\n        } finally {\n            submitButton.disabled = false;\n        }\n    });\n};\n\nconst validateEmail = email =>\n    /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(\n        email\n    );\n\nconst isCloudflareChallenge = response => {\n    const server = response.headers.get('server') || '';\n    const isCloudflare = server.toLowerCase().includes('cloudflare');\n    if (!isCloudflare) return false;\n\n    const cfMitigated = (\n        response.headers.get('cf-mitigated') || ''\n    ).toLowerCase();\n    return (\n        cfMitigated === 'challenge' || (response.status === 403 && isCloudflare)\n    );\n};\n\nconst clearErrors = form => {\n    form.querySelectorAll('.newsletter-signup__error').forEach(el =>\n        el.remove()\n    );\n};\n\nconst showFieldError = (form, fieldName, message) => {\n    const field = form.querySelector(`[name=\"${fieldName}\"]`);\n    if (!field) return;\n\n    const error = document.createElement('span');\n    error.className = 'newsletter-signup__error';\n    error.textContent = message;\n    field.after(error);\n};\n\nconst showFormError = form => {\n    const existing = form.parentElement.querySelector(\n        '.newsletter-signup__error'\n    );\n    if (existing) existing.remove();\n\n    const error = document.createElement('p');\n    error.className = 'newsletter-signup__error';\n    error.textContent =\n        'There was a problem signing you up. Please try again later.';\n    form.after(error);\n};\n\nconst showSuccess = form => {\n    const section = form.closest('.newsletter-signup');\n    const panel = form.closest('.newsletter-signup__panel');\n\n    if (panel) {\n        panel.innerHTML =\n            '<p class=\"newsletter-signup__success\">Thank you for signing up!</p>';\n    }\n};\n\nnewsletterSignup();\n"],"mappings":"AAAA,MAAM,MAAyB,CAC3B,IAAM,EAAO,SAAS,eAAe,wBAAwB,EACxD,GAEL,EAAK,iBAAiB,SAAU,KAAM,IAAK,CACvC,EAAE,eAAe,EACjB,EAAY,CAAI,EAEhB,IAAM,EAAQ,EAAK,cAAc,wBAAwB,CAAC,CAAC,MAE3D,GAAI,CAAC,EAAc,CAAK,EAAG,CACvB,EAAe,EAAM,gBAAiB,4BAA4B,EAClE,MACJ,CAEA,IAAM,EAAe,EAAK,cAAc,uBAAuB,EAC/D,EAAa,SAAW,GAExB,GAAI,CACA,IAAM,EAAW,MAAM,MAAM,cAAe,CACxC,OAAQ,OACR,QAAS,CACL,eAAgB,mCACpB,EACA,KAAM,IAAI,gBAAgB,IAAI,SAAS,CAAI,CAAC,CAChD,CAAC,EAEG,EAAS,IAGL,MAFe,EAAS,KAAK,EAAA,CAExB,UAAY,UACjB,EAAY,CAAI,EAEhB,EAAc,CAAI,EAEf,EAAsB,CAAQ,EACrC,EAAY,CAAI,EAEhB,EAAc,CAAI,CAE1B,MAAQ,CACJ,EAAc,CAAI,CACtB,QAAU,CACN,EAAa,SAAW,EAC5B,CACJ,CAAC,CACL,EAEM,EAAgB,GAClB,yJAAyJ,KACrJ,CACJ,EAEE,EAAwB,GAAY,CAEtC,IAAM,GADS,EAAS,QAAQ,IAAI,QAAQ,GAAK,GAAA,CACrB,YAAY,CAAC,CAAC,SAAS,YAAY,EAM/D,OALK,GAGD,EAAS,QAAQ,IAAI,cAAc,GAAK,GAAA,CAC1C,YAEY,IAAM,aAAgB,EAAS,SAAW,KAAO,EANrC,EAQ9B,EAEM,EAAc,GAAQ,CACxB,EAAK,iBAAiB,2BAA2B,CAAC,CAAC,QAAQ,GACvD,EAAG,OAAO,CACd,CACJ,EAEM,GAAkB,EAAM,EAAW,IAAY,CACjD,IAAM,EAAQ,EAAK,cAAc,UAAU,EAAA,GAAa,EACxD,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAQ,SAAS,cAAc,MAAM,EAC3C,EAAM,UAAY,2BAClB,EAAM,YAAc,EACpB,EAAM,MAAM,CAAK,CACrB,EAEM,EAAgB,GAAQ,CAC1B,IAAM,EAAW,EAAK,cAAc,cAChC,2BACJ,EACI,GAAU,EAAS,OAAO,EAE9B,IAAM,EAAQ,SAAS,cAAc,GAAG,EACxC,EAAM,UAAY,2BAClB,EAAM,YACF,8DACJ,EAAK,MAAM,CAAK,CACpB,EAEM,EAAc,GAAQ,CACR,EAAK,QAAQ,oBAAoB,EACjD,IAAM,EAAQ,EAAK,QAAQ,2BAA2B,EAElD,IACA,EAAM,UACF,sEAEZ,EAEA,EAAiB"}