Skip to content

Alistair Henshaw #123

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 8 additions & 34 deletions src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,44 +1,18 @@
import './styles/reset.css'
import './styles/index.css'

import initialStoreItems from './store-items'
import Header from './components/Header'
import MainContent from './components/MainContent'
import Footer from './components/Footer'
import { useState } from 'react'

export default function App() {
const [basket, setBasket] = useState([])
return (
<>
<header id="store">
<h1>Greengrocers</h1>
<ul className="item-list store--item-list">
</ul>
</header>
<main id="cart">
<h2>Your Cart</h2>
<div className="cart--item-list-container">
<ul className="item-list cart--item-list">
</ul>
</div>
<div className="total-section">
<div>
<h3>Total</h3>
</div>
<div>
<span className="total-number">£0.00</span>
</div>
</div>
</main>
<div>
Icons made by
<a
href="https://www.flaticon.com/authors/icongeek26"
title="Icongeek26"
>
Icongeek26
</a>
from
<a href="https://www.flaticon.com/" title="Flaticon">
www.flaticon.com
</a>
</div>
<Header setBasket={setBasket} basket={basket}></Header>
<MainContent basket={basket} setBasket={setBasket}></MainContent>
<Footer></Footer>
</>
)
}
17 changes: 17 additions & 0 deletions src/components/Footer.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export default function Footer () {
return (
<div>
Icons made by
<a
href="https://www.flaticon.com/authors/icongeek26"
title="Icongeek26"
>
Icongeek26
</a>
from
<a href="https://www.flaticon.com/" title="Flaticon">
www.flaticon.com
</a>
</div>
)
}
59 changes: 59 additions & 0 deletions src/components/Header.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { useState } from 'react'
import initialStoreItems from '../store-items'

export default function Header ({setBasket, basket}) {
const [storeItems, setStoreItems] = useState(initialStoreItems)

const storeItemsCopy = JSON.parse(JSON.stringify(storeItems))

function addToBasket (e) {
const itemIndex = e.target.value

const item = storeItemsCopy[itemIndex]
item.quantity = 1
// console.log(item)

// add a check to see if item name is in the array
let inBasket = false
let basketIndex = ""
basket.forEach((itemInBasket, index) => {
// console.log(itemInBasket)
if (itemInBasket.name === item.name) {
inBasket = true
basketIndex = index
}
})

if (inBasket === false) {
setBasket([...basket, item])
// console.log(basketIndex)
}
else {
// need to find the item in basket and update quantity
// console.log(basketIndex)
basket[basketIndex].quantity += 1
setBasket([...basket])
}

inBasket = false
}


return (
<header id="store">
<h1>Greengrocers</h1>
<ul className="item-list store--item-list">
{storeItems.map((item, index) => {
return (
<li key={index}>
<div className="store--item-icon">
<img src={`../../assets/icons/${item.id}.svg`} alt={item.name} />
</div>
<button onClick={addToBasket} value={index}>Add to cart</button>
</li>
)
})}
</ul>
</header>
)
}
63 changes: 63 additions & 0 deletions src/components/MainContent.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
export default function MainContent ({setBasket, basket}) {
function increaseQuantity (event) {
// console.log(event.target.value)
basket[event.target.value].quantity += 1
setBasket([...basket])
// console.log(basket)
}

function decreaseQuantity (event) {
if (basket[event.target.value].quantity === 1) {
// console.log("delete")
// console.log(event.target.value)
basket.splice(event.target.value, 1)
setBasket([...basket])

}
else {
basket[event.target.value].quantity -= 1
setBasket([...basket])
}

}

function calculateTotal () {
let total = 0
basket.forEach(item => {
total += item.quantity * item.price
});
return (
`£${total.toFixed(2)}`
)
}

return (
<main id="cart">
<h2>Your Cart</h2>
<div className="cart--item-list-container">
<ul className="item-list cart--item-list">
{basket.map((item, index) => {
return (
<li key={index}>
<img className="cart--item-icon" src={`assets/icons/${item.id}.svg`} alt={item.name}/>
<p>{item.name}</p>
<button onClick={decreaseQuantity} className="quantity-btn remove-btn center" value={index}>-</button>
<span className="quantity-text center">{item.quantity}</span>
<button onClick={increaseQuantity} className="quantity-btn add-btn center" value={index}>+</button>
</li>

)
})}
</ul>
</div>
<div className="total-section">
<div>
<h3>Total</h3>
</div>
<div>
<span className="total-number">{calculateTotal()}</span>
</div>
</div>
</main>
)
}
Binary file added state-diagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.