Commit af70a1fa authored by Ben Anderson's avatar Ben Anderson

Fixed routing and data fetching

parent a6fee5bc
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } 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 ProductGrid from "./ProductGrid"; import ProductGrid from "./ProductGrid";
import {getAllProducts} from "../actions/apiRequests.js" import { getAllProducts } from "../actions/apiRequests.js";
import PromotionNewFormComponent from './promotionforms/PromotionNewFormComponent' import PromotionNewFormComponent from "./promotionforms/PromotionNewFormComponent";
export default function Main() { export default function Main() {
const [productData, setproductData] = useState([]); const [productData, setproductData] = useState([]);
...@@ -16,21 +16,28 @@ export default function Main() { ...@@ -16,21 +16,28 @@ export default function Main() {
const loadProducts = async (event) => { const loadProducts = async (event) => {
const data = await getAllProducts(); const data = await getAllProducts();
setproductData(data); setproductData(data);
} };
return ( return (
<div> <div>
<Switch> <Switch>
<AuthRoute exact path="/products/new"> <AuthRoute exact path="/products/new">
<ProductForm /> <ProductForm method="POST" />
</AuthRoute> </AuthRoute>
<AuthRoute exact path="/promos/new" component={PromotionNewFormComponent}>NEW PROMO</AuthRoute> <AuthRoute exact path="/products/edit/:sku">
<AuthRoute exact path="/products">PRODUCTS</AuthRoute> <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 path="/promos">PROMOS</AuthRoute>
<AuthRoute exact path="/"> <AuthRoute exact path="/">
<Redirect to="/products" /> <Redirect to="/products" />
</AuthRoute> </AuthRoute>
<AuthRoute >404 PAGE</AuthRoute> <AuthRoute>404 PAGE</AuthRoute>
</Switch> </Switch>
</div> </div>
); );
......
...@@ -56,7 +56,7 @@ export default function Product({ product }) { ...@@ -56,7 +56,7 @@ export default function Product({ product }) {
Delete product Delete product
</Button> </Button>
<Button variant="primary" onClick={handleClose}> <Button variant="primary" href={`/products/edit/${product.sku}`}>
Edit Product Edit Product
</Button> </Button>
......
import React, { useState } from "react"; import React, { useEffect, useState } from "react";
import { useHistory, useLocation } from "react-router"; import { useHistory, useParams } from "react-router";
import Config from "../config";
const emptyForm = { const emptyForm = {
sku: "", sku: "",
...@@ -11,7 +12,7 @@ const emptyForm = { ...@@ -11,7 +12,7 @@ const emptyForm = {
availableStock: 0, availableStock: 0,
productDescription: "", productDescription: "",
productImageUrl: "", productImageUrl: "",
productImage: "" productImage: "",
}; };
ProductForm.defaultProps = { ProductForm.defaultProps = {
...@@ -19,10 +20,23 @@ ProductForm.defaultProps = { ...@@ -19,10 +20,23 @@ ProductForm.defaultProps = {
}; };
export default function ProductForm(props) { export default function ProductForm(props) {
const { product } = props; const { method } = props;
const [form, setForm] = useState(product); const [form, setForm] = useState(emptyForm);
const [errors, setErrors] = useState([]); const [errors, setErrors] = useState([]);
const history = useHistory(); 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 = () => { const validate = () => {
setErrors([]); setErrors([]);
...@@ -59,8 +73,12 @@ export default function ProductForm(props) { ...@@ -59,8 +73,12 @@ 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: "POST", method === "PUT"
? `${Config.inventoryUrl}/${sku}`
: `${Config.inventoryUrl}`;
fetch(url, {
method,
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
...@@ -100,6 +118,7 @@ export default function ProductForm(props) { ...@@ -100,6 +118,7 @@ export default function ProductForm(props) {
SKU SKU
</label> </label>
<input <input
disabled={method === "PUT" ? true : false}
required required
name="sku" name="sku"
type="text" type="text"
...@@ -137,7 +156,9 @@ export default function ProductForm(props) { ...@@ -137,7 +156,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>
...@@ -180,7 +201,9 @@ export default function ProductForm(props) { ...@@ -180,7 +201,9 @@ export default function ProductForm(props) {
rows="7" rows="7"
className="form-control" className="form-control"
value={form.productDescription} value={form.productDescription}
onChange={(e) => setForm({ ...form, productDescription: e.target.value })} onChange={(e) =>
setForm({ ...form, productDescription: e.target.value })
}
></textarea> ></textarea>
</div> </div>
</div> </div>
...@@ -204,13 +227,16 @@ export default function ProductForm(props) { ...@@ -204,13 +227,16 @@ export default function ProductForm(props) {
Stock Stock
</label> </label>
<input <input
disabled={method === "PUT" ? true : false}
required required
name="stock" name="stock"
type="number" type="number"
className="form-control" className="form-control"
id="stock" id="stock"
value={form.availableStock} value={form.availableStock}
onChange={(e) => setForm({ ...form, availableStock: e.target.value })} onChange={(e) =>
setForm({ ...form, availableStock: e.target.value })
}
/> />
</div> </div>
</div> </div>
...@@ -225,7 +251,13 @@ export default function ProductForm(props) { ...@@ -225,7 +251,13 @@ export default function ProductForm(props) {
type="url" type="url"
placeholder="Enter image URL here or upload image below..." placeholder="Enter image URL here or upload image below..."
value={form.productImageUrl} value={form.productImageUrl}
onChange={(e) => setForm({ ...form, productImageUrl: e.target.value, productImage:""})} onChange={(e) =>
setForm({
...form,
productImageUrl: e.target.value,
productImage: "",
})
}
></input> ></input>
<input <input
id="productImage" id="productImage"
...@@ -233,7 +265,13 @@ export default function ProductForm(props) { ...@@ -233,7 +265,13 @@ export default function ProductForm(props) {
className="form-control form-control-lg" className="form-control form-control-lg"
type="file" type="file"
value={form.productImage} value={form.productImage}
onChange={(e) => setForm({ ...form, productImage: e.target.value, productImageUrl:"" })} onChange={(e) =>
setForm({
...form,
productImage: e.target.value,
productImageUrl: "",
})
}
></input> ></input>
</div> </div>
......
import React from "react"; import React, { useEffect, useState } from "react";
import Product from "./Product.jsx"; import Product from "./Product.jsx";
import { Col, Container, Row } from "react-bootstrap"; import { Col, Container, Row } from "react-bootstrap";
import "./../styles/ProductGrid.css"; import "./../styles/ProductGrid.css";
import Config from "../config.js";
import { set } from "react-hook-form";
export default function ProductGrid({ productData }) { 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 ( return (
<div> <div>
<h1 id="title" className="text-center" >Inventory</h1> <h1 id="title" className="text-center">
Inventory
</h1>
<Container id="prod-grid" className="mt-3"> <Container id="prod-grid" className="mt-3">
<Row xs={1} sm={2} md={3} lg={4}> <Row xs={1} sm={2} md={3} lg={4}>
{productData.map((product) => { {products.map((product) => {
return ( return (
<Col key={product.sku}> <Col key={product.sku}>
<Product product={product} /> <Product product={product} />
......
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