From af70a1fa54d187dbe645c440730522bb9d242169 Mon Sep 17 00:00:00 2001 From: Ben Anderson <banderson@nisum.com> Date: Mon, 10 May 2021 14:36:18 -0400 Subject: [PATCH] Fixed routing and data fetching --- src/component/Main.jsx | 23 ++++++++----- src/component/Product.jsx | 2 +- src/component/ProductForm.jsx | 62 ++++++++++++++++++++++++++++------- src/component/ProductGrid.jsx | 22 +++++++++++-- 4 files changed, 85 insertions(+), 24 deletions(-) diff --git a/src/component/Main.jsx b/src/component/Main.jsx index 0efe9a9..3192454 100644 --- a/src/component/Main.jsx +++ b/src/component/Main.jsx @@ -1,10 +1,10 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect } from "react"; import { Redirect, Switch } from "react-router"; import AuthRoute from "./AuthRoute"; import ProductForm from "./ProductForm"; import ProductGrid from "./ProductGrid"; -import {getAllProducts} from "../actions/apiRequests.js" -import PromotionNewFormComponent from './promotionforms/PromotionNewFormComponent' +import { getAllProducts } from "../actions/apiRequests.js"; +import PromotionNewFormComponent from "./promotionforms/PromotionNewFormComponent"; export default function Main() { const [productData, setproductData] = useState([]); @@ -16,21 +16,28 @@ export default function Main() { const loadProducts = async (event) => { const data = await getAllProducts(); setproductData(data); - } + }; return ( <div> <Switch> <AuthRoute exact path="/products/new"> - <ProductForm /> + <ProductForm method="POST" /> </AuthRoute> - <AuthRoute exact path="/promos/new" component={PromotionNewFormComponent}>NEW PROMO</AuthRoute> - <AuthRoute exact path="/products">PRODUCTS</AuthRoute> + <AuthRoute exact path="/products/edit/:sku"> + <ProductForm method="PUT" /> + </AuthRoute> + <AuthRoute + exact + path="/promos/new" + component={PromotionNewFormComponent} + ></AuthRoute> + <AuthRoute exact path="/products" component={ProductGrid}></AuthRoute> <AuthRoute path="/promos">PROMOS</AuthRoute> <AuthRoute exact path="/"> <Redirect to="/products" /> </AuthRoute> - <AuthRoute >404 PAGE</AuthRoute> + <AuthRoute>404 PAGE</AuthRoute> </Switch> </div> ); diff --git a/src/component/Product.jsx b/src/component/Product.jsx index 99f9216..509d2e4 100644 --- a/src/component/Product.jsx +++ b/src/component/Product.jsx @@ -56,7 +56,7 @@ export default function Product({ product }) { Delete product </Button> - <Button variant="primary" onClick={handleClose}> + <Button variant="primary" href={`/products/edit/${product.sku}`}> Edit Product </Button> diff --git a/src/component/ProductForm.jsx b/src/component/ProductForm.jsx index 77ee35f..0f3de31 100644 --- a/src/component/ProductForm.jsx +++ b/src/component/ProductForm.jsx @@ -1,5 +1,6 @@ -import React, { useState } from "react"; -import { useHistory, useLocation } from "react-router"; +import React, { useEffect, useState } from "react"; +import { useHistory, useParams } from "react-router"; +import Config from "../config"; const emptyForm = { sku: "", @@ -11,7 +12,7 @@ const emptyForm = { availableStock: 0, productDescription: "", productImageUrl: "", - productImage: "" + productImage: "", }; ProductForm.defaultProps = { @@ -19,10 +20,23 @@ ProductForm.defaultProps = { }; export default function ProductForm(props) { - const { product } = props; - const [form, setForm] = useState(product); + const { method } = props; + const [form, setForm] = useState(emptyForm); const [errors, setErrors] = useState([]); const history = useHistory(); + const { sku } = useParams(); + + useEffect(() => { + fetch(`${Config.inventoryUrl}/${sku}`).then((res) => { + if (res.ok) { + res + .json() + .then((data) => + setForm({ ...data, availableStock: data.stock, productImage: "" }) + ); + } + }); + }, [sku]); const validate = () => { setErrors([]); @@ -59,8 +73,12 @@ export default function ProductForm(props) { if (errors.length === 0) { // console.log(form); - fetch("http://localhost:8080/api/products", { - method: "POST", + const url = + method === "PUT" + ? `${Config.inventoryUrl}/${sku}` + : `${Config.inventoryUrl}`; + fetch(url, { + method, headers: { "Content-Type": "application/json", }, @@ -100,6 +118,7 @@ export default function ProductForm(props) { SKU </label> <input + disabled={method === "PUT" ? true : false} required name="sku" type="text" @@ -137,7 +156,9 @@ export default function ProductForm(props) { className="form-control" id="productName" value={form.productName} - onChange={(e) => setForm({ ...form, productName: e.target.value })} + onChange={(e) => + setForm({ ...form, productName: e.target.value }) + } /> </div> <div> @@ -180,7 +201,9 @@ export default function ProductForm(props) { rows="7" className="form-control" value={form.productDescription} - onChange={(e) => setForm({ ...form, productDescription: e.target.value })} + onChange={(e) => + setForm({ ...form, productDescription: e.target.value }) + } ></textarea> </div> </div> @@ -204,13 +227,16 @@ export default function ProductForm(props) { Stock </label> <input + disabled={method === "PUT" ? true : false} required name="stock" type="number" className="form-control" id="stock" value={form.availableStock} - onChange={(e) => setForm({ ...form, availableStock: e.target.value })} + onChange={(e) => + setForm({ ...form, availableStock: e.target.value }) + } /> </div> </div> @@ -225,7 +251,13 @@ export default function ProductForm(props) { type="url" placeholder="Enter image URL here or upload image below..." value={form.productImageUrl} - onChange={(e) => setForm({ ...form, productImageUrl: e.target.value, productImage:""})} + onChange={(e) => + setForm({ + ...form, + productImageUrl: e.target.value, + productImage: "", + }) + } ></input> <input id="productImage" @@ -233,7 +265,13 @@ export default function ProductForm(props) { className="form-control form-control-lg" type="file" value={form.productImage} - onChange={(e) => setForm({ ...form, productImage: e.target.value, productImageUrl:"" })} + onChange={(e) => + setForm({ + ...form, + productImage: e.target.value, + productImageUrl: "", + }) + } ></input> </div> diff --git a/src/component/ProductGrid.jsx b/src/component/ProductGrid.jsx index 0baeb1a..e4bd423 100644 --- a/src/component/ProductGrid.jsx +++ b/src/component/ProductGrid.jsx @@ -1,14 +1,30 @@ -import React from "react"; +import React, { useEffect, useState } from "react"; import Product from "./Product.jsx"; import { Col, Container, Row } from "react-bootstrap"; import "./../styles/ProductGrid.css"; +import Config from "../config.js"; +import { set } from "react-hook-form"; export default function ProductGrid({ productData }) { + const [products, setProducts] = useState([]); + + const fetchProducts = async () => { + const res = await fetch(`${Config.inventoryUrl}`); + if (res.ok) { + const data = await res.json(); + setProducts([...data]); + } + }; + + useEffect(() => fetchProducts(), []); + return ( <div> - <h1 id="title" className="text-center" >Inventory</h1> + <h1 id="title" className="text-center"> + Inventory + </h1> <Container id="prod-grid" className="mt-3"> <Row xs={1} sm={2} md={3} lg={4}> - {productData.map((product) => { + {products.map((product) => { return ( <Col key={product.sku}> <Product product={product} /> -- 2.18.1