diff --git a/package-lock.json b/package-lock.json index 33e316028..9a220977b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,11 +19,13 @@ "ethers": "^5.7.2", "focus-trap-react": "^10.0.0", "github-slugger": "^1.4.0", + "jsonp": "^0.2.1", "nanostores": "^0.7.1", "preact": "^10.11.3", "query-string": "^7.1.1", "react-instantsearch-hooks-web": "^6.38.1", - "tailwindcss": "^3.2.4" + "tailwindcss": "^3.2.4", + "to-querystring": "^1.1.1" }, "devDependencies": { "@astrojs/mdx": "^0.11.6", @@ -10874,6 +10876,27 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz", + "integrity": "sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw==", + "dependencies": { + "debug": "^2.1.3" + } + }, + "node_modules/jsonp/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/jsonp/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/jsonschema": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", @@ -17531,6 +17554,11 @@ "node": ">=4" } }, + "node_modules/to-querystring": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-querystring/-/to-querystring-1.1.1.tgz", + "integrity": "sha512-ZgIacl9TXAoT7sGXUYjQiy0MW7Tf/7CJQLt757hYHfXXc8JBzOVBMx4DckqKUO4hi36J72/m8UcH/GCHK+n97g==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -27033,6 +27061,29 @@ "graceful-fs": "^4.1.6" } }, + "jsonp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz", + "integrity": "sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw==", + "requires": { + "debug": "^2.1.3" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "jsonschema": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", @@ -31899,6 +31950,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, + "to-querystring": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-querystring/-/to-querystring-1.1.1.tgz", + "integrity": "sha512-ZgIacl9TXAoT7sGXUYjQiy0MW7Tf/7CJQLt757hYHfXXc8JBzOVBMx4DckqKUO4hi36J72/m8UcH/GCHK+n97g==" + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index 80b56ab13..cc8503463 100644 --- a/package.json +++ b/package.json @@ -31,11 +31,13 @@ "ethers": "^5.7.2", "focus-trap-react": "^10.0.0", "github-slugger": "^1.4.0", + "jsonp": "^0.2.1", "nanostores": "^0.7.1", "preact": "^10.11.3", "query-string": "^7.1.1", "react-instantsearch-hooks-web": "^6.38.1", - "tailwindcss": "^3.2.4" + "tailwindcss": "^3.2.4", + "to-querystring": "^1.1.1" }, "devDependencies": { "@astrojs/mdx": "^0.11.6", diff --git a/src/components/Footer/NewsletterSignupForm.tsx b/src/components/Footer/NewsletterSignupForm.tsx index 00c378af8..64e3033c1 100644 --- a/src/components/Footer/NewsletterSignupForm.tsx +++ b/src/components/Footer/NewsletterSignupForm.tsx @@ -4,13 +4,14 @@ import { useState } from "preact/hooks" import "./NewsletterCTA.css" import button from "../../styles/cl-design-system/button.module.css" import { clsx } from "~/lib" +import jsonp from "jsonp" +import toQueryString from "to-querystring" const TAG_1 = "Developers" const TAG_2 = "Developer Docs" -// TODO: setup zapier hook or use custom integration for newsletter signup -// const NEWSLETTER_URL = "https://hooks.zapier.com/hooks/catch/10015000/bb8efqc" -const NEWSLETTER_URL = "" +const NEWSLETTER_URL = + "https://gmail.us14.list-manage.com/subscribe/post-json?u=3b1d822eb27b2fa64d82d430b&id=0b4603244e" export const NewsletterSignupForm = () => { const [isLoading, setIsLoading] = useState(false) @@ -20,31 +21,26 @@ export const NewsletterSignupForm = () => { e.preventDefault() const email = new FormData(e.target).get("Email") setIsLoading(true) - fetch(NEWSLETTER_URL, { - mode: "no-cors", - method: "POST", - body: JSON.stringify({ - email, - tag1: TAG_1, - tag2: TAG_2, - }), - headers: { - "Content-Type": "application/json", - }, + const params = toQueryString({ + EMAIL: email, }) - .then((response) => { - if (response.type !== "opaque" && !response.ok) { - throw Error(response.statusText) + const url = NEWSLETTER_URL + "&" + params + jsonp( + url, + { + param: "c", + }, + (err, data) => { + if (err) { + setIsError(true) + } else if (data.result !== "success") { + setIsError(true) + } else { + setIsSuccess(true) } - setIsSuccess(true) - }) - .catch((err) => { - console.error(err) - setIsError(true) - }) - .finally(() => { setIsLoading(false) - }) + } + ) } return (