Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
lesterlw committed Sep 28, 2024
1 parent 7547503 commit dcae366
Show file tree
Hide file tree
Showing 6 changed files with 177 additions and 15 deletions.
131 changes: 124 additions & 7 deletions src/ConferenceEvent.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@ import "./ConferenceEvent.css";
import TotalCost from "./TotalCost";
import { useSelector, useDispatch } from "react-redux";
import { incrementQuantity, decrementQuantity } from "./venueSlice";
import { decrementAvQuantity, incrementAvQuantity } from "./avSlice";
import { toggleMealSelection } from "./mealsSlice";

const ConferenceEvent = () => {
const [showItems, setShowItems] = useState(false);
const [numberOfPeople, setNumberOfPeople] = useState(1);
const venueItems = useSelector((state) => state.venue);
const avItems = useSelector((state) => state.av);
const mealsItems = useSelector((state) => state.meals);
const dispatch = useDispatch();
const remainingAuditoriumQuantity = 3 - venueItems.find(item => item.name === "Auditorium Hall (Capacity:200)").quantity;

Expand All @@ -29,34 +34,112 @@ const ConferenceEvent = () => {
}
};
const handleIncrementAvQuantity = (index) => {
dispatch(incrementAvQuantity(index));
};

const handleDecrementAvQuantity = (index) => {
dispatch(decrementAvQuantity(index));
};

const handleMealSelection = (index) => {

const item = mealsItems[index];
if (item.selected && item.type === "mealForPeople") {
// Ensure numberOfPeople is set before toggling selection
const newNumberOfPeople = item.selected ? numberOfPeople : 0;
dispatch(toggleMealSelection(index, newNumberOfPeople));
}
else {
dispatch(toggleMealSelection(index));
}
};

const getItemsFromTotalCost = () => {
const items = [];
venueItems.forEach((item) => {
if (item.quantity > 0) {
items.push({ ...item, type: "venue" });
}
});
avItems.forEach((item) => {
if (
item.quantity > 0 &&
!items.some((i) => i.name === item.name && i.type === "av")
) {
items.push({ ...item, type: "av" });
}
});
mealsItems.forEach((item) => {
if (item.selected) {
const itemForDisplay = { ...item, type: "meals" };
if (item.numberOfPeople) {
itemForDisplay.numberOfPeople = numberOfPeople;
}
items.push(itemForDisplay);
}
});
return items;
};

const items = getItemsFromTotalCost();

const ItemsDisplay = ({ items }) => {

console.log(items);
return <>
<div className="display_box1">
{items.length === 0 && <p>No items selected</p>}
<table className="table_item_data">
<thead>
<tr>
<th>Name</th>
<th>Unit Cost</th>
<th>Quantity</th>
<th>Subtotal</th>
</tr>
</thead>
<tbody>
{items.map((item, index) => (
<tr key={index}>
<td>{item.name}</td>
<td>${item.cost}</td>
<td>
{item.type === "meals" || item.numberOfPeople
? ` For ${numberOfPeople} people`
: item.quantity}
</td>
<td>{item.type === "meals" || item.numberOfPeople
? `${item.cost * numberOfPeople}`
: `${item.cost * item.quantity}`}
</td>
</tr>
))}
</tbody>
</table>
</div>
</>
};

const calculateTotalCost = (section) => {
let totalCost = 0;
if (section === "venue") {
venueItems.forEach((item) => {
totalCost += item.cost * item.quantity;
});
} else if (section === "av") {
avItems.forEach((item) => {
totalCost += item.cost * item.quantity;
});
} else if (section === "meals") {
mealsItems.forEach((item) => {
if (item.selected) {
totalCost += item.cost * numberOfPeople;
}
});
}
return totalCost;
};
const venueTotalCost = calculateTotalCost("venue");
const avTotalCost = calculateTotalCost("av");
const mealsTotalCost = calculateTotalCost("meals");

const navigateToProducts = (idType) => {
if (idType == '#venue' || idType == '#addons' || idType == '#meals') {
Expand All @@ -66,6 +149,12 @@ const ConferenceEvent = () => {
}
}

const totalCosts = {
venue: venueTotalCost,
av: avTotalCost,
meals: mealsTotalCost
};

return (
<>
<navbar className="navbar_event_conference">
Expand Down Expand Up @@ -157,9 +246,22 @@ const ConferenceEvent = () => {

</div>
<div className="addons_selection">

{avItems.map((item, index) => (
<div className="av_data venue_main" key={index}>
<div className="img">
<img src={item.img} alt={item.name} />
</div>
<div className="text"> {item.name} </div>
<div> ${item.cost} </div>
<div className="addons_btn">
<button className="btn-warning" onClick={() => handleDecrementAvQuantity(index)}> &ndash; </button>
<span className="quantity-value">{item.quantity}</span>
<button className=" btn-success" onClick={() => handleIncrementAvQuantity(index)}> &#43; </button>
</div>
</div>
))}
</div>
<div className="total_cost">Total Cost:</div>
<div className="total_cost">Total Cost: {avTotalCost}</div>

</div>

Expand All @@ -173,12 +275,27 @@ const ConferenceEvent = () => {
</div>

<div className="input-container venue_selection">

<label htmlFor="numberOfPeople"><h3>Number of People:</h3></label>
<input type="number" className="input_box5" id="numberOfPeople" value={numberOfPeople}
onChange={(e) => setNumberOfPeople(parseInt(e.target.value))}
min="1"
/>
</div>
<div className="meal_selection">

{mealsItems.map((item, index) => (
<div className="meal_item" key={index} style={{ padding: 15 }}>
<div className="inner">
<input type="checkbox" id={ `meal_${index}` }
checked={ item.selected }
onChange={() => handleMealSelection(index)}
/>
<label htmlFor={`meal_${index}`}> {item.name} </label>
</div>
<div className="meal_cost">${item.cost}</div>
</div>
))}
</div>
<div className="total_cost">Total Cost: </div>
<div className="total_cost">Total Cost: {mealsTotalCost}</div>


</div>
Expand Down
7 changes: 4 additions & 3 deletions src/TotalCost.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import React, { useState, useEffect } from 'react';
import "./TotalCost.css";

const TotalCost = ({ totalCosts, ItemsDisplay }) => {


const total_amount = totalCosts.venue + totalCosts.av + totalCosts.meals;

return (
<div className="pricing-app">
Expand All @@ -12,11 +13,11 @@ const TotalCost = ({ totalCosts, ItemsDisplay }) => {
</div>
<div>
<h2 id="pre_fee_cost_display" className="price">

${total_amount}
</h2>

<div>

<ItemsDisplay />
</div>
</div>
</div>
Expand Down
43 changes: 40 additions & 3 deletions src/avSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,53 @@ import { createSlice } from "@reduxjs/toolkit";
export const avSlice = createSlice({
name: "av",
initialState: [

{
img: "https://pixabay.com/images/download/business-20031_640.jpg",
name: "Projectors",
cost: 200,
quantity: 0,
},
{
img: "https://pixabay.com/images/download/speakers-4109274_640.jpg",
name: "Speaker",
cost: 35,
quantity: 0,
},
{
img: "https://pixabay.com/images/download/public-speaking-3926344_640.jpg",
name: "Microphones",
cost: 45,
quantity: 0,
},
{
img: "https://pixabay.com/images/download/whiteboard-2903269_640.png",
name: "Whiteboards",
cost: 80,
quantity: 0,
},

{
img: "https://pixabay.com/images/download/signpost-235079_640.jpg",
name: "Signage",
cost: 80,
quantity: 0,
}

],


reducers: {
incrementAvQuantity: (state, action) => {

const item = state[action.payload];
if (item) {
item.quantity++;
}
},
decrementAvQuantity: (state, action) => {

const item = state[action.payload];
if (item && item.quantity > 0) {
item.quantity--;
}
},
},
});
Expand Down
6 changes: 5 additions & 1 deletion src/mealsSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@ import { createSlice } from '@reduxjs/toolkit';
export const mealsSlice = createSlice({
name: 'meals',
initialState: [

{ name: 'Breakfast', cost: 50, selected: false },
{ name: 'High Tea', cost: 25, selected: false },
{ name: 'Lunch', cost: 65, selected: false },
{ name: 'Dinner', cost: 70, selected: false }
],
reducers: {
toggleMealSelection: (state, action) => {
state[action.payload].selected = !state[action.payload].selected;
},
},
});
Expand Down
3 changes: 3 additions & 0 deletions src/store.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// store.js
import { configureStore } from '@reduxjs/toolkit';
import venueReducer from './venueSlice';
import mealsReducer from './mealsSlice';

export default configureStore({
reducer: {
venue: venueReducer,
av: avReducer,
meals: mealsReducer
},
});
2 changes: 1 addition & 1 deletion src/venueSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export const venueSlice = createSlice({
name: "Small Meeting Room (Capacity:5)",
cost: 1100,
quantity: 0,
},
}

],
reducers: {
Expand Down

0 comments on commit dcae366

Please sign in to comment.