Commit 6dd744aa authored by Ben Anderson's avatar Ben Anderson

Added component to fetch product details, refactored image options

parent 3a3923b2
...@@ -2,21 +2,29 @@ import React from "react"; ...@@ -2,21 +2,29 @@ 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 (
<div> <div>
<Switch> <Switch>
<AuthRoute exact path="/products/new"> <AuthRoute exact path="/products/new">
<ProductForm /> <ProductForm method="POST" />
</AuthRoute>
<AuthRoute path="/products/edit/:productId">
<ProductLoader component={() => <ProductForm method="PUT" />} />
</AuthRoute>
<AuthRoute exact path="/promos/new">
NEW PROMO
</AuthRoute>
<AuthRoute exact path="/products">
PRODUCTS
</AuthRoute> </AuthRoute>
<AuthRoute exact path="/promos/new">NEW PROMO</AuthRoute>
<AuthRoute exact path="/products">PRODUCTS</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>
); );
......
import React, { useState } from "react"; import React, { useState } from "react";
import { useHistory, useLocation } from "react-router"; import { useHistory } from "react-router";
import emptyProduct from "../emptProduct";
const emptyForm = { const emptyForm = {
sku: "", ...emptyProduct,
upc: "", imageFile: "",
prodName: "",
brand: "",
category: "",
price: 0.0,
stock: 0,
prodDesc: "",
productImage: "",
}; };
ProductForm.defaultProps = { ProductForm.defaultProps = {
...@@ -18,8 +12,9 @@ ProductForm.defaultProps = { ...@@ -18,8 +12,9 @@ ProductForm.defaultProps = {
}; };
export default function ProductForm(props) { export default function ProductForm(props) {
const { product } = props; const { product, method } = props;
const [form, setForm] = useState(product); const [form, setForm] = useState(product);
const [imageMode, setImageMode] = useState("url");
const [errors, setErrors] = useState([]); const [errors, setErrors] = useState([]);
const history = useHistory(); const history = useHistory();
...@@ -55,11 +50,16 @@ export default function ProductForm(props) { ...@@ -55,11 +50,16 @@ export default function ProductForm(props) {
const onSubmit = (e) => { const onSubmit = (e) => {
e.preventDefault(); e.preventDefault();
validate(); validate();
if (imageMode === "url") {
delete form.imageFile;
} else {
delete form.prodImgUrl;
}
if (errors.length === 0) { if (errors.length === 0) {
// console.log(form); // console.log(form);
fetch("http://localhost:8080/api/products", { fetch("http://localhost:8080/api/products", {
method: "POST", method,
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
...@@ -104,6 +104,7 @@ export default function ProductForm(props) { ...@@ -104,6 +104,7 @@ export default function ProductForm(props) {
type="text" type="text"
className="form-control" className="form-control"
id="productSku" id="productSku"
disabled={method === "PUT" ? true : false}
value={form.sku} value={form.sku}
onChange={(e) => setForm({ ...form, sku: e.target.value })} onChange={(e) => setForm({ ...form, sku: e.target.value })}
/> />
...@@ -213,19 +214,61 @@ export default function ProductForm(props) { ...@@ -213,19 +214,61 @@ export default function ProductForm(props) {
/> />
</div> </div>
</div> </div>
<div className="row mt-3"> {imageMode === "upload" ? (
<label htmlFor="productImage" className="form-label"> <div className="row mt-3">
Product Image <div>
</label> <label htmlFor="productImage" className="form-label">
<input Image File
id="productImage" </label>
name="productImage" <input
className="form-control form-control-lg" id="productImage"
type="file" name="imageFile"
value={form.productImage} className="form-control form-control-lg"
onChange={(e) => setForm({ ...form, productImage: e.target.value })} type="file"
></input> value={form.imageFile}
</div> onChange={(e) =>
setForm({ ...form, imageFile: e.target.value })
}
></input>
<button
type="button"
class="btn btn-outline-primary mt-3"
onClick={() => {
setForm({ ...form, imageFile: "" });
setImageMode("url");
}}
>
Specify Image URL
</button>
</div>
</div>
) : null}
{imageMode === "url" ? (
<div className="row mt-3">
<div>
<label htmlFor="prodImgUrl" className="form-label">
Image URL
</label>
<input
name="prodImgUrl"
type="text"
className="form-control"
id="prodImgUrl"
value={form.prodImgUrl}
onChange={(e) =>
setForm({ ...form, prodImgUrl: e.target.value })
}
/>
<button
type="button"
class="btn btn-outline-primary mt-3"
onClick={() => setImageMode("upload")}
>
Upload Image
</button>
</div>
</div>
) : null}
<div className="row mt-3"> <div className="row mt-3">
<div className="col-12"> <div className="col-12">
......
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} />;
}
const emptyProduct = {
sku: "",
upc: "",
prodName: "",
brand: "",
category: "",
price: 0.0,
stock: 0,
prodDesc: "",
prodImgUrl: ""
};
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