SAAS service Resend to send emails whenever a new form is created.
Overview
Portfolio website for a corporation which provides a contact us form along with the basic information about the company.
Technology Used:-
React, Node, Typescript, Tailwind CSS
Let's Quick Setup The Project
React:-
Use the following commands to setup the React Project
npm create vite@latest my-vite-app - - template react-ts
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
Install some basic react library like react-router-dom and react-hook-form.
Project Structure
Comming to important feature designing of contact.tsx page.
Contact.tsx page
import { useForm } from "react-hook-form";
import axios from "axios";
type FormValues = {
name: string;
email: string;
companyName: string;
feedback: string;
}
const Contact = () => {
const {
register,
handleSubmit,
formState: { errors },
reset,
} = useForm<FormValues>();
const submitHandler = async (data: FormValues) => {
try {
await axios.post("http://localhost:8001/send", {
from: "onboarding@resend.dev",
to: data.email,
subject: data.companyName,
html: data.feedback
})
alert("message is sent");
reset();
} catch (error) {
alert("message not sent");
}
};
return (
<section>
<div className="flex justify-around mt-16 py-5">
<div>
<h3 className="text-xl font-semibold">Contact us</h3>
<h1 className="text-6xl font-bold mt-5">Let's Talk!</h1>
<h4 className="text-xl text-slate-600 mt-5">We will reach out to you within 24 hours</h4>
<h4 className="text-lg text-slate-700 font-semibold mt-7">Don't like filling up forms? Email us directly at-</h4>
<div> <p className="text-slate-600 mt-1">hi@truedax.io</p></div>
</div>
<div className="">
<form onSubmit={handleSubmit(submitHandler)} className="w-[400px] max-w-md space-y-8">
<div>
<input
{...register('name',{ required: true })}
type="text"
className="w-full py-3 px-4 placeholder-gray-500 text-sm border-gray-300 rounded-md"
placeholder="Name"
/>
{errors.name && <p className="text-red-600">Name is required</p>}
</div>
<div>
<input
{...register('email',{ required: true })}
type="email"
className="w-full py-3 px-4 placeholder-gray-500 text-sm border-gray-300 rounded-md"
placeholder="Email"
/>
{errors.email && <p className="text-red-600">Please enter a valid email</p>}
</div>
<div>
<input
{...register('companyName',{ required: true })}
type="text"
className="w-full py-3 px-4 placeholder-gray-500 focus:ring-indigo-500 focus:border-indigo-500 text-sm border-gray-300 rounded-md"
placeholder="Company Name"
/>
{errors.companyName && <p className="text-red-600">Company name is required</p>}
</div>
<div>
<input
{...register('feedback',{ required: true })}
type="text"
className="w-full py-3 px-4 placeholder-gray-500 focus:ring-indigo-500 focus:border-indigo-500 text-sm border-gray-300 rounded-md"
placeholder="How can we help you? Feel free to get in touch!"
/>
{errors.feedback && <p className="text-red-600">Feedback is required</p>}
</div>
<div>
<button
type="submit"
className="group w-1/2 flex justify-center py-2 px-4 border border-transparent text-xl font-medium rounded-full text-white bg-green-600 hover:bg-green-900 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500"
>
Submit
</button>
</div>
</form>
</div>
</div>
</section>
);
};
export default Contact;
Setting up the backend Server form resend.
Create a backend server using the following command.
yarn init
yarn add typescript -D
yarn add tsc-watch -D
yarn add express
yarn add resend
Make sure that you create a api Key from resend to setup the backend.
server.ts file
import express from 'express';
import bodyParser from 'body-parser';
import { Resend } from 'resend';
import cors from 'cors';
const resend = new Resend('RESEND API KEY ENTER HERE');
const app = express();
app.use(cors());
app.use(bodyParser.json());
app.post("/send", async (req, res) => {
const { from, to, subject, html } = req.body;
try {
const { data, error } = await resend.emails.send({ from, to, subject, html });
console.log(data);
if (error) {
console.error('Error sending email:', error);
res.status(500).json({ error: 'Error sending email' });
return;
}
res.status(200).json({ message: 'Email sent successfully', data });
} catch (error) {
console.error(error);
}
})
app.get("/", (req, res) => {
res.send({
name: "get is working"
})
})
app.listen(8001, () =>
console.log('Example app listening on port 8001!'),
);
To Start the server command Yarn dev