From 6dbcbf192c03e3dbefbdff56194e66ecf81b8b2b Mon Sep 17 00:00:00 2001 From: James Canterbury Date: Wed, 26 Jun 2024 17:30:19 +0100 Subject: [PATCH] core and first extension complete --- src/App.jsx | 110 ++++++++++++++++++++++++++++++++++++++++++--- src/BasketItem.jsx | 27 +++++++++++ src/StoreItem.jsx | 12 +++++ src/plan.txt | 27 +++++++++++ 4 files changed, 171 insertions(+), 5 deletions(-) create mode 100644 src/BasketItem.jsx create mode 100644 src/StoreItem.jsx create mode 100644 src/plan.txt diff --git a/src/App.jsx b/src/App.jsx index 03e658b..2990399 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,20 +1,120 @@ -import './styles/reset.css' -import './styles/index.css' +import "./styles/reset.css"; +import "./styles/index.css"; -import initialStoreItems from './store-items' +import { useState } from "react"; +import initialStoreItems from "./store-items"; +import StoreItem from "./StoreItem"; +import BasketItem from "./BasketItem"; export default function App() { + const [storeItems, setStoreItems] = useState(initialStoreItems); + const [basketItems, setBasketItems] = useState([]); + const [sort, setSort] = useState(false); + + const basketTotal = basketItems + .reduce((total, item) => total + item.price * item.quantity, 0) + .toFixed(2); + + const addItem = (newItem) => { + const inArray = basketItems.some((item) => item.id === newItem.id); + + if (inArray) { + const newArray = basketItems.map((item) => + item.id === newItem.id ? { ...item, quantity: item.quantity + 1 } : item + ); + setBasketItems(newArray); + } else { + const itemToAdd = { ...newItem, quantity: 1 }; + setBasketItems([...basketItems, itemToAdd]); + } + }; + + const handleAdd = (currentItem) => { + const newArray = basketItems.map((item) => + item.id === currentItem.id + ? { ...item, quantity: item.quantity + 1 } + : item + ); + setBasketItems(newArray); + }; + + const handleMinus = (currentItem) => { + const newArray = basketItems.map((item) => + item.id === currentItem.id + ? { ...item, quantity: item.quantity - 1 } + : item + ); + const filtered = newArray.filter((item) => item.quantity > 0); + setBasketItems(filtered); + }; + + const filterVeg = () => { + if (storeItems.some((item) => item.type === "fruit")) { + const newArray = [...storeItems].filter( + (item) => item.type === "vegetable" + ); + setStoreItems(newArray); + } else { + setStoreItems(initialStoreItems); + } + }; + + const filterFruit = () => { + if (storeItems.some((item) => item.type === "vegetable")) { + const newArray = [...storeItems].filter((item) => item.type === "fruit"); + setStoreItems(newArray); + } else { + setStoreItems(initialStoreItems); + } + }; + + const sortAlphabetical = () => { + if (sort === false) { + const newArray = [...storeItems]; + newArray.sort((a, b) => { + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + setStoreItems(newArray); + setSort(true); + } else { + setStoreItems(initialStoreItems); + setSort(false); + } + }; + return ( <>

Greengrocers

+ +

+ +

+

Your Cart

    + {basketItems.map((item) => ( + + ))}
@@ -22,7 +122,7 @@ export default function App() {

Total

- £0.00 + £{basketTotal}
@@ -40,5 +140,5 @@ export default function App() { - ) + ); } diff --git a/src/BasketItem.jsx b/src/BasketItem.jsx new file mode 100644 index 0000000..2462907 --- /dev/null +++ b/src/BasketItem.jsx @@ -0,0 +1,27 @@ +const BasketItem = ({ item, handleAdd, handleMinus }) => { + return ( +
  • + {item.name} +

    {item.name}

    + + {item.quantity} + +
  • + ); +}; + +export default BasketItem; diff --git a/src/StoreItem.jsx b/src/StoreItem.jsx new file mode 100644 index 0000000..8525a3e --- /dev/null +++ b/src/StoreItem.jsx @@ -0,0 +1,12 @@ +const StoreItem = ({ item, addItem }) => { + return ( +
  • +
    + {item.name} +
    + +
  • + ); +}; + +export default StoreItem; diff --git a/src/plan.txt b/src/plan.txt new file mode 100644 index 0000000..23d6351 --- /dev/null +++ b/src/plan.txt @@ -0,0 +1,27 @@ +Greengrocers + + +state: +store initial data (storeItems) + +basket in state; initially empty but to be added: +{ +data: {object from storeItems}, +quantity: X, +} + +total, made up of sum of price of basket item(s) + + +Display section: +array.map over initial data and render each item -> + pass relevant info as props (image, price, name) use ID as key + +create separate function for adding item to basket, +pass to item element also as prop + + +basket section: +array.map over items in basket from useState, render each in basket +define functions for decrement/increment item +display total from state \ No newline at end of file