ASPNetCore/Next/pages/product/edit/[id].tsx

108 lines
2.9 KiB
TypeScript
Raw Normal View History

2021-03-29 07:40:58 +00:00
import React, { useEffect, useState } from 'react';
import { useRouter } from 'next/router';
2021-03-29 07:08:26 +00:00
import { Layout } from '../../shared/Layout';
import { ProductClient } from '../../../APIClient';
import Swal from 'sweetalert2';
import ProductForm from '../../../components/ProductForm';
import Link from 'next/link';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faArrowLeft } from '@fortawesome/free-solid-svg-icons';
2021-03-29 07:40:58 +00:00
import { validateForm } from '../../../lib/product';
2021-03-29 07:08:26 +00:00
function Errors({ errors }) {
return errors.map(x => (
<li>{x}</li>
));
}
2021-03-29 07:40:58 +00:00
function EditProduct({ productID }) {
if (typeof productID != "string") {
return (
<div>
</div>
)
2021-03-29 07:08:26 +00:00
}
2021-03-29 07:40:58 +00:00
let [form, setForm] = useState({ name: "", price: 0 });
let [busy, setBusy] = useState(false);
let [errors,setErrors] = useState([""]);
const getInitialData = async() => {
2021-03-29 07:08:26 +00:00
const client = new ProductClient();
2021-03-29 07:40:58 +00:00
let data = await client.get(productID);
setBusy(false);
setForm(
{
name: data.name,
price: data.price,
}
);
2021-03-29 07:08:26 +00:00
}
2021-03-29 07:40:58 +00:00
// Startup
useEffect(() => {
setBusy(true);
if (productID) {
getInitialData();
}
}, [productID]);
2021-03-29 09:53:55 +00:00
const onFormChanged = (form) => {
setForm(form);
2021-03-29 07:08:26 +00:00
}
2021-03-29 09:53:55 +00:00
2021-03-29 07:40:58 +00:00
const validate = () => {
let errors: string[] = validateForm(form);
setErrors(errors);
2021-03-29 07:08:26 +00:00
return errors.length == 0;
}
2021-03-29 07:40:58 +00:00
const onSubmit = async () => {
if (validate()) {
setBusy(true);
2021-03-29 07:08:26 +00:00
try {
const client = new ProductClient();
2021-03-29 07:40:58 +00:00
await client.put(productID, {
2021-03-29 07:08:26 +00:00
name: form.name,
price: form.price,
})
Swal.fire({
title: "Submitted!",
text: "Product is modified in database",
})
} catch (error) {
} finally {
2021-03-29 07:40:58 +00:00
setBusy(false);
2021-03-29 07:08:26 +00:00
}
}
}
2021-03-29 07:40:58 +00:00
return (
<div className="container mx-auto">
<h1>Edit Product</h1>
<Link href="/product/">
<a>
<FontAwesomeIcon icon={faArrowLeft} /> Return to index
2021-03-29 07:08:26 +00:00
</a>
2021-03-29 07:40:58 +00:00
</Link>
<ProductForm
name={form.name}
price={form.price}
busy={busy}
2021-03-29 09:53:55 +00:00
onFormChange={onFormChanged}
2021-03-29 07:40:58 +00:00
onSubmit={onSubmit} />
<ul>
<Errors errors={errors}></Errors>
</ul>
</div>
);
2021-03-29 07:08:26 +00:00
}
export default function EditProductPage() {
const router = useRouter();
const id = router.query['id'];
return (
<Layout title="Edit product">
<EditProduct productID={id}></EditProduct>
</Layout>
)
}