You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

170 line
7.6 KiB

  1. import React, { useState } from 'react';
  2. import { useForm } from 'react-hook-form';
  3. import axios from 'axios';
  4. import Swal from 'sweetalert2'
  5. import withReactContent from 'sweetalert2-react-content'
  6. const MySwal = withReactContent(Swal)
  7. import baseUrl from '../../utils/baseUrl';
  8. const alertContent = () => {
  9. MySwal.fire({
  10. title: 'Congratulations!',
  11. text: 'Your message was successfully send and will back to you soon',
  12. icon: 'success',
  13. timer: 2000,
  14. timerProgressBar: true,
  15. showConfirmButton: false,
  16. })
  17. }
  18. // Form initial state
  19. const INITIAL_STATE = {
  20. name: "",
  21. email: "",
  22. number: "",
  23. subject: "",
  24. text: ""
  25. };
  26. const ContactForm = () => {
  27. const [contact, setContact] = useState(INITIAL_STATE);
  28. const { register, handleSubmit, errors } = useForm();
  29. const handleChange = e => {
  30. const { name, value } = e.target;
  31. setContact(prevState => ({ ...prevState, [name]: value }));
  32. console.log(contact)
  33. }
  34. const onSubmit = async e => {
  35. // e.preventDefault();
  36. try {
  37. const url = `${baseUrl}/api/contact`;
  38. const { name, email, number, subject, text } = contact;
  39. const payload = { name, email, number, subject, text };
  40. await axios.post(url, payload);
  41. console.log(url);
  42. setContact(INITIAL_STATE);
  43. alertContent();
  44. } catch (error) {
  45. console.log(error)
  46. }
  47. };
  48. return (
  49. <div className="contact-area ptb-80">
  50. <div className="container">
  51. <div className="section-title">
  52. <h2>Get In Touch With Us</h2>
  53. <div className="bar"></div>
  54. <p>Anything On your Mind. We’ll Be Glad To Assist You!</p>
  55. </div>
  56. <div className="row align-items-center">
  57. <div className="col-lg-6 col-md-12">
  58. <img src="/images/contact-img.png" alt="image" />
  59. </div>
  60. <div className="col-lg-6 col-md-12">
  61. <form id="contactForm" onSubmit={handleSubmit(onSubmit)}>
  62. <div className="row">
  63. <div className="col-lg-12 col-md-12">
  64. <div className="form-group">
  65. <input
  66. type="text"
  67. name="name"
  68. placeholder="Your Name"
  69. className="form-control"
  70. value={contact.name}
  71. onChange={handleChange}
  72. ref={register({ required: true })}
  73. />
  74. <div className='invalid-feedback' style={{display: 'block'}}>
  75. {errors.name && 'Name is required.'}
  76. </div>
  77. </div>
  78. </div>
  79. <div className="col-lg-12 col-md-12">
  80. <div className="form-group">
  81. <input
  82. type="text"
  83. name="email"
  84. placeholder="Your email address"
  85. className="form-control"
  86. value={contact.email}
  87. onChange={handleChange}
  88. ref={register({ required: true, pattern: /^\S+@\S+$/i })}
  89. />
  90. <div className='invalid-feedback' style={{display: 'block'}}>
  91. {errors.email && 'Email is required.'}
  92. </div>
  93. </div>
  94. </div>
  95. <div className="col-lg-6 col-md-6">
  96. <div className="form-group">
  97. <input
  98. type="text"
  99. name="number"
  100. placeholder="Your phone number"
  101. className="form-control"
  102. value={contact.number}
  103. onChange={handleChange}
  104. ref={register({ required: true })}
  105. />
  106. <div className='invalid-feedback' style={{display: 'block'}}>
  107. {errors.number && 'Number is required.'}
  108. </div>
  109. </div>
  110. </div>
  111. <div className="col-lg-6 col-md-6">
  112. <div className="form-group">
  113. <input
  114. type="text"
  115. name="subject"
  116. placeholder="Your Subject"
  117. className="form-control"
  118. value={contact.subject}
  119. onChange={handleChange}
  120. ref={register({ required: true })}
  121. />
  122. <div className='invalid-feedback' style={{display: 'block'}}>
  123. {errors.subject && 'Subject is required.'}
  124. </div>
  125. </div>
  126. </div>
  127. <div className="col-lg-12 col-md-12">
  128. <div className="form-group">
  129. <textarea
  130. name="text"
  131. cols="30"
  132. rows="5"
  133. placeholder="Write your message..."
  134. className="form-control"
  135. value={contact.text}
  136. onChange={handleChange}
  137. ref={register({ required: true })}
  138. />
  139. <div className='invalid-feedback' style={{display: 'block'}}>
  140. {errors.text && 'Message is required.'}
  141. </div>
  142. </div>
  143. </div>
  144. <div className="col-lg-12 col-sm-12">
  145. <button type="submit" className="btn btn-primary">Send Message</button>
  146. </div>
  147. </div>
  148. </form>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. )
  154. }
  155. export default ContactForm;