~ 1 min read
Create Contact forms with Next.js 13, React + Tailwindcss
Share:
This is the code to accompany the youtube video on building contact forms with Next.js
"use client";
import { useState } from "react";
export default function ContactForm() {
const [loading, setLoading] = useState(false);
async function handleSubmit(event: any) {
event.preventDefault();
setLoading(true);
const data = {
name: String(event.target.name.value),
email: String(event.target.email.value),
message: String(event.target.message.value),
};
const response = await fetch("/api/contact", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});
if (response.ok) {
console.log("Message sent successfully");
setLoading(false);
// reset the form
event.target.name.value = "";
event.target.email.value = "";
event.target.message.value = "";
}
if (!response.ok) {
console.log("Error sending message");
setLoading(false);
}
}
return (
<form onSubmit={handleSubmit}>
<div className="w-full flex flex-col my-4">
<label className="font-bold text-gray-800" htmlFor="name">
Name
</label>
<input
type="text"
minLength={3}
maxLength={150}
required
className=" p-4 bg-gray-50 border border-gray-100 "
autoComplete="off"
id="name"
/>
</div>
<div className="w-full flex flex-col my-4">
<label className="font-bold text-gray-800" htmlFor="email">
Email
</label>
<input
type="email"
minLength={5}
maxLength={150}
required
className=" p-4 bg-gray-50 border border-gray-100 "
autoComplete="off"
id="email"
/>
</div>
<div>
<label className="font-bold text-gray-800" htmlFor="message">
Message
</label>
<textarea
rows={4}
required
minLength={10}
maxLength={500}
name="message"
className="w-full p-4 bg-gray-50 border border-gray-100 "
/>
</div>
<button
type="submit"
disabled={loading}
className="px-4 py-2 w-40 bg-gray-700 disabled:bg-gray-400 disabled:text-gray-100 text-white font-medium mt-4">
Send Message
</button>
</form>
);
}
Share: