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

main
Last change on this file was b67dfd3, checked in by Aleksandar Panovski <apano77@…>, 12 days ago

Normalization needed to continue, till here done

  • Property mode set to 100644
File size: 4.2 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);
18 } else {
19 return [...prevItems, item];
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 {menuItems.length > 0 && <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
70 {item.tags && item.tags.length > 0 && (
71 <div className="mb-2">
72 {item.tags.map((tag) => (
73 <span key={tag.id} className="badge bg-secondary me-1">
74 {tag.tagName}: {tag.tagValue}
75 </span>
76 ))}
77 </div>
78 )}
79
80 <button
81 className="btn btn-outline-success mt-auto"
82 onClick={() => handleAddToPreOrder(item)}
83 >
84 Add to Pre-Order
85 </button>
86 </div>
87 </div>
88 </div>
89 ))}
90 </div>
91
92 {preOrder.length > 0 && (
93 <div className="mt-5">
94 <h4>Pre-Order Summary</h4>
95 <ul className="list-group">
96 {preOrder.map((item) => (
97 <li key={item.menuID} className="list-group-item d-flex justify-content-between align-items-center">
98 {item.itemName} (x{item.quantity})
99 <span>${(item.price * item.quantity).toFixed(2)}</span>
100 </li>
101 ))}
102 </ul>
103 <h5 className="mt-3">Total: ${calculateTotal()}</h5>
104 </div>
105 )}
106 </div>
107 );
108};
109
110export default MenuList;
Note: See TracBrowser for help on using the repository browser.