209 lines
5.8 KiB
JavaScript
209 lines
5.8 KiB
JavaScript
"use client";
|
|
import { useState, useEffect } from "react";
|
|
import ReCAPTCHA from "react-google-recaptcha";
|
|
import axios from "axios";
|
|
import { BaseUrl } from "@/utility/BaseUrl.utils";
|
|
|
|
const ContactForm = () => {
|
|
const [formData, setFormData] = useState({
|
|
name: "",
|
|
email: "",
|
|
phone_number: "",
|
|
subject: "",
|
|
message: "",
|
|
});
|
|
|
|
const [alert, setAlert] = useState({
|
|
show: false,
|
|
message: "",
|
|
type: "",
|
|
});
|
|
|
|
const [captchaToken, setCaptchaToken] = useState(null);
|
|
|
|
useEffect(() => {
|
|
if (alert.show) {
|
|
const timer = setTimeout(() => {
|
|
setAlert({ ...alert, show: false });
|
|
}, 5000);
|
|
return () => clearTimeout(timer);
|
|
}
|
|
}, [alert]);
|
|
|
|
const handleChange = (e) => {
|
|
const { name, value } = e.target;
|
|
setFormData((prev) => ({ ...prev, [name]: value }));
|
|
};
|
|
|
|
const handleCaptchaChange = (token) => {
|
|
setCaptchaToken(token);
|
|
};
|
|
|
|
const handleSubmit = async (e) => {
|
|
e.preventDefault();
|
|
|
|
if (!captchaToken) {
|
|
setAlert({
|
|
show: true,
|
|
message: "Please verify the CAPTCHA.",
|
|
type: "danger",
|
|
});
|
|
return;
|
|
}
|
|
|
|
const emailData = {
|
|
...formData,
|
|
to: "info@shivasakthi.ca",
|
|
senderName: "Shivasakthi Restaurant",
|
|
recaptchaToken: captchaToken,
|
|
};
|
|
|
|
try {
|
|
const res = await axios.post(BaseUrl, emailData, {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
|
|
setAlert({
|
|
show: true,
|
|
message: res?.data?.message || "Message sent successfully!",
|
|
type: "success",
|
|
});
|
|
|
|
setFormData({
|
|
name: "",
|
|
email: "",
|
|
phone_number: "",
|
|
subject: "",
|
|
message: "",
|
|
});
|
|
setCaptchaToken(null);
|
|
} catch (error) {
|
|
setAlert({
|
|
show: true,
|
|
message: "Failed to send message. Please try again later.",
|
|
type: "danger",
|
|
});
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div className="contact-page-form">
|
|
<h3>Send Us Message</h3>
|
|
<p>Have a question or need assistance? Fill out the form below and our team will get back to you as soon as possible.
|
|
*</p>
|
|
<form id="contactForm" className="contactForm" name="contactForm" onSubmit={handleSubmit}>
|
|
<div className="row mt-30 gap-20">
|
|
<div className="col-sm-6">
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
id="name"
|
|
name="name"
|
|
className="form-control"
|
|
placeholder="Full Name"
|
|
required
|
|
data-error="Please enter your Name"
|
|
value={formData.name}
|
|
onChange={handleChange}
|
|
/>
|
|
<div className="help-block with-errors" />
|
|
</div>
|
|
</div>
|
|
<div className="col-sm-6">
|
|
<div className="form-group">
|
|
<input
|
|
type="email"
|
|
id="email"
|
|
name="email"
|
|
className="form-control"
|
|
placeholder="Email Address"
|
|
required
|
|
data-error="Please enter your Email"
|
|
value={formData.email}
|
|
onChange={handleChange}
|
|
/>
|
|
<div className="help-block with-errors" />
|
|
</div>
|
|
</div>
|
|
<div className="col-sm-6">
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
id="phone_number"
|
|
name="phone_number"
|
|
className="form-control"
|
|
placeholder="Phone"
|
|
required
|
|
data-error="Please enter your Phone No"
|
|
value={formData.phone_number}
|
|
onChange={handleChange}
|
|
/>
|
|
<div className="help-block with-errors" />
|
|
</div>
|
|
</div>
|
|
<div className="col-sm-6">
|
|
<div className="form-group">
|
|
<input
|
|
type="text"
|
|
id="subject"
|
|
name="subject"
|
|
className="form-control"
|
|
placeholder="Subject"
|
|
required
|
|
data-error="Please enter your Subject"
|
|
value={formData.subject}
|
|
onChange={handleChange}
|
|
/>
|
|
<div className="help-block with-errors" />
|
|
</div>
|
|
</div>
|
|
<div className="col-sm-12">
|
|
<div className="form-group">
|
|
<textarea
|
|
name="message"
|
|
id="message"
|
|
className="form-control"
|
|
rows={4}
|
|
placeholder="Write Message"
|
|
required
|
|
data-error="Please enter your Message"
|
|
value={formData.message}
|
|
onChange={handleChange}
|
|
/>
|
|
<div className="help-block with-errors" />
|
|
</div>
|
|
</div>
|
|
<div className="col-sm-12 mt-3 mb-3">
|
|
<ReCAPTCHA
|
|
sitekey="6LcGsNkrAAAAAKtqLyzbOb9emB3JSHUFSXGiDiO1"
|
|
onChange={handleCaptchaChange}
|
|
/>
|
|
</div>
|
|
<div className="col-sm-12">
|
|
<div className="form-group mb-0">
|
|
<button type="submit" className="theme-btn">
|
|
Send Message Us <i className="far fa-arrow-alt-right" />
|
|
</button>
|
|
<div id="msgSubmit" className="hidden" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
{alert.show && (
|
|
<div className={`alert alert-${alert.type} alert-dismissible fade show`} role="alert">
|
|
{alert.message}
|
|
<button
|
|
type="button"
|
|
className="btn-close"
|
|
onClick={() => setAlert({ ...alert, show: false })}
|
|
></button>
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default ContactForm;
|