ASPNetCore/Next/components/ProductForm.tsx

72 lines
2.5 KiB
TypeScript
Raw Normal View History

2021-03-29 07:08:26 +00:00
import { faChevronUp } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
2021-03-29 09:53:55 +00:00
import React, { useState } from "react";
import { validateForm } from "../lib/product";
import Errors from "./Errors";
2021-03-29 07:08:26 +00:00
2021-03-29 09:53:55 +00:00
export default function ProductForm({ name, price, onFormChange, onSubmit, busy }) {
let [form, setForm] = useState({
2021-03-29 07:08:26 +00:00
name: "",
value: "",
2021-03-29 09:53:55 +00:00
});
let [errors, setErrors] = useState({
name: new Array<string>(),
price: new Array<string>(),
});
let nameChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
2021-03-29 07:08:26 +00:00
name = e.target.value;
2021-03-29 09:53:55 +00:00
setErrors(validateForm({name,price}));
onFormChange({ name, price });
2021-03-29 07:08:26 +00:00
}
let priceChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
price = e.target.value;
2021-03-29 09:53:55 +00:00
setErrors(validateForm({name,price}));
onFormChange({ name, price });
}
let isValid = (prop) => {
if(errors[prop].length > 0) {
return "form-control is-invalid";
} else {
return "form-control is-valid";
}
2021-03-29 07:08:26 +00:00
}
2021-03-29 09:53:55 +00:00
let submit = (e: React.FormEvent<HTMLFormElement>) => {
2021-03-29 07:08:26 +00:00
e.preventDefault()
2021-03-29 09:53:55 +00:00
let currentErrors = validateForm({ name, price});
if (currentErrors.name.length === 0 && currentErrors.price.length === 0) {
onSubmit();
}
2021-03-29 07:08:26 +00:00
}
2021-03-29 09:53:55 +00:00
2021-03-29 07:08:26 +00:00
return (
2021-03-29 09:53:55 +00:00
<div>
<form onSubmit={submit}>
<fieldset disabled={busy}>
<div>
<label htmlFor="name">Name</label>
<input className={isValid("name")} id="name" value={name} onChange={nameChanged}></input>
</div>
<div className="mb-3">
<Errors errors={errors.name} />
</div>
<div>
<label htmlFor="price">Price</label>
<input type="number" className={isValid("price")} id="price" value={price} onChange={priceChanged}></input>
</div>
<div className="mb-3">
<Errors errors={errors.price} />
</div>
<div className="mb-3">
<button type="submit" className="btn btn-primary">
<FontAwesomeIcon icon={faChevronUp} /> Submit
2021-03-29 07:08:26 +00:00
</button>
2021-03-29 09:53:55 +00:00
</div>
</fieldset>
</form>
</div>
2021-03-29 07:08:26 +00:00
);
}