294 lines
11 KiB
JavaScript
294 lines
11 KiB
JavaScript
"use client";
|
||
|
||
import { useState, useEffect } from "react";
|
||
import ReCAPTCHA from "react-google-recaptcha";
|
||
import axios from "axios";
|
||
import Layout from "@/components/layout/Layout";
|
||
import Link from "next/link";
|
||
|
||
export default function Contact() {
|
||
const [formData, setFormData] = useState({
|
||
username: "",
|
||
email: "",
|
||
subject: "",
|
||
message: "",
|
||
});
|
||
|
||
const [formErrors, setFormErrors] = useState({});
|
||
const [captchaToken, setCaptchaToken] = useState(null);
|
||
const [alert, setAlert] = useState({ show: false, type: "", message: "" });
|
||
|
||
const handleChange = (e) => {
|
||
const { name, value } = e.target;
|
||
setFormData((prev) => ({ ...prev, [name]: value }));
|
||
};
|
||
|
||
const handleCaptchaChange = (token) => {
|
||
|
||
setCaptchaToken(token);
|
||
};
|
||
|
||
const handleSubmit = async (e) => {
|
||
e.preventDefault();
|
||
|
||
const errors = {};
|
||
if (!formData.username.trim()) errors.username = "Name is required.";
|
||
if (!formData.email.trim()) errors.email = "Email is required.";
|
||
if (!formData.subject.trim()) errors.subject = "Subject is required.";
|
||
if (!formData.message.trim()) errors.message = "Message is required.";
|
||
if (!captchaToken) errors.captcha = "Please verify the CAPTCHA.";
|
||
|
||
setFormErrors(errors);
|
||
|
||
if (Object.keys(errors).length > 0) {
|
||
return;
|
||
}
|
||
|
||
const emailData = {
|
||
...formData,
|
||
message: `Subject: ${formData.subject}<br /><br />Message: ${formData.message}`,
|
||
to: "info@zipvan.ca",
|
||
senderName: "ZipVan Contact Page",
|
||
recaptchaToken: captchaToken,
|
||
};
|
||
|
||
try {
|
||
|
||
const res = await axios.post("https://mailserver.metatronnest.com/send", emailData, {
|
||
headers: { "Content-Type": "application/json" },
|
||
});
|
||
|
||
|
||
setAlert({
|
||
show: true,
|
||
type: "success",
|
||
message: res?.data?.message || "Message sent successfully!",
|
||
});
|
||
|
||
setFormData({ username: "", email: "", subject: "", message: "" });
|
||
setCaptchaToken(null);
|
||
setFormErrors({});
|
||
} catch (error) {
|
||
setAlert({
|
||
show: true,
|
||
type: "danger",
|
||
message: "Failed to send message. Please try again later.",
|
||
});
|
||
}
|
||
};
|
||
|
||
// Auto-hide alert
|
||
useEffect(() => {
|
||
if (alert.show) {
|
||
const timer = setTimeout(() => {
|
||
setAlert((prev) => ({ ...prev, show: false }));
|
||
}, 5000);
|
||
return () => clearTimeout(timer);
|
||
}
|
||
}, [alert.show]);
|
||
|
||
return (
|
||
<>
|
||
<Layout breadcrumbTitle="Contact" background="/assets/images/contact/contact-banner.webp" footerStyle={2}>
|
||
<section className="contact-section">
|
||
<div className="pd_top_90" />
|
||
<div className="container">
|
||
{/* Use g-4 to add spacing between all cards responsively */}
|
||
<div className="row align-items-stretch g-4">
|
||
<div className="col-lg-4 col-md-6 col-sm-12">
|
||
<div className="contact_box_content h-100 d-flex flex-column justify-content-center">
|
||
<div className="icon trans">
|
||
<img src="/assets/images/cont-1.png" alt="img" className="img-fluid" />
|
||
</div>
|
||
<div className="contact-infor">
|
||
<h6 className="title_no_a_24">Location</h6>
|
||
<span>Southern Ontario, Canada</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="col-lg-4 col-md-6 col-sm-12">
|
||
<div className="contact_box_content h-100 d-flex flex-column justify-content-center">
|
||
<div className="icon trans">
|
||
<img src="/assets/images/cont-2.png" alt="img" className="img-fluid" />
|
||
</div>
|
||
<div className="contact-infor">
|
||
<h6 className="title_no_a_24">Email</h6>
|
||
<Link href="mailto:info@zipvan.ca">info@zipvan.ca</Link>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="col-lg-4 col-md-6 col-sm-12">
|
||
<div className="contact_box_content h-100 d-flex flex-column justify-content-center">
|
||
<div className="icon trans">
|
||
<img src="/assets/images/cont-3.png" alt="img" className="img-fluid" />
|
||
</div>
|
||
<div className="contact-infor">
|
||
<h6 className="title_no_a_24">Call Us</h6>
|
||
<Link href="tel:(647) 360-2075">(647) 360-2075</Link>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="pd_bottom_90" />
|
||
</section>
|
||
|
||
{/* form */}
|
||
<section className="form-section bg_light_4 position-relative">
|
||
<div className="pd_top_90" />
|
||
<div className="container">
|
||
<div className="row">
|
||
<div className="col-lg-4 col-md-12">
|
||
<div className="section_title type_one">
|
||
<h4 className="sm_title"> Get In Touch</h4>
|
||
<div className="title_whole">
|
||
<h2 className="title"> Contact Zip Van We’re Here to Help</h2>
|
||
</div>
|
||
<p>
|
||
Get in touch with us for bookings, pricing, or any questions. We’re here to help you move with ease.
|
||
</p>
|
||
</div>
|
||
<div className="pd_bottom_40" />
|
||
<div className="social-icons">
|
||
<ul>
|
||
<li>
|
||
<Link
|
||
href="https://www.instagram.com/zipvan.ca?igsh=aTRvdXhhOHk4cXM0"
|
||
className="m_icon"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
>
|
||
<i className="fab fa-instagram" />
|
||
</Link>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div className="pd_bottom_20" />
|
||
</div>
|
||
|
||
<div className="col-lg-8 col-md-12">
|
||
<section className="contact_form_box_all">
|
||
<div className="contact_form_shortcode">
|
||
{alert.show && (
|
||
<div className={`alert alert-${alert.type}`}>{alert.message}</div>
|
||
)}
|
||
|
||
<form onSubmit={handleSubmit} role="form">
|
||
<div className="controls">
|
||
<div className="row">
|
||
<div className="col-md-6 col-sm-12">
|
||
<div className="form-group">
|
||
<input
|
||
type="text"
|
||
name="username"
|
||
placeholder="Your Name *"
|
||
value={formData.username}
|
||
onChange={handleChange}
|
||
/>
|
||
{formErrors.username && (
|
||
<small className="text-danger">{formErrors.username}</small>
|
||
)}
|
||
</div>
|
||
</div>
|
||
<div className="col-md-6 col-sm-12">
|
||
<div className="form-group">
|
||
<input
|
||
type="email"
|
||
name="email"
|
||
placeholder="Email *"
|
||
value={formData.email}
|
||
onChange={handleChange}
|
||
/>
|
||
{formErrors.email && (
|
||
<small className="text-danger">{formErrors.email}</small>
|
||
)}
|
||
</div>
|
||
</div>
|
||
<div className="col-sm-12">
|
||
<div className="form-group">
|
||
<input
|
||
type="text"
|
||
name="subject"
|
||
placeholder="Subject *"
|
||
value={formData.subject}
|
||
onChange={handleChange}
|
||
/>
|
||
{formErrors.subject && (
|
||
<small className="text-danger">{formErrors.subject}</small>
|
||
)}
|
||
</div>
|
||
</div>
|
||
<div className="col-sm-12">
|
||
<div className="form-group">
|
||
<textarea
|
||
name="message"
|
||
placeholder="Additional Information..."
|
||
rows={3}
|
||
value={formData.message}
|
||
onChange={handleChange}
|
||
/>
|
||
{formErrors.message && (
|
||
<small className="text-danger">{formErrors.message}</small>
|
||
)}
|
||
</div>
|
||
</div>
|
||
|
||
<div className="col-sm-12 mb-3">
|
||
<ReCAPTCHA
|
||
sitekey="6LekfpwrAAAAAOTwuP1d2gg-Fv9UEsAjE2gjOQJl"
|
||
onChange={handleCaptchaChange}
|
||
/>
|
||
{formErrors.captcha && (
|
||
<small className="text-danger">{formErrors.captcha}</small>
|
||
)}
|
||
</div>
|
||
|
||
<div className="col-sm-12">
|
||
<div className="form-group mg_top apbtn">
|
||
<button className="theme_btn" type="submit">
|
||
Send Message
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{/* <div className="ab_img_left_bottom z_0 mr_top_minus_150">
|
||
<img src="/assets/images/bg-1.png" className="img-fluid" alt="img" />
|
||
</div> */}
|
||
<div className="pd_bottom_90" />
|
||
</section>
|
||
|
||
<section className="contact-map-section">
|
||
<div className="container-no">
|
||
<div className="row">
|
||
<div className="col-lg-12">
|
||
<section className="map-section">
|
||
<div className="map-outer">
|
||
<iframe
|
||
src="https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d463241.8464937742!2d-79.3832!3d43.6532!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x882b34d64d54a7ab%3A0x6d5f8f8d3df7a25f!2sToronto%2C%20ON!5e0!3m2!1sen!2sca!4v1694170812345!5m2!1sen!2sca"
|
||
height={570}
|
||
style={{ border: 0, width: "100%" }}
|
||
allowFullScreen
|
||
loading="lazy"
|
||
referrerPolicy="no-referrer-when-downgrade"
|
||
/>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</Layout>
|
||
</>
|
||
);
|
||
}
|