source: my-react-app/src/components/MenuList.js@ e15e8d9

main
Last change on this file since e15e8d9 was e15e8d9, checked in by Aleksandar Panovski <apano77@…>, 2 weeks ago

menu feature done

  • Property mode set to 100644
File size: 3.7 KB
Line 
1import React, { useState, useEffect } from 'react';
2import axios from 'axios';
3import 'bootstrap/dist/css/bootstrap.min.css';
4
5const MenuList = ({ restaurantId, onPreOrderChange, setPreOrderedItems, preOrderedItems }) => {
6 const [menuItems, setMenuItems] = useState([]);
7 const [preOrder, setPreOrder] = useState([]);
8
9 const handleItemSelect = (item) => {
10 setPreOrderedItems(prevItems => [...prevItems, item]);
11 };
12
13 const handleItemToggle = (item) => {
14 setPreOrderedItems(prevItems => {
15 const exists = prevItems.find(i => i.id === item.id);
16 if (exists) {
17 return prevItems.filter(i => i.id !== item.id); // remove
18 } else {
19 return [...prevItems, item]; // add
20 }
21 });
22 };
23
24 useEffect(() => {
25 const fetchMenu = async () => {
26 try {
27 const response = await axios.get(`http://localhost:8081/api/restaurant-menu/${restaurantId}`);
28 setMenuItems(response.data);
29 } catch (err) {
30 console.error('Failed to fetch menu:', err);
31 }
32 };
33 if (restaurantId) {
34 fetchMenu();
35 }
36 }, [restaurantId]);
37
38 const handleAddToPreOrder = (item) => {
39 const existingItem = preOrder.find((i) => i.menuID === item.menuID);
40
41 let updatedPreOrder;
42 if (existingItem) {
43 updatedPreOrder = preOrder.map((i) =>
44 i.menuID === item.menuID ? { ...i, quantity: i.quantity + 1 } : i
45 );
46 } else {
47 updatedPreOrder = [...preOrder, { ...item, quantity: 1 }];
48 }
49
50 setPreOrder(updatedPreOrder);
51 setPreOrderedItems(updatedPreOrder);
52 };
53
54 const calculateTotal = () => {
55 return preOrder.reduce((acc, item) => acc + item.price * item.quantity, 0).toFixed(2);
56 };
57
58 return (
59 <div className="container mt-4">
60 <h3 className="text-center">Menu</h3>
61 <div className="row">
62 {menuItems.map((item) => (
63 <div key={item.menuID} className="col-md-4 mb-4">
64 <div className="card h-100 shadow-sm">
65 <div className="card-body d-flex flex-column">
66 <h5 className="card-title">{item.itemName}</h5>
67 <p className="card-text">{item.description}</p>
68 <h6 className="card-subtitle mb-2 text-muted">${item.price.toFixed(2)}</h6>
69 <button
70 className="btn btn-outline-success mt-auto"
71 onClick={() => handleAddToPreOrder(item)}
72 >
73 Add to Pre-Order
74 </button>
75 </div>
76 </div>
77 </div>
78 ))}
79 </div>
80
81 {preOrder.length > 0 && (
82 <div className="mt-5">
83 <h4>Pre-Order Summary</h4>
84 <ul className="list-group">
85 {preOrder.map((item) => (
86 <li key={item.menuID} className="list-group-item d-flex justify-content-between align-items-center">
87 {item.itemName} (x{item.quantity})
88 <span>${(item.price * item.quantity).toFixed(2)}</span>
89 </li>
90 ))}
91 </ul>
92 <h5 className="mt-3">Total: ${calculateTotal()}</h5>
93 </div>
94 )}
95 </div>
96 );
97};
98
99export default MenuList;
Note: See TracBrowser for help on using the repository browser.