Commit fcd0852e authored by Ben Anderson's avatar Ben Anderson

Added edit functionality to product form

parent d6f57876
...@@ -2,7 +2,6 @@ import React from "react"; ...@@ -2,7 +2,6 @@ import React from "react";
import { Redirect, Switch } from "react-router"; import { Redirect, Switch } from "react-router";
import AuthRoute from "./AuthRoute"; import AuthRoute from "./AuthRoute";
import ProductForm from "./ProductForm"; import ProductForm from "./ProductForm";
import ProductLoader from "./ProductLoader";
export default function Main() { export default function Main() {
return ( return (
...@@ -12,7 +11,7 @@ export default function Main() { ...@@ -12,7 +11,7 @@ export default function Main() {
<ProductForm method="POST" /> <ProductForm method="POST" />
</AuthRoute> </AuthRoute>
<AuthRoute path="/products/edit/:productId"> <AuthRoute path="/products/edit/:productId">
<ProductLoader component={() => <ProductForm method="PUT" />} /> <ProductForm method="PUT" />
</AuthRoute> </AuthRoute>
<AuthRoute exact path="/promos/new"> <AuthRoute exact path="/promos/new">
NEW PROMO NEW PROMO
......
import React, { useState } from "react"; import React, { useEffect, useState } from "react";
import { useHistory } from "react-router"; import { useHistory, useParams } from "react-router";
import emptyProduct from "../emptProduct"; import emptyProduct from "../emptProduct";
const emptyForm = { const emptyForm = {
...@@ -12,16 +12,34 @@ ProductForm.defaultProps = { ...@@ -12,16 +12,34 @@ ProductForm.defaultProps = {
}; };
export default function ProductForm(props) { export default function ProductForm(props) {
const { product, method } = props; const { method } = props;
const [form, setForm] = useState(product); const [form, setForm] = useState({ ...emptyForm });
const [imageMode, setImageMode] = useState("url"); const [imageMode, setImageMode] = useState("url");
const [errors, setErrors] = useState([]); const [errors, setErrors] = useState([]);
const history = useHistory(); const history = useHistory();
const { productId } = useParams("productId");
useEffect(() => {
fetch(`http://localhost:8080/api/products/${productId}/`).then((res) => {
if (res.ok) {
console.log(res);
res.json().then((data) => {
Object.keys(data).forEach((key) => {
if (data[key] === null) {
data[key] = "";
}
});
console.log(data);
setForm({ ...data, availableStock: data.stock });
});
}
});
}, [productId]);
const validate = () => { const validate = () => {
setErrors([]); setErrors([]);
const errs = []; const errs = [];
console.log(form)
if (form.sku.length < 3) { if (form.sku.length < 3) {
errs.push("SKU must be at least 3 characters"); errs.push("SKU must be at least 3 characters");
} }
...@@ -40,7 +58,7 @@ export default function ProductForm(props) { ...@@ -40,7 +58,7 @@ export default function ProductForm(props) {
if (Number(form.price) <= 0) { if (Number(form.price) <= 0) {
errs.push("Price must be greater than 0"); errs.push("Price must be greater than 0");
} }
if (Number(form.stock) <= 0) { if (Number(form.availableStock) <= 0) {
errs.push("Stock must be greater than 0"); errs.push("Stock must be greater than 0");
} }
...@@ -58,7 +76,11 @@ export default function ProductForm(props) { ...@@ -58,7 +76,11 @@ export default function ProductForm(props) {
if (errors.length === 0) { if (errors.length === 0) {
// console.log(form); // console.log(form);
fetch("http://localhost:8080/api/products", { const url =
method === "PUT"
? `http://localhost:8080/api/products/${productId}`
: "http://localhost:8080/api/products";
fetch(url, {
method, method,
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
...@@ -137,7 +159,9 @@ export default function ProductForm(props) { ...@@ -137,7 +159,9 @@ export default function ProductForm(props) {
className="form-control" className="form-control"
id="productName" id="productName"
value={form.productName} value={form.productName}
onChange={(e) => setForm({ ...form, productName: e.target.value })} onChange={(e) =>
setForm({ ...form, productName: e.target.value })
}
/> />
</div> </div>
<div> <div>
...@@ -174,13 +198,15 @@ export default function ProductForm(props) { ...@@ -174,13 +198,15 @@ export default function ProductForm(props) {
Description Description
</label> </label>
<textarea <textarea
name="productDesc" name="productDesciption"
id="productDesc" id="productDesc"
cols="40" cols="40"
rows="7" rows="7"
className="form-control" className="form-control"
value={form.productDesc} value={form.productDescription}
onChange={(e) => setForm({ ...form, productDesc: e.target.value })} onChange={(e) =>
setForm({ ...form, productDescription: e.target.value })
}
></textarea> ></textarea>
</div> </div>
</div> </div>
...@@ -205,12 +231,12 @@ export default function ProductForm(props) { ...@@ -205,12 +231,12 @@ export default function ProductForm(props) {
</label> </label>
<input <input
required required
name="stock" name="availableStock"
type="number" type="number"
className="form-control" className="form-control"
id="stock" id="stock"
value={form.stock} value={form.availableStock}
onChange={(e) => setForm({ ...form, stock: e.target.value })} onChange={(e) => setForm({ ...form, availableStock: e.target.value })}
/> />
</div> </div>
</div> </div>
...@@ -232,7 +258,7 @@ export default function ProductForm(props) { ...@@ -232,7 +258,7 @@ export default function ProductForm(props) {
></input> ></input>
<button <button
type="button" type="button"
class="btn btn-outline-primary mt-3" className="btn btn-outline-primary mt-3"
onClick={() => { onClick={() => {
setForm({ ...form, imageFile: "" }); setForm({ ...form, imageFile: "" });
setImageMode("url"); setImageMode("url");
...@@ -250,18 +276,18 @@ export default function ProductForm(props) { ...@@ -250,18 +276,18 @@ export default function ProductForm(props) {
Image URL Image URL
</label> </label>
<input <input
name="prodImgUrl" name="productImageUrl"
type="text" type="text"
className="form-control" className="form-control"
id="prodImgUrl" id="prodImgUrl"
value={form.prodImgUrl} value={form.productImageUrl}
onChange={(e) => onChange={(e) =>
setForm({ ...form, prodImgUrl: e.target.value }) setForm({ ...form, productImageUrl: e.target.value })
} }
/> />
<button <button
type="button" type="button"
class="btn btn-outline-primary mt-3" className="btn btn-outline-primary mt-3"
onClick={() => setImageMode("upload")} onClick={() => setImageMode("upload")}
> >
Upload Image Upload Image
......
import React, { useEffect, useState } from "react";
import { useParams } from "react-router";
import emptyProduct from "../emptProduct";
export default function ProductLoader(props) {
const { component: Component } = props;
const { productId } = useParams("productId");
const [product, setProduct] = useState(emptyProduct)
useEffect(() => {
fetch(`http://localhost:8080/api/products/${productId}`)
.then(res => {
if (res.ok) {
res.json.then(data => setProduct({...data}))
}
})
}, [productId]);
return <Component product={product} />;
}
...@@ -5,9 +5,9 @@ const emptyProduct = { ...@@ -5,9 +5,9 @@ const emptyProduct = {
brand: "", brand: "",
category: "", category: "",
price: 0.0, price: 0.0,
stock: 0, availableStock: 0,
productDesc: "", productDesciption: "",
prodImgUrl: "" productImageUrl: "",
}; };
export default emptyProduct; export default emptyProduct;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment