React Newsletter Signup Form Tutorial + reCAPTCHA | Mailer Lite
In this tutorial, learn how to create a dynamic React newsletter signup form with added security using reCAPTCHA. Perfect for developers looking to implement a robust newsletter subscription feature.
Code:
import React, { useState } from 'react'
import ReCAPTCHA from "react-google-recaptcha";
import './App.css'
function App() {
const [email, setEmail] = useState("");
const [errorMessage, setErrorMessage] = useState("");
const [successMessage, setSuccessMessage] = useState("");
const recaptchaRef = React.createRef();
const handleSubmit = async (e) => {
e.preventDefault();
setErrorMessage("");
setSuccessMessage("");
const recaptchaValue = recaptchaRef.current.getValue();
if(!recaptchaValue) {
setErrorMessage("Please verify the Captcha.");
} else {
try {
// THIS NEEDS TO BE MOVED TO A SAFE API othewise your TOKEN WILL BE EXPOSED
const response = await fetch(
"https://connect.mailerlite.com/api/subscribers",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
Authorization: `Bearer YOUR_API_TOKEN`
},
body: JSON.stringify({
email: email,
groups: ["117872522076096341"]
})
}
)
const data = await response.json();
console.log(data);
if(data.errors) {
setErrorMessage(data?.message);
return;
}
setSuccessMessage("Thank you for joining our newsletter!");
} catch (error) {
console.error(error);
setErrorMessage("Failed to subscribe. Please try again later.")
}
}
}
return (
<>
<form onSubmit={handleSubmit}>
{errorMessage && <p className='error'>{errorMessage}</p>}
{successMessage && <p className='success'>{successMessage}</p>}
<input
type='email'
value={email}
placeholder='Email...'
onChange={(e) => setEmail(e.target.value)}
required
/>
<ReCAPTCHA ref={recaptchaRef} sitekey='6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI'/>
<button type='submit'>Subscribe</button>
</form>
</>
)
}
export default AppBasic CSS Styles:
form, input, button {
margin: 0;
padding: 0;
border: 0;
font-family: Arial, sans-serif;
box-sizing: border-box;
}
input {
padding: 10px;
border: 1px solid #ccc;
width: 300px;
}
button[type="submit"] {
background-color: #0069ca;
border: 1px solid #ccc;
color: #fff;
border: none;
cursor: pointer;
border-radius: 0;
}
.error {
color: red;
}
.success {
color: green;
}Support This Work
If you found this guide helpful, consider supporting me with a small donation. Your contribution helps me keep these tutorials up to date and create more quality content.
Scan to donate
Doesn’t this expose your Mailerlite API key to the frontend?
You are totally right. Ideally you need to use a safe API endpoint or any server side method. Thanks for pointing this out.