diff --git a/src/ConferenceEvent.jsx b/src/ConferenceEvent.jsx
index 612a464..274f8b3 100644
--- a/src/ConferenceEvent.jsx
+++ b/src/ConferenceEvent.jsx
@@ -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;
@@ -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 <>
+
+ {items.length === 0 &&
No items selected
}
+
+
+
+ Name |
+ Unit Cost |
+ Quantity |
+ Subtotal |
+
+
+
+ {items.map((item, index) => (
+
+ {item.name} |
+ ${item.cost} |
+
+ {item.type === "meals" || item.numberOfPeople
+ ? ` For ${numberOfPeople} people`
+ : item.quantity}
+ |
+ {item.type === "meals" || item.numberOfPeople
+ ? `${item.cost * numberOfPeople}`
+ : `${item.cost * item.quantity}`}
+ |
+
+ ))}
+
+
+
+ >
};
+
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') {
@@ -66,6 +149,12 @@ const ConferenceEvent = () => {
}
}
+ const totalCosts = {
+ venue: venueTotalCost,
+ av: avTotalCost,
+ meals: mealsTotalCost
+ };
+
return (
<>
@@ -157,9 +246,22 @@ const ConferenceEvent = () => {
-
+ {avItems.map((item, index) => (
+
+
+
+
+
{item.name}
+
${item.cost}
+
+
+ {item.quantity}
+
+
+
+ ))}
- Total Cost:
+ Total Cost: {avTotalCost}
@@ -173,12 +275,27 @@ const ConferenceEvent = () => {
-
+
+ setNumberOfPeople(parseInt(e.target.value))}
+ min="1"
+ />
-
+ {mealsItems.map((item, index) => (
+
+
+ handleMealSelection(index)}
+ />
+
+
+
${item.cost}
+
+ ))}
- Total Cost:
+ Total Cost: {mealsTotalCost}
diff --git a/src/TotalCost.jsx b/src/TotalCost.jsx
index 845abca..2ebcf3c 100644
--- a/src/TotalCost.jsx
+++ b/src/TotalCost.jsx
@@ -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 (
@@ -12,11 +13,11 @@ const TotalCost = ({ totalCosts, ItemsDisplay }) => {
diff --git a/src/avSlice.js b/src/avSlice.js
index cdd79aa..631d323 100644
--- a/src/avSlice.js
+++ b/src/avSlice.js
@@ -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--;
+ }
},
},
});
diff --git a/src/mealsSlice.js b/src/mealsSlice.js
index faf8138..7522f36 100644
--- a/src/mealsSlice.js
+++ b/src/mealsSlice.js
@@ -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;
},
},
});
diff --git a/src/store.js b/src/store.js
index f05b9f8..5f8a434 100644
--- a/src/store.js
+++ b/src/store.js
@@ -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
},
});
diff --git a/src/venueSlice.js b/src/venueSlice.js
index 350d353..8e1972c 100644
--- a/src/venueSlice.js
+++ b/src/venueSlice.js
@@ -33,7 +33,7 @@ export const venueSlice = createSlice({
name: "Small Meeting Room (Capacity:5)",
cost: 1100,
quantity: 0,
- },
+ }
],
reducers: {