This commit is contained in:
Philippe Torrel
2026-10-27 13:55:51 +01:00
parent 6985789ef7
commit acf2deaea3
4 changed files with 172 additions and 11 deletions
@@ -3,23 +3,33 @@ import { useState } from 'react';
const FormContact = (props) => {
// const { } = props;
const FORM_DATA = {
const INITIAL_FORM_DATA = {
firstname: '',
lastname: '',
email: '',
message: '',
};
const [formData, setFormData] = useState(FORM_DATA);
// Hooks
const [formData, setFormData] = useState(INITIAL_FORM_DATA);
const [errors, setErrors] = useState({});
// EventHandlers
const handleSubmit = (e) => {
e.preventDefault();
const form = e.currentTarget;
const errors = validate(formData);
// AJAX/FETCH send to server
console.log('FormData: ', formData);
if (Object.keys(errors).length === 0) {
// AJAX/FETCH send to server
console.log('FormData: ', formData);
setFormData(INITIAL_FORM_DATA); // reset
form.reset(); // not necessary in react
setErrors({});
} else {
console.error('Form submit error');
setErrors(errors);
}
};
const handleChange = (e) => {
@@ -40,7 +50,16 @@ const FormContact = (props) => {
<label htmlFor="input-firstname" className="form-label">
Firstname
</label>
<input type="text" name="firstname" id="input-firstname" className="form-control" onChange={handleChange} />
<input
type="text"
name="firstname"
id="input-firstname"
className={`form-control ${errors.firstname ? 'is-invalid' : ''}`}
onChange={handleChange}
value={formData.firstname}
/>
<div className="valid-feedback">OK</div>
<div className="invalid-feedback">{errors?.firstname || 'Error'}</div>
</div>
</div>
<div className="col-12 col-sm-6">
@@ -48,7 +67,14 @@ const FormContact = (props) => {
<label htmlFor="input-lastname" className="form-label">
Lastname
</label>
<input type="text" name="lastname" id="input-lastname" className="form-control" onChange={handleChange} />
<input
type="text"
name="lastname"
id="input-lastname"
onChange={handleChange}
className={`form-control ${errors.lastname ? 'is-invalid' : ''}`}
/>
<div className="invalid-feedback">{errors?.lastname || 'Error'}</div>
</div>
</div>
</div>
@@ -58,7 +84,14 @@ const FormContact = (props) => {
<label htmlFor="input-email" className="form-label">
Email
</label>
<input type="email" className="form-control" id="input-email" name="email" onChange={handleChange} />
<input
type="email"
id="input-email"
name="email"
onChange={handleChange}
className={`form-control ${errors.email ? 'is-invalid' : ''}`}
/>
<div className="invalid-feedback">{errors?.email || 'Error'}</div>
</div>
</div>
</div>
@@ -73,8 +106,9 @@ const FormContact = (props) => {
id="textarea-message"
cols="30"
rows="5"
className="form-control"
onChange={handleChange}></textarea>
onChange={handleChange}
className={`form-control ${errors.message ? 'is-invalid' : ''}`}></textarea>
<div className="invalid-feedback">{errors?.message || 'Error'}</div>
</div>
</div>
</div>
@@ -0,0 +1,125 @@
import validate from '../../../utils/validators/validate';
import { useState } from 'react';
const FormContact = (props) => {
// const { } = props;
const INITIAL_FORM_DATA = {
firstname: '',
lastname: '',
email: '',
message: '',
};
// Hooks
const [formData, setFormData] = useState(INITIAL_FORM_DATA);
const [errors, setErrors] = useState({});
// EventHandlers
const handleSubmit = (e) => {
e.preventDefault();
const form = e.currentTarget;
const errors = validate(formData);
if (Object.keys(errors).length === 0) {
// AJAX/FETCH send to server
console.log('FormData: ', formData);
setFormData(INITIAL_FORM_DATA); // reset
form.reset(); // not necessary in react
setErrors({});
} else {
console.error('Form submit error');
setErrors(errors);
}
};
const handleChange = (e) => {
// console.log('Event: ', e);
const { name, value } = e.target;
setFormData((state) => ({ ...state, [name]: value }));
// console.log({ [e.target.name]: e.target.value });
// console.log('formData: ', formData);
};
return (
<form className="m-form-contact form-contact" noValidate={true} onSubmit={handleSubmit}>
<div className="row">
<div className="col-12 col-sm-6">
<div className="mb-3">
<label htmlFor="input-firstname" className="form-label">
Firstname
</label>
<input
type="text"
name="firstname"
id="input-firstname"
className={`form-control ${errors.firstname ? 'is-invalid' : ''}`}
onChange={handleChange}
value={formData.firstname}
/>
<div className="valid-feedback">OK</div>
<div className="invalid-feedback">{errors?.firstname || 'Error'}</div>
</div>
</div>
<div className="col-12 col-sm-6">
<div className="mb-3">
<label htmlFor="input-lastname" className="form-label">
Lastname
</label>
<input
type="text"
name="lastname"
id="input-lastname"
onChange={handleChange}
className={`form-control ${errors.lastname ? 'is-invalid' : ''}`}
/>
<div className="invalid-feedback">{errors?.lastname || 'Error'}</div>
</div>
</div>
</div>
<div className="row">
<div className="col">
<div className="mb-3">
<label htmlFor="input-email" className="form-label">
Email
</label>
<input
type="email"
id="input-email"
name="email"
onChange={handleChange}
className={`form-control ${errors.email ? 'is-invalid' : ''}`}
/>
<div className="invalid-feedback">{errors?.email || 'Error'}</div>
</div>
</div>
</div>
<div className="row">
<div className="col">
<div className="mb-3">
<label htmlFor="textarea-message" className="form-label">
Message
</label>
<textarea
name="message"
id="textarea-message"
cols="30"
rows="5"
onChange={handleChange}
className={`form-control ${errors.message ? 'is-invalid' : ''}`}></textarea>
<div className="invalid-feedback">{errors?.message || 'Error'}</div>
</div>
</div>
</div>
<div className="row">
<div className="col">
<button type="submit" className="btn btn-dark button-send-contact">
Send
</button>
</div>
</div>
</form>
);
};
export default FormContact;
@@ -1,4 +1,4 @@
import FormContact from '../components/forms/FormContact';
import FormContact from '../components/forms/react-hook-form/FormContact';
function ContactPage() {
return (
@@ -25,3 +25,5 @@ const validate = (formData) => {
return errors;
};
export default validate;