jonbio/components/NewsletterForm.js

85 lines
2.7 KiB
JavaScript
Raw Normal View History

2021-08-18 17:33:15 +02:00
import { useRef, useState } from 'react'
import siteMetadata from '@/data/siteMetadata'
2021-09-11 16:36:59 +08:00
const NewsletterForm = ({ title = 'Subscribe to the newsletter' }) => {
2021-08-18 17:33:15 +02:00
const inputEl = useRef(null)
2021-09-11 12:23:05 +08:00
const [error, setError] = useState(false)
2021-08-18 17:33:15 +02:00
const [message, setMessage] = useState('')
2021-09-02 10:17:34 +02:00
const [subscribed, setSubscribed] = useState(false)
2021-08-18 17:33:15 +02:00
const subscribe = async (e) => {
e.preventDefault()
const res = await fetch(`/api/${siteMetadata.newsletter.provider}`, {
body: JSON.stringify({
email: inputEl.current.value,
}),
headers: {
'Content-Type': 'application/json',
},
method: 'POST',
})
const { error } = await res.json()
if (error) {
2021-09-11 12:23:05 +08:00
setError(true)
2021-10-03 22:59:17 -05:00
setMessage('Your e-mail address is invalid or you are already subscribed!')
2021-08-18 17:33:15 +02:00
return
}
inputEl.current.value = ''
2021-09-11 12:23:05 +08:00
setError(false)
2021-09-02 10:17:34 +02:00
setSubscribed(true)
2021-08-18 17:33:15 +02:00
setMessage('Successfully! 🎉 You are now subscribed.')
}
return (
<div>
2021-09-11 16:36:59 +08:00
<div className="pb-1 text-lg font-semibold text-gray-800 dark:text-gray-100">{title}</div>
<form className="flex flex-col sm:flex-row" onSubmit={subscribe}>
2021-08-18 17:33:15 +02:00
<div>
<label className="sr-only" htmlFor="email-input">
Email address
</label>
<input
autoComplete="email"
2022-01-31 23:58:10 +08:00
className="w-72 rounded-md px-4 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-primary-600 dark:bg-black"
2021-08-18 17:33:15 +02:00
id="email-input"
name="email"
2021-09-10 14:32:18 +02:00
placeholder={subscribed ? "You're subscribed ! 🎉" : 'Enter your email'}
2021-08-18 17:33:15 +02:00
ref={inputEl}
required
type="email"
2021-09-02 10:17:34 +02:00
disabled={subscribed}
2021-08-18 17:33:15 +02:00
/>
</div>
2022-01-31 23:58:10 +08:00
<div className="mt-2 flex w-full rounded-md shadow-sm sm:mt-0 sm:ml-3">
2021-08-18 17:33:15 +02:00
<button
2022-01-31 23:58:10 +08:00
className={`w-full rounded-md bg-primary-500 py-2 px-4 font-medium text-white sm:py-0 ${
subscribed ? 'cursor-default' : 'hover:bg-primary-700 dark:hover:bg-primary-400'
2022-01-31 23:58:10 +08:00
} focus:outline-none focus:ring-2 focus:ring-primary-600 focus:ring-offset-2 dark:ring-offset-black`}
2021-08-18 17:33:15 +02:00
type="submit"
2021-09-02 10:17:34 +02:00
disabled={subscribed}
2021-08-18 17:33:15 +02:00
>
2021-09-02 10:17:34 +02:00
{subscribed ? 'Thank you!' : 'Sign up'}
2021-08-18 17:33:15 +02:00
</button>
</div>
</form>
2021-09-11 12:23:05 +08:00
{error && (
2022-01-31 23:58:10 +08:00
<div className="w-72 pt-2 text-sm text-red-500 dark:text-red-400 sm:w-96">{message}</div>
2021-09-11 12:23:05 +08:00
)}
2021-08-18 17:33:15 +02:00
</div>
)
}
2021-09-11 16:36:59 +08:00
export default NewsletterForm
export const BlogNewsletterForm = ({ title }) => (
<div className="flex items-center justify-center">
2022-01-31 23:58:10 +08:00
<div className="bg-gray-100 p-6 dark:bg-gray-800 sm:px-14 sm:py-8">
2021-09-11 16:36:59 +08:00
<NewsletterForm title={title} />
</div>
</div>
)