| 1 | import React, {useState} from "react";
|
|---|
| 2 | import {useAuthContext} from "../../configurations/AuthContext";
|
|---|
| 3 | import {Button, Grid, Typography} from "@mui/material";
|
|---|
| 4 | import {useLoaderData, useLocation, useNavigate} from "react-router-dom";
|
|---|
| 5 | import EditRestorantModal from "../../components/modals/restorant-modal";
|
|---|
| 6 | import CreateEditMenuItemModal from "../../components/modals/menu-item-modal";
|
|---|
| 7 | import MenuItemCard from "../../components/cards/menu-item-card";
|
|---|
| 8 | import {CreateOrder, GetOrder, OrderDomainToDtoMapper, OrderStatus, UpdateOrder} from "../../services/order-service";
|
|---|
| 9 | import {UserRole} from "../../services/user-service";
|
|---|
| 10 | import {ShoppingCart} from "@mui/icons-material";
|
|---|
| 11 | import RestaurantPhoto from "../../assets/images/restoran.png";
|
|---|
| 12 | import PaymentModal from "../../components/modals/payment-modal";
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 | const 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 |
|
|---|
| 177 | export default RestorantDetails; |
|---|