Handles email subscription signup+verification and sending.
sendEmail
args, form fields, etc.)/send-verification
, or just use /
to return a simple HTML form/confirm-verification
You should have a form that hits the /send-verification
API endpoint on submit. Remember to adjust the endpoint URL to that of your fork (or else you'll be signing people up for my website!). As a simple alternative, you could use the /
handler of this Val, which returns a simple HTML form. Here's a simple example using React:
const EmailSignupForm = () => {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
async function handleSubmit(e) {
e.preventDefault();
setName("");
setEmail("");
const formData = new FormData();
formData.append("name", name);
formData.append("email", email);
await fetch("https://petermillspaugh-emailSubscription.web.val.run/send-verification", {
method: "POST",
body: formData,
});
}
return (
<form onSubmit={handleSubmit}>
<label htmlFor="name">First name</label>
<input
id="name"
value={name}
onChange={(e) => setName(e.target.value)}
type="text"
required={true}
/>
<label htmlFor="email">Email</label>
<input
id="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
type="email"
required={true}
/>
<button type="submit">Subscribe</button>
</form>
);
};
You can see a full example on petemillspaugh.com: signup in the footer and code on github.
You can add/remove input fields as you wish, of course (e.g. maybe you don't need a name, or maybe you want a how'd-you-hear-about-us field). Just adjust the SQL and frontend implementation accordingly.
Create a confirmation page that accepts an email and token as query params and calls the /confirm-verification
endpoint. Simple example using React (and Next.js /page directory):
const EmailConfirmationPage = () => {
const router = useRouter();
const { email, token } = router.query;
const [isConfirmed, setIsConfirmed] = useState(false);
useEffect(() => {
async function confirmEmail() {
if (!email || !token) return;
const response = await fetch(`https://petermillspaugh-emailSubscription.web.val.run/confirm-verification?email=${email}&token=${token}`, {
method: "PUT",
});
const { confirmed } = await response.json();
if (confirmed) setIsConfirmed(true);
}
confirmEmail();
}, [email, token]);
if (!isConfirmed) return null;
return (
<main>
<h1>You’re all set!</h1>
</main>
);
};
Full example is here and code is here.
As an alternative, you could make /confirm-verification
a GET route and have your email confirmation link sent by the first route be https://petermillspaugh-emailSubscription.web.val.run/confirm-verification?email=${email}&token=${token}
(swapping in your namespace). That would be marginally faster, probably, but you'd still need some way to convey confirmation to the user (e.g. add some "You're all set" message to the return). Plus, the route writes to the subscribers
table, so a PUT feels more appropriate.
Migrated from folder: EmailSubscriptions/emailSubscription