@amalsr/bootstrap-contact-form
Version:
A Bootstrap-based contact form widget for React, Next.js, and raw HTML via <script>.
156 lines (152 loc) • 5.47 kB
JSX
import React, { useState } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import { useFormik } from "formik";
import * as Yup from "yup";
const ContactForm = ({ heading = "Contact Us" }) => {
const formik = useFormik({
initialValues: {
firstName: "",
lastName: "",
email: "",
message: "",
phone: "",
},
validationSchema: Yup.object({
firstName: Yup.string().required("Please enter first name."),
lastName: Yup.string().required("Please enter last name."),
email: Yup.string().email("Invalid email").required("Email is required"),
message: Yup.string().required("Message is required"),
}),
onSubmit: (values) => {
const event = new CustomEvent("contactFormSubmit", { detail: values });
window.dispatchEvent(event);
},
});
return (
<div className="container mt-4">
<h3>{heading}</h3>
<form onSubmit={formik.handleSubmit} noValidate>
<div className="row mb-3">
<div className="col-md-6">
<div className="form-group">
<label className="form-label">
First Name <span className="text-danger">*</span>
</label>
<input
className={`form-control ${
formik.touched.firstName && formik.errors.firstName
? "is-invalid"
: ""
}`}
name="firstName"
placeholder="First Name"
onChange={formik.handleChange}
onBlur={formik.handleBlur}
value={formik.values.firstName}
/>
{formik.touched.firstName && formik.errors.firstName && (
<div className="text-danger">{formik.errors.firstName}</div>
)}
</div>
</div>
<div className="col-md-6">
<div className="form-group">
<label className="form-label">
Last Name <span className="text-danger">*</span>
</label>
<input
className={`form-control ${
formik.touched.lastName && formik.errors.lastName
? "is-invalid"
: ""
}`}
name="lastName"
placeholder="Last Name"
onChange={formik.handleChange}
onBlur={formik.handleBlur}
value={formik.values.lastName}
/>
{formik.touched.lastName && formik.errors.lastName && (
<div className="text-danger">{formik.errors.lastName}</div>
)}
</div>
</div>
</div>
<div className="row mb-3">
<div className="col-md-6">
<div className="form-group">
<label className="form-label">
Email <span className="text-danger">*</span>
</label>
<input
className={`form-control ${
formik.touched.email && formik.errors.email
? "is-invalid"
: ""
}`}
name="email"
placeholder="Email"
onChange={formik.handleChange}
onBlur={formik.handleBlur}
value={formik.values.email}
/>
{formik.touched.email && formik.errors.email && (
<div className="text-danger">{formik.errors.email}</div>
)}
</div>
</div>
<div className="col-md-6">
<div className="form-group">
<label className="form-label">
Phone <span className="text-danger"></span>
</label>
<input
className={`form-control ${
formik.touched.phone && formik.errors.phone
? "is-invalid"
: ""
}`}
name="phone"
placeholder="Phone"
onChange={formik.handleChange}
onBlur={formik.handleBlur}
value={formik.values.phone}
/>
{formik.touched.phone && formik.errors.phone && (
<div className="text-danger">{formik.errors.phone}</div>
)}
</div>
</div>
</div>
<div className="row mb-3">
<div className="col-md-12">
<div className="form-group">
<label className="form-label">
Message <span className="text-danger">*</span>
</label>
<textarea
name="message"
className={`form-control ${
formik.touched.message && formik.errors.message
? "is-invalid"
: ""
}`}
placeholder="Your Message"
onChange={formik.handleChange}
onBlur={formik.handleBlur}
value={formik.values.message}
></textarea>
{formik.touched.message && formik.errors.message && (
<div className="invalid-feedback">{formik.errors.message}</div>
)}
</div>
</div>
</div>
<button className="btn btn-primary" type="submit">
Submit
</button>
</form>
</div>
);
};
export default ContactForm;