I'm using React 16.13 and Bootstrap 4. I have the following form container ...
const FormContainer = (props) => {
...
const handleFormSubmit = (e) => {
e.preventDefault();
CoopService.save(coop, setErrors, function(data) {
const result = data;
history.push({
pathname: "/" + result.id + "/people",
state: { coop: result, message: "Success" },
});
window.scrollTo(0, 0);
});
};
return (
<div>
<form className="container-fluid" onSubmit={handleFormSubmit}>
<FormGroup controlId="formBasicText">
...
{/* Web site of the cooperative */}
<Button
action={handleFormSubmit}
type={"primary"}
title={"Submit"}
style={buttonStyle}
/>{" "}
{/*Submit */}
</FormGroup>
</form>
</div>
);
Is there a standard way to disable the submit button to prevent a duplicate form submission? The catch is if there are errors in the form that come back from the server, I would like the button to be enabled again. Below is the "CoopService.save" I referenced above ...
...
save(coop, setErrors, callback) {
// Make a copy of the object in order to remove unneeded properties
coop.addresses[0].raw = coop.addresses[0].formatted;
const NC = JSON.parse(JSON.stringify(coop));
delete NC.addresses[0].country;
const body = JSON.stringify(NC);
const url = coop.id
? REACT_APP_PROXY + "/coops/" + coop.id + "/"
: REACT_APP_PROXY + "/coops/";
const method = coop.id ? "PUT" : "POST";
fetch(url, {
method: method,
body: body,
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
})
.then((response) => {
if (response.ok) {
return response.json();
} else {
throw response;
}
})
.then((data) => {
callback(data);
})
.catch((err) => {
console.log("errors ...");
err.text().then((errorMessage) => {
console.log(JSON.parse(errorMessage));
setErrors(JSON.parse(errorMessage));
});
});
}
Not sure if it's relevant, but here is my Button component. Willing to change it or the above to help with implementing a standard, out-of-the-box way to solve this.
import React from "react";
const Button = (props) => {
return (
<button
style={props.style}
className={
props.type === "primary" ? "btn btn-primary" : "btn btn-secondary"
}
onClick={props.action}
>
{props.title}
</button>
);
};
export default Button;