source: frontend/src/routes/restourant/restorant-details.jsx@ badbc79

Last change on this file since badbc79 was badbc79, checked in by Luka Cheshlarov <luka.cheshlarov@…>, 20 months ago

Initial commit

  • Property mode set to 100644
File size: 7.3 KB
Line 
1import React, {useState} from "react";
2import {useAuthContext} from "../../configurations/AuthContext";
3import {Button, Grid, Typography} from "@mui/material";
4import {useLoaderData, useLocation, useNavigate} from "react-router-dom";
5import EditRestorantModal from "../../components/modals/restorant-modal";
6import CreateEditMenuItemModal from "../../components/modals/menu-item-modal";
7import MenuItemCard from "../../components/cards/menu-item-card";
8import {CreateOrder, GetOrder, OrderDomainToDtoMapper, OrderStatus, UpdateOrder} from "../../services/order-service";
9import {UserRole} from "../../services/user-service";
10import {ShoppingCart} from "@mui/icons-material";
11import RestaurantPhoto from "../../assets/images/restoran.png";
12import PaymentModal from "../../components/modals/payment-modal";
13
14
15const RestorantDetails = ({id}) => {
16 const {isAuthorized, loggedUserRole, ownershipChanges} = useAuthContext();
17 const {restorant, activeOrder} = useLoaderData();
18
19 const [openUpdateModal, setOpenUpdateModal] = useState(false);
20 const [openMenuItemModal, setOpenMenuItemModal] = useState(false);
21 const [openPaymentModal, setOpenPaymentModal] = useState(false);
22 const navigate = useNavigate();
23 const location = useLocation();
24
25 let initialStateNaracka = {
26 potrosuvacId: loggedUserRole?.roleId,
27 status: OrderStatus.PendingUserApproval,
28 menuItems: []
29 }
30
31 const [naracka, setNaracka] = useState(OrderDomainToDtoMapper(activeOrder) ?? initialStateNaracka)
32 const [activeOrderForPayment, setActiveOrderForPayment] = useState(activeOrder)
33
34 const handleAddRemoveToNaracka = async (menuItem) => {
35 const existingMenuItem = naracka.menuItems.find(item => item.menuItemId === menuItem.menuItemId);
36
37 if (existingMenuItem) {
38 // If the menu item exists, update its quantity
39 await setNaracka(prevState => ({
40 ...prevState,
41 menuItems: prevState.menuItems.map(item => {
42 if (item.menuItemId === menuItem.menuItemId) {
43 return {...item, quantity: menuItem.quantity};
44 }
45 return item;
46 })
47 }));
48 } else {
49 // If the menu item doesn't exist, add it to the naracka
50 await setNaracka(prevState => ({
51 ...prevState,
52 menuItems: [...prevState.menuItems, menuItem]
53 }));
54 }
55 };
56
57 const handleNarackaSubmit = async (status) => {
58 setNaracka({...naracka, [status]: status});
59
60 if (loggedUserRole.activeOwnershipId && activeOrder) {
61 await UpdateOrder(activeOrder.id, naracka);
62
63 if (status === OrderStatus.PendingAdminApproval) {
64 setOpenPaymentModal(true);
65 }
66
67 return;
68 }
69
70 let orderId = await CreateOrder(naracka);
71 ownershipChanges(orderId);
72
73 if (status === OrderStatus.PendingAdminApproval) {
74 let order = await GetOrder(orderId);
75 setActiveOrderForPayment(order);
76 setOpenPaymentModal(true);
77 } else {
78 navigate(0);
79 }
80
81 window.alert(`Your Order with Id #${orderId} is ready`);
82 }
83
84 const handleCreateMenuItem = () => {
85 navigate(location.pathname);
86 setOpenMenuItemModal(false)
87 }
88
89
90 return (restorant &&
91 <Grid container direction={"row"} justify={"center"} alignItems={"center"} component={"main"}>
92 <Grid container item xs={12}>
93 <Grid item xs={5} alignItems={"center"} justify={"space-between"}
94 className={"background-image mt-5"}
95 height={'250px'}
96 width={'500px'}
97 style={{backgroundImage: `url(${RestaurantPhoto})`}}>
98 </Grid>
99 <Grid item xs={7} className={"mt-5"}>
100 <Grid container justify={"space-between"} direction={"column"} className={"m-3"}>
101 <Typography variant={"h3"}>
102 {restorant.ime}
103 </Typography>
104 <Typography variant={"body2"}>
105 {restorant.lokacija} , {restorant.rabotnoVreme}
106 </Typography>
107 </Grid>
108 {/*<Typography>*/}
109 {/* {restorant.rabotnoVreme}*/}
110 {/*</Typography>*/}
111 <Grid container direction={"row"} className={"m-3"}>
112 <Typography variant={"h6"}>
113 Manager: {restorant.manager?.korisnik?.username}
114 </Typography>
115 </Grid>
116 <Grid container direction={'row'}>
117 {loggedUserRole?.role === UserRole.Potrosuvac && naracka.menuItems?.length > 0 && naracka.menuItems?.some(x => x.quantity > 0) &&
118 < >
119 < Button onClick={() => handleNarackaSubmit(OrderStatus.PendingUserApproval)}>Add to
120 Cart <ShoppingCart/> </Button>
121 <Button onClick={() => handleNarackaSubmit(OrderStatus.PendingAdminApproval)}>Finish
122 Order</Button>
123 </>}
124
125 {(isAuthorized(restorant?.manager?.id) || loggedUserRole?.role === UserRole.Admin) &&
126 <Grid>
127 <Button onClick={() => setOpenUpdateModal(true)}>
128 Update Restorant
129 </Button>
130 <Button onClick={() => setOpenMenuItemModal(true)}>
131 Create Menu Item
132 </Button>
133 </Grid>
134 }
135 </Grid>
136 </Grid>
137 </Grid>
138
139 {
140 restorant.menuItems &&
141 restorant.menuItems.length > 0 &&
142 restorant.menuItems.map((menuItem) => (
143 <Grid key={menuItem.id} item xs={12} md={6} lg={6}>
144 <MenuItemCard item={menuItem}
145 quantitynb={naracka.menuItems?.find(x => x.menuItemId === menuItem.id)?.quantity}
146 restorant={restorant}
147 itemchange={handleAddRemoveToNaracka}/>
148 </Grid>
149 ))
150 }
151
152 {
153 openUpdateModal &&
154 <EditRestorantModal restorant={restorant} open={openUpdateModal}
155 onClose={() => setOpenUpdateModal(false)}/>
156 }
157
158 {
159 openMenuItemModal &&
160 <CreateEditMenuItemModal restorantId={restorant.id} open={openMenuItemModal}
161 onClose={handleCreateMenuItem}/>
162 }
163
164 {
165 openPaymentModal &&
166 <PaymentModal naracka={activeOrderForPayment} open={openPaymentModal}
167 onClose={() => {
168 setOpenPaymentModal(false);
169 navigate(0);
170 }}/>
171 }
172
173 </Grid>
174 )
175}
176
177export default RestorantDetails;
Note: See TracBrowser for help on using the repository browser.