diff --git a/src/ConferenceEvent.jsx b/src/ConferenceEvent.jsx
index 612a4648..25fdda85 100644
--- a/src/ConferenceEvent.jsx
+++ b/src/ConferenceEvent.jsx
@@ -3,200 +3,360 @@ import "./ConferenceEvent.css";
import TotalCost from "./TotalCost";
import { useSelector, useDispatch } from "react-redux";
import { incrementQuantity, decrementQuantity } from "./venueSlice";
-const ConferenceEvent = () => {
- const [showItems, setShowItems] = useState(false);
- const [numberOfPeople, setNumberOfPeople] = useState(1);
- const venueItems = useSelector((state) => state.venue);
- const dispatch = useDispatch();
- const remainingAuditoriumQuantity = 3 - venueItems.find(item => item.name === "Auditorium Hall (Capacity:200)").quantity;
-
-
- const handleToggleItems = () => {
- console.log("handleToggleItems called");
- setShowItems(!showItems);
- };
-
- const handleAddToCart = (index) => {
- if (venueItems[index].name === "Auditorium Hall (Capacity:200)" && venueItems[index].quantity >= 3) {
- return;
- }
- dispatch(incrementQuantity(index));
- };
-
- const handleRemoveFromCart = (index) => {
- if (venueItems[index].quantity > 0) {
- dispatch(decrementQuantity(index));
- }
- };
- const handleIncrementAvQuantity = (index) => {
- };
-
- const handleDecrementAvQuantity = (index) => {
- };
-
- const handleMealSelection = (index) => {
-
- };
+import { decrementAvQuantity, incrementAvQuantity } from "./avSlice";
+import { toggleMealSelection } from "./mealsSlice";
- const getItemsFromTotalCost = () => {
- const items = [];
- };
-
- const items = getItemsFromTotalCost();
-
- const ItemsDisplay = ({ items }) => {
-
- };
- const calculateTotalCost = (section) => {
- let totalCost = 0;
- if (section === "venue") {
- venueItems.forEach((item) => {
- totalCost += item.cost * item.quantity;
- });
- }
- return totalCost;
- };
- const venueTotalCost = calculateTotalCost("venue");
-
- const navigateToProducts = (idType) => {
- if (idType == '#venue' || idType == '#addons' || idType == '#meals') {
- if (showItems) { // Check if showItems is false
- setShowItems(!showItems); // Toggle showItems to true only if it's currently false
- }
+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.meal);
+ const dispatch = useDispatch();
+ const remainingAuditoriumQuantity =
+ 3 -
+ venueItems.find((item) => item.name === "Auditorium Hall (Capacity:200)")
+ .quantity;
+
+ const handleToggleItems = () => {
+ console.log("handleToggleItems called");
+ setShowItems(!showItems);
+ };
+
+ const handleAddToCart = (index) => {
+ if (
+ venueItems[index].name === "Auditorium Hall (Capacity:200)" &&
+ venueItems[index].quantity >= 3
+ ) {
+ return;
+ }
+ dispatch(incrementQuantity(index));
+ };
+
+ const handleRemoveFromCart = (index) => {
+ if (venueItems[index].quantity > 0) {
+ 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 = [];
+ 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 (
- <>
-
- Conference Expense Planner
-
-
-
-
-
-
- {!showItems
- ?
- (
-
-
-
-
-
Venue Room Selection
+ <>
+
+ {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}`}
+ |
+
+ ))}
+
+
-
- {venueItems.map((item, index) => (
-
-
-

-
-
{item.name}
-
${item.cost}
-
- {venueItems[index].name === "Auditorium Hall (Capacity:200)" ? (
-
- <>
-
-
- {venueItems[index].quantity > 0 ? ` ${venueItems[index].quantity}` : "0"}
-
+ >
+ );
+ };
+ 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") {
+ if (showItems) {
+ // Check if showItems is false
+ setShowItems(!showItems); // Toggle showItems to true only if it's currently false
+ }
+ }
+ };
+
+ const totalCosts = {
+ venue: venueTotalCost,
+ av: avTotalCost,
+ meals: mealsTotalCost,
+ };
+
+ return (
+ <>
+
+ Conference Expense Planner
+
+
- >
- ) : (
-
-
-
- {venueItems[index].quantity > 0 ? ` ${venueItems[index].quantity}` : "0"}
-
-
-
-
-
- )}
-
-
- ))}
-
Total Cost: ${venueTotalCost}
-
-
- {/*Necessary Add-ons*/}
-
-
-
-
-
-
Add-ons Selection
-
-
-
-
-
-
Total Cost:
-
-
-
- {/* Meal Section */}
-
-
-
-
-
-
Meals Selection
-
-
-
-
-
-
-
-
-
Total Cost:
-
-
-
-
- ) : (
-
-
} />
+
+
+ {!showItems ? (
+
+
+
+
Venue Room Selection
+
+
+ {venueItems.map((item, index) => (
+
+
+

+
+
{item.name}
+
${item.cost}
+
+ {venueItems[index].name ===
+ "Auditorium Hall (Capacity:200)" ? (
+ <>
+
+
+ {venueItems[index].quantity > 0
+ ? ` ${venueItems[index].quantity}`
+ : "0"}
+
+
+ >
+ ) : (
+
+
+
+ {venueItems[index].quantity > 0
+ ? ` ${venueItems[index].quantity}`
+ : "0"}
+
+
- )
- }
+ )}
+
+
+ ))}
+
+
Total Cost: ${venueTotalCost}
+
+ {/*Necessary Add-ons*/}
+
+
+
Add-ons Selection
+
+
+ {avItems.map((item, index) => (
+
+
+

+
+
{item.name}
+
${item.cost}
+
+
+ {item.quantity}
+
+
+
+ ))}
+
+
Total Cost: {avTotalCost}
+
+ {/* Meal Section */}
+
+
+
Meals Selection
+
+
+
+ setNumberOfPeople(parseInt(e.target.value))}
+ min="1"
+ />
+
+
+ {mealsItems.map((item, index) => (
+
+
+ handleMealSelection(index)}
+ />
+
+
+
${item.cost}
+
+ ))}
+
+
Total Cost:{mealsTotalCost}
- >
-
- );
+
+ ) : (
+
+ }
+ />
+
+ )}
+
+ >
+ );
};
export default ConferenceEvent;
diff --git a/src/TotalCost.jsx b/src/TotalCost.jsx
index 845abca9..d95cd762 100644
--- a/src/TotalCost.jsx
+++ b/src/TotalCost.jsx
@@ -1,27 +1,25 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect } from "react";
import "./TotalCost.css";
-
const TotalCost = ({ totalCosts, ItemsDisplay }) => {
-
-
+ const total_amount = totalCosts.venue + totalCosts.av + totalCosts.meals;
return (
-
Total cost for the event
+
+
Total cost for the event
+
-
+ ${totalCosts}
-
-
-
-
+
+
+
);
};
-
export default TotalCost;
diff --git a/src/avSlice.js b/src/avSlice.js
index cdd79aac..edc8e2f9 100644
--- a/src/avSlice.js
+++ b/src/avSlice.js
@@ -3,16 +3,51 @@ 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..54ac8a6d 100644
--- a/src/mealsSlice.js
+++ b/src/mealsSlice.js
@@ -2,12 +2,16 @@
import { createSlice } from '@reduxjs/toolkit';
export const mealsSlice = createSlice({
- name: 'meals',
+ 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 f05b9f8f..95c00848 100644
--- a/src/store.js
+++ b/src/store.js
@@ -1,9 +1,13 @@
// 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,
+ meal: mealsReducer,
},
});
diff --git a/src/venueSlice.js b/src/venueSlice.js
index 350d353a..dd612b76 100644
--- a/src/venueSlice.js
+++ b/src/venueSlice.js
@@ -52,6 +52,7 @@ export const venueSlice = createSlice({
state[index].quantity--;
}
},
+
},
});