Skip to content

Commit

Permalink
Implement name changes, redux in foodOverlay and organized some code
Browse files Browse the repository at this point in the history
  • Loading branch information
SetropLeo committed Apr 18, 2022
1 parent 5324b10 commit 329f526
Show file tree
Hide file tree
Showing 22 changed files with 243 additions and 120 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@

TO_DO
-> COMPONENTIZAR
-> menuOptions-subcontainer span
-> sideBarOptions-subcontainer span
-> Modal ProductCart
1 change: 1 addition & 0 deletions src/components/CartElement/CartElement.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
width: 55px;
height: 55px;
border-radius: 5px;
object-fit: cover;
}

.elementContent-subcontainer {
Expand Down
29 changes: 15 additions & 14 deletions src/components/CartElement/CartElement.tsx
Original file line number Diff line number Diff line change
@@ -1,45 +1,46 @@
import React from 'react';
import { Images } from '../../Images';
import pork from '../../images/product-2.jpg'
import './CartElement.css';

const CartElement = () => {
const [amount, setAmount] = React.useState<number>(1);
const CartElement = ({ food }: any) => {

if (amount >= 0)
function setAmount(amount: any) {
}

if (food.amount >= 0)
return (
<div className="CartElement-main-container">
{amount === 0 &&
{food.amount === 0 &&
(
<div className='removeElement-subcontainer'>
<div className='removeElement-left-container'>
<img className="removeElementImage" src={Images.trash} alt="trash" />
<p className='removeElement'>Remove this item?</p>
</div>
<div className="removeElement-right-container">
<p className="no-removeProduct" onClick={() => setAmount(amount + 1)}>No</p>
<p className="yes-removeProduct" onClick={() => setAmount(amount - 1)}>Yes</p>
<p className="no-removeProduct" onClick={() => setAmount(food.amount + 1)}>No</p>
<p className="yes-removeProduct" onClick={() => setAmount(food.amount - 1)}>Yes</p>
</div>
</div>
)}
<div className="elementImage-subcontainer">
<img className="elementImage" src={pork} alt="Grill Pork Chop" />
<img className="elementImage" src={food.image} alt="Grill Pork Chop" />
</div>
<div className="elementContent-subcontainer">
<div className="elementInfos-subcontainer">
<p className="elementName">Grill Pork Chop</p>
<p className="elementPrice">$12.99</p>
<p className="elementName">{food.name}</p>
<p className="elementPrice">${(food.price * food.amount).toFixed(2)}</p>
</div>
<div className="additionalInformation-subcontainer">
<p className="elementSubPrice">$12.99</p>
<p className="elementSubPrice">${food.price}</p>
<p className="elementSize">- size: large</p>
</div>
<div className="productAmount-subcontainer">
<p className="minus-sign" onClick={() => setAmount(amount - 1)}>
<p className="minus-sign" onClick={() => setAmount(food.amount - 1)}>
-
</p>
<p className="productAmount">{amount}</p>
<p className="plus-sign" onClick={() => setAmount(amount + 1)}>
<p className="productAmount">{food.amount}</p>
<p className="plus-sign" onClick={() => setAmount(food.amount + 1)}>
+
</p>
</div>
Expand Down
33 changes: 23 additions & 10 deletions src/components/FoodModal/FoodModal.tsx
Original file line number Diff line number Diff line change
@@ -1,40 +1,53 @@
import React from 'react'
import { connect } from 'react-redux';
import { FoodModel } from '../../models';
import './FoodModal.css'


const FoodModal = ({food, setFood}: any) => {
const FoodModal = ({ modalFood, closeModal, addFoodToCart }: any) => {
const [amount, setAmount] = React.useState<number>(1);

function closeModal() {
setFood(null);

function addToCart() {
addFoodToCart(modalFood, amount);
closeModal();
}

return (
<div className='foodModal-container' onClick={() => closeModal()}>
<div className='foodModal-content' onClick={(event) => event.stopPropagation()}>
<div className='foodModal-left'>
<img src={food?.image} alt="" />
<img src={modalFood?.image} alt="" />
</div>
<div className='foodModal-right'>
<div className='foodModal-right-content'>
<h1 className='foodModal-name'>{food?.name}</h1>
<h2 className='foodModal-description'>{food?.description}</h2>
<p className='foodModal-price'>${food?.price}</p>
<h1 className='foodModal-name'>{modalFood?.name}</h1>
<h2 className='foodModal-description'>{modalFood?.description}</h2>
<p className='foodModal-price'>${modalFood?.price * amount}</p>
<div className="productAmount-subcontainer">
<p className="minus-sign" onClick={() => { if (amount > 1) setAmount(amount - 1) }}>-</p>
<p className="productAmount">{amount}</p>
<p className="plus-sign" onClick={() => setAmount(amount + 1)}>+</p>
</div>
<div className='addItems-container'>
<button className='cancel-button' onClick={() => closeModal()}>Cancel</button>
<button className='addToCart-button'>Add to cart +</button>
<button className='addToCart-button' onClick={() => addToCart()}>Add to cart +</button>
</div>
<h3 onClick={() => closeModal()}>CLOSE BUTTON</h3>
</div>
</div>
</div>
</div>
)
}
};

const mapStateToProps = (state: any) => ({ modalFood: state.modalFoodOption.modalFood });

const mapDispatchToProps = (dispatch: any) => (
{
closeModal: () => dispatch({ type: 'CLEAR_MODAL_FOOD' }),
addFoodToCart: (food: FoodModel, amount: Number) => dispatch({ type: 'ADD_FOOD_TO_CART', food, amount }),
}
);

export default FoodModal;
export default connect(mapStateToProps, mapDispatchToProps)(FoodModal);
7 changes: 4 additions & 3 deletions src/components/OrderMenu/OrderMenu.css
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
margin-left: 2px;
}

.menuOptions-subcontainer {
.sideBarOptions-subcontainer {
display: flex;
justify-content: space-evenly;
font-size: 12px;
Expand All @@ -48,7 +48,7 @@
cursor: pointer;
}

.menuOptions-subcontainer span {
.sideBarOptions-subcontainer span {
width: 100%;
height: 40px;
align-items: center;
Expand All @@ -57,12 +57,13 @@
opacity: .7;
}

.menuOptions-subcontainer span.active {
.sideBarOptions-subcontainer span.active {
background-color: #FFFFFF;
opacity: 1;
}

.order-subcontainer {
overflow-y: scroll;
overflow-x: hidden;
height: 100vh;
}
36 changes: 20 additions & 16 deletions src/components/OrderMenu/OrderMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ import React from 'react';
import './OrderMenu.css';
import { Images } from '../../Images';
import CartElement from '../CartElement/CartElement';
import { connect } from 'react-redux';
import { FoodModel } from '../../models';

const OrderMenu = () => {
const [menuOption, setMenuOption] = React.useState<string>('New Order');
const OrderMenu = ({ foodCartList }: any) => {
const [orderMenuOption, setorderMenuOption] = React.useState<string>('New Order');
console.log(foodCartList)

return (
<div className='orderMenu-main-container'>
Expand All @@ -17,22 +20,23 @@ const OrderMenu = () => {
Order: <b>#0056</b>
</span>
</div>
<div className='menuOptions-subcontainer'>
<span className={`${menuOption === 'New Order' ? 'active' : ''}`} onClick={() => setMenuOption('New Order')}>New Order (5)</span>
<span className={`${menuOption === 'Order History' ? 'active' : ''}`} onClick={() => setMenuOption('Order History')}>Order History (0)</span>
<div className='sideBarOptions-subcontainer'>
<span className={`${orderMenuOption === 'New Order' ? 'active' : ''}`} onClick={() => setorderMenuOption('New Order')}>New Order ({foodCartList ? foodCartList.length : 0})</span>
<span className={`${orderMenuOption === 'Order History' ? 'active' : ''}`} onClick={() => setorderMenuOption('Order History')}>Order History (0)</span>
</div>
{menuOption === 'New Order' && (
<div className='order-subcontainer'>
<CartElement />
<CartElement />
<CartElement />
<CartElement />
<CartElement />
</div>
)}
{menuOption === 'Order History'}
<div className='order-subcontainer'>
{orderMenuOption === 'New Order' && foodCartList?.map((food: FoodModel, index: Number) => {
return (
<CartElement key={index} food={food} />
)
}
)}
</div>
{orderMenuOption === 'Order History'}
</div>
);
};

export default OrderMenu;
const mapStateToProps = (state: any) => ({ foodCartList: state.orderMenuOption.foodCartList });

export default connect(mapStateToProps)(OrderMenu);
22 changes: 0 additions & 22 deletions src/components/ProductCard/ProductCard.css
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,6 @@
font-family: 'Open Sans';
}

.foodCards-container {
background-color: #E9ECEF;
width: 90%;
height: 100vh;
float: right;
overflow-y: scroll;
}

.foodCards-container::-webkit-scrollbar {
width: 5px;
}

.foodCards-container::-webkit-scrollbar-thumb {
border: 4px solid #c5cbd1;
}

.foodCards-grid {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}

.food-card {
width: 330px;
max-height: 270px;
Expand Down
46 changes: 14 additions & 32 deletions src/components/ProductCard/ProductCard.tsx
Original file line number Diff line number Diff line change
@@ -1,44 +1,26 @@
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';

import { Foods } from '../../models';
import FoodModal from '../FoodModal/FoodModal';

import * as modalActions from '../../store/actions/modalFoodActions';
import './ProductCard.css'

const ProductCard: React.FC = ({ activeFood }: any) => {
const [foods, setFoods] = React.useState<Foods[]>([]);
const [modalFood, setModalFood] = React.useState<any>(undefined);

React.useEffect(() => {
fetch('http://localhost:3001/products')
.then(response => response.json())
.then(responseJSON => setFoods(responseJSON))
}, [])
const ProductCard = ({ setModalFood, food }: any,) => {

return (
<div className='foodCards-container'>
<div className='foodCards-grid'>
{modalFood && <FoodModal food={modalFood} setFood={setModalFood} />}
{foods.length > 0 && foods.map((food: Foods) => {
if (food.category.includes(activeFood))
return (
<div key={food.name} className="food-card" onClick={() => setModalFood(food)}>
<img src={food.image} alt={food.name} className="productImage" />
<div className='foodInfos-subcontainer'>
<p className="foodName">{food.name}®</p>
<p className="foodDescription">{food.description}</p>
<p className="foodPrice">${food.price}</p>
</div>
</div>
);
else return null;
})}
<div key={food.name} className="food-card" onClick={() => { setModalFood(food) }}>
<img src={food.image} alt={food.name} className="productImage" />
<div className='foodInfos-subcontainer'>
<p className="foodName">{food.name}®</p>
<p className="foodDescription">{food.description}</p>
<p className="foodPrice">${food.price}</p>
</div>
</div>
);
)
};

const mapStateToProps = (state: any) => ({ activeFood: state.menuOption.activeFood });

export default connect(mapStateToProps)(ProductCard);
const mapStateToProps = (state: any) => ({ });
const mapDispatchToProps = (dispatch: any) => bindActionCreators(modalActions, dispatch)

export default connect(mapStateToProps, mapDispatchToProps)(ProductCard);
30 changes: 30 additions & 0 deletions src/components/ProductList/ProductList.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@import url('https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700');

* {
list-style-type: none;
margin: 0;
padding: 0;
font-family: 'Open Sans';
}

.foodCards-container {
background-color: #E9ECEF;
width: 90%;
height: 100vh;
float: right;
overflow-y: scroll;
}

.foodCards-container::-webkit-scrollbar {
width: 5px;
}

.foodCards-container::-webkit-scrollbar-thumb {
border: 4px solid #c5cbd1;
}

.foodCards-grid {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
40 changes: 40 additions & 0 deletions src/components/ProductList/ProductList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';

import * as modalActions from '../../store/actions/modalFoodActions';
import FoodModal from '../FoodModal/FoodModal';
import ProductCard from '../ProductCard/ProductCard';
import { FoodModel } from '../../models';
import './ProductList.css'

const ProductList: React.FC = ({ activeType, modalFood }: any) => {
const [foods, setFoods] = React.useState<FoodModel[]>([]);

React.useEffect(() => {
fetch('http://localhost:3001/products')
.then(response => response.json())
.then(responseJSON => setFoods(responseJSON))
}, [])

return (
<div className='foodCards-container'>
<div className='foodCards-grid'>
{modalFood !== '' && <FoodModal />}
{foods.length > 0 && foods.map((food: FoodModel) => {
if (food.category.includes(activeType))
return (
<ProductCard food={food} />
);
else return null;
})}
</div>
</div>
);
};


const mapStateToProps = (state: any) => ({ activeType: state.sideBarOption.foodType, modalFood: state.modalFoodOption.modalFood });
const mapDispatchToProps = (dispatch: any) => bindActionCreators(modalActions, dispatch)

export default connect(mapStateToProps, mapDispatchToProps)(ProductList);
Loading

0 comments on commit 329f526

Please sign in to comment.