diff --git a/src/ConferenceEvent.jsx b/src/ConferenceEvent.jsx
index 612a4648..8bce1b80 100644
--- a/src/ConferenceEvent.jsx
+++ b/src/ConferenceEvent.jsx
@@ -3,10 +3,14 @@ import "./ConferenceEvent.css";
import TotalCost from "./TotalCost";
import { useSelector, useDispatch } from "react-redux";
import { incrementQuantity, decrementQuantity } from "./venueSlice";
+import { incrementAvQuantity, decrementAvQuantity } 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;
@@ -28,36 +32,119 @@ const ConferenceEvent = () => {
dispatch(decrementQuantity(index));
}
};
+
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 = [];
+ 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) => {
+
+ const calculateTotalCost = (section) => {
let totalCost = 0;
if (section === "venue") {
- venueItems.forEach((item) => {
- totalCost += item.cost * item.quantity;
- });
+ 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;
- };
+ return totalCost;
+ };
const venueTotalCost = calculateTotalCost("venue");
-
+ const avTotalCost = calculateTotalCost("av");
+ const mealsTotalCost = calculateTotalCost("meals");
+ const totalCosts = {
+ venue: venueTotalCost,
+ av: avTotalCost,
+ meals: mealsTotalCost,
+ };
const navigateToProducts = (idType) => {
if (idType == '#venue' || idType == '#addons' || idType == '#meals') {
if (showItems) { // Check if showItems is false
@@ -157,9 +244,22 @@ const ConferenceEvent = () => {
-
+ {avItems.map((item, index) => (
+
+
+

+
+
{item.name}
+
${item.cost}
+
+
+ {item.quantity}
+
+
+
+ ))}
- Total Cost:
+ Total Cost: {avTotalCost}
@@ -173,12 +273,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 845abca9..feb86b7b 100644
--- a/src/TotalCost.jsx
+++ b/src/TotalCost.jsx
@@ -2,7 +2,7 @@ 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 +12,11 @@ const TotalCost = ({ totalCosts, ItemsDisplay }) => {
-
-
+ ${total_amount}
+
-
diff --git a/src/avSlice.js b/src/avSlice.js
index cdd79aac..36d89b11 100644
--- a/src/avSlice.js
+++ b/src/avSlice.js
@@ -3,17 +3,54 @@ 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 faf8138a..030f9563 100644
--- a/src/mealsSlice.js
+++ b/src/mealsSlice.js
@@ -1,17 +1,17 @@
-// mealsSlice.js
import { createSlice } from '@reduxjs/toolkit';
-
export const mealsSlice = createSlice({
- name: 'meals',
- initialState: [
-
- ],
- reducers: {
- toggleMealSelection: (state, action) => {
+ 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;
+ },
},
- },
});
-
export const { toggleMealSelection } = mealsSlice.actions;
-
-export default mealsSlice.reducer;
+export default mealsSlice.reducer;
\ No newline at end of file
diff --git a/src/store.js b/src/store.js
index f05b9f8f..18022e3a 100644
--- a/src/store.js
+++ b/src/store.js
@@ -1,9 +1,11 @@
-// store.js
import { configureStore } from '@reduxjs/toolkit';
import venueReducer from './venueSlice';
-
+import avReducer from './avSlice';
+import mealsReducer from './mealsSlice';
export default configureStore({
reducer: {
venue: venueReducer,
+ av: avReducer,
+ meals: mealsReducer,
},
-});
+});
\ No newline at end of file