From caf3cdc2a72244a4aa84b643785147354512603b Mon Sep 17 00:00:00 2001 From: Karol Wypchlo Date: Mon, 29 Mar 2021 14:24:12 +0200 Subject: [PATCH] subscribe --- packages/website/package.json | 1 + .../CommunitySection/CommunitySection.js | 30 ++++++++++++------ .../CommunitySection/useSubscribe.js | 31 +++++++++++++++++++ 3 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 packages/website/src/components/CommunitySection/useSubscribe.js diff --git a/packages/website/package.json b/packages/website/package.json index 6495481c..96742e16 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -30,6 +30,7 @@ "gatsby-transformer-sharp": "^3.0.0", "gbimage-bridge": "^0.1.1", "http-status-codes": "^2.1.4", + "jsonp": "^0.2.1", "ms": "^2.1.2", "normalize.css": "^8.0.1", "path-browserify": "^1.0.1", diff --git a/packages/website/src/components/CommunitySection/CommunitySection.js b/packages/website/src/components/CommunitySection/CommunitySection.js index 108d74d7..65a4563c 100644 --- a/packages/website/src/components/CommunitySection/CommunitySection.js +++ b/packages/website/src/components/CommunitySection/CommunitySection.js @@ -10,6 +10,7 @@ import { YoutubeSmall, TikTokSmall, } from "../../components/Icons"; +import useSubscribe from "./useSubscribe"; const social = [ { name: "Discord", Icon: DiscordSmall, href: "https://discordapp.com/invite/sia" }, @@ -28,12 +29,12 @@ const SectionTitle = ({ children }) => ( const CommunitySection = () => { const [experienced, setExperienced] = React.useState(false); const [email, setEmail] = React.useState(""); - const onSubscribe = (event) => { + const { subscribe, complete, success, message, pending } = useSubscribe(); + + const onSubscribe = async (event) => { event.preventDefault(); - alert(`this will subscribe ${email} for a newsletter`); - - setEmail(""); + subscribe(email, experienced); }; return ( @@ -42,11 +43,11 @@ const CommunitySection = () => { Newsletter Stay up to date -
- +
+ { value={email} onChange={(event) => setEmail(event.target.value)} /> -
-
+
{ Do you have previous experience using Skynet?
+ + {complete && message && ( +
+ )}
diff --git a/packages/website/src/components/CommunitySection/useSubscribe.js b/packages/website/src/components/CommunitySection/useSubscribe.js new file mode 100644 index 00000000..bd12303c --- /dev/null +++ b/packages/website/src/components/CommunitySection/useSubscribe.js @@ -0,0 +1,31 @@ +import { useState, useCallback } from "react"; +import { useAsync } from "react-use"; +import jsonp from "jsonp"; + +const mailer = "https://tech.us11.list-manage.com/subscribe/post-json?u=5df238d9e852f9801b5f2c92e&id=ab6bea4cc2"; +const initialState = { complete: false, pending: false, success: false, message: "" }; +const initialData = { email: "", experienced: false }; + +export default function useSubscribe() { + const [{ email, experienced }, setData] = useState(initialData); + const [state, setState] = useState(initialState); + + useAsync(async () => { + if (!email) return; + + setState(initialState); + + const url = [mailer, `EMAIL=${email}`, `USER=${experienced ? "Yes" : "No"}`].join("&"); + + jsonp(url, { param: "c" }, (error, data) => { + const success = !error && data.result === "success"; + const message = data ? data.msg : ""; + + setState({ complete: true, pending: false, success, message }); + }); + }, [email, experienced]); + + const subscribe = useCallback((email, experienced) => setData({ email, experienced }), [setData]); + + return { subscribe, ...state }; +}