| 1 | import React, {useState} from "react";
|
|---|
| 2 | import {Button, Card, CardActions, CardContent, CardHeader, Grid, Typography} from "@mui/material";
|
|---|
| 3 | import MenuItemCard from "./menu-item-card";
|
|---|
| 4 | import {calculateTotalPrice, formatDate} from "../functions";
|
|---|
| 5 | import {useAuthContext} from "../../configurations/AuthContext";
|
|---|
| 6 | import {AssignOrderAdmin, AssignOrderDriver, OrderStatus, UpdateOrder} from "../../services/order-service";
|
|---|
| 7 | import {Link, useLocation, useNavigate} from "react-router-dom";
|
|---|
| 8 | import {UserRole} from "../../services/user-service";
|
|---|
| 9 | import PaymentModal from "../modals/payment-modal";
|
|---|
| 10 |
|
|---|
| 11 | const OrderCard = ({order}) => {
|
|---|
| 12 | const [naracka, setNaracka] = useState(order ?? undefined);
|
|---|
| 13 | const [openPaymentModal, setOpenPaymentModal] = useState(false);
|
|---|
| 14 | const {isAuthorized, loggedUserRole} = useAuthContext();
|
|---|
| 15 | const navigate = useNavigate();
|
|---|
| 16 | const location = useLocation();
|
|---|
| 17 |
|
|---|
| 18 | const [detectAdminAction, setDetectAdminAction] = useState(false);
|
|---|
| 19 |
|
|---|
| 20 | const handleSaveNaracka = async (status) => {
|
|---|
| 21 | let updatedOrder = {
|
|---|
| 22 | potrosuvacId: naracka?.potrosuvac?.id,
|
|---|
| 23 | status: status,
|
|---|
| 24 | menuItems: naracka.narackaMenuItems.map(nmp => ({menuItemId: nmp?.menuItem?.id, quantity: nmp.quantity}))
|
|---|
| 25 | }
|
|---|
| 26 |
|
|---|
| 27 | setNaracka({...naracka, status: status});
|
|---|
| 28 | await UpdateOrder(naracka.id, updatedOrder)
|
|---|
| 29 | navigate(location.pathname, {replace: true});
|
|---|
| 30 | }
|
|---|
| 31 |
|
|---|
| 32 | const handleAssignAdmin = async (status) => {
|
|---|
| 33 |
|
|---|
| 34 | let adminRequest = {
|
|---|
| 35 | adminId: loggedUserRole?.roleId,
|
|---|
| 36 | approvalStatus: status,
|
|---|
| 37 | }
|
|---|
| 38 |
|
|---|
| 39 | await AssignOrderAdmin(naracka.id, adminRequest)
|
|---|
| 40 | navigate(location.pathname, {replace: true});
|
|---|
| 41 | }
|
|---|
| 42 |
|
|---|
| 43 | const handleAssignVozac = async (status) => {
|
|---|
| 44 |
|
|---|
| 45 | let driverRequest = {
|
|---|
| 46 | vozacId: loggedUserRole?.roleId,
|
|---|
| 47 | deliveryStatus: status,
|
|---|
| 48 | }
|
|---|
| 49 |
|
|---|
| 50 | await AssignOrderDriver(naracka.id, driverRequest)
|
|---|
| 51 | navigate(location.pathname, {replace: true});
|
|---|
| 52 | }
|
|---|
| 53 |
|
|---|
| 54 | const handleAddRemoveToNaracka = async (menuItem) => {
|
|---|
| 55 | const existingIndex = naracka.narackaMenuItems.findIndex(narackaMenu => narackaMenu.menuItem.id === menuItem.menuItemId);
|
|---|
| 56 |
|
|---|
| 57 | if (existingIndex !== -1) {
|
|---|
| 58 | // If the menu item exists, update its quantity
|
|---|
| 59 | if (menuItem.quantity === 0) {
|
|---|
| 60 | // Show confirm alert
|
|---|
| 61 | const shouldRemove = window.confirm("Are you sure you want to remove this item?");
|
|---|
| 62 | if (shouldRemove) {
|
|---|
| 63 | await setNaracka(prevState => ({
|
|---|
| 64 | ...prevState,
|
|---|
| 65 | narackaMenuItems: prevState.narackaMenuItems.filter((item, index) => index !== existingIndex)
|
|---|
| 66 | }));
|
|---|
| 67 | }
|
|---|
| 68 | } else {
|
|---|
| 69 | await setNaracka(prevState => ({
|
|---|
| 70 | ...prevState,
|
|---|
| 71 | narackaMenuItems: prevState.narackaMenuItems.map((item, index) => {
|
|---|
| 72 | if (index === existingIndex) {
|
|---|
| 73 | return {...item, quantity: menuItem.quantity};
|
|---|
| 74 | }
|
|---|
| 75 | return item;
|
|---|
| 76 | })
|
|---|
| 77 | }));
|
|---|
| 78 | }
|
|---|
| 79 | } else if (menuItem.quantity !== 0) {
|
|---|
| 80 | // If the menu item doesn't exist and its quantity is not 0, add it to the naracka
|
|---|
| 81 | await setNaracka(prevState => ({
|
|---|
| 82 | ...prevState,
|
|---|
| 83 | narackaMenuItems: [...prevState.narackaMenuItems, menuItem]
|
|---|
| 84 | }));
|
|---|
| 85 | }
|
|---|
| 86 | };
|
|---|
| 87 |
|
|---|
| 88 | return (
|
|---|
| 89 | naracka && <Card variant="elevation" className={"m-1"}>
|
|---|
| 90 | <CardHeader title={`NARACKA BROJ #${order.id}`}
|
|---|
| 91 | subheader={<div>
|
|---|
| 92 | <div>User:
|
|---|
| 93 | <Link
|
|---|
| 94 | to={`/users/${order?.potrosuvac?.korisnik?.id}`}> {order?.potrosuvac?.korisnik?.username} </Link>
|
|---|
| 95 | </div>
|
|---|
| 96 | <div>Address: {order?.potrosuvac?.address}</div>
|
|---|
| 97 | <div>Contact: {order?.potrosuvac?.phoneNumber}</div>
|
|---|
| 98 | </div>}/>
|
|---|
| 99 | <CardContent className={"d-flex flex-column align-content-center justify-content-center"}>
|
|---|
| 100 | <Typography className={"text-center"} variant="h5">
|
|---|
| 101 | {formatDate(order.datum)}
|
|---|
| 102 | </Typography>
|
|---|
| 103 | <Typography className={"text-center mt-1"} variant="h5">
|
|---|
| 104 | <i>{order.status}</i>
|
|---|
| 105 | </Typography>
|
|---|
| 106 |
|
|---|
| 107 | {naracka.narackaMenuItems && naracka.narackaMenuItems.length > 0 && naracka.narackaMenuItems.map((narackaMenu) => narackaMenu.quantity > 0 &&
|
|---|
| 108 | <MenuItemCard key={narackaMenu.id} item={narackaMenu.menuItem} quantitynb={narackaMenu.quantity}
|
|---|
| 109 | skipChanges={naracka.status !== OrderStatus.PendingUserApproval}
|
|---|
| 110 | detectAdminAction={() => window.location.reload()}
|
|---|
| 111 | itemchange={handleAddRemoveToNaracka}/>
|
|---|
| 112 | )}
|
|---|
| 113 | </CardContent>
|
|---|
| 114 | <CardActions>
|
|---|
| 115 | <Grid container>
|
|---|
| 116 | <Grid item xs={12}>
|
|---|
| 117 | <Typography variant={"h4"}>
|
|---|
| 118 | Total Price: {calculateTotalPrice(naracka?.narackaMenuItems)} MKD
|
|---|
| 119 | </Typography>
|
|---|
| 120 | </Grid>
|
|---|
| 121 | <Grid item xs={12}>
|
|---|
| 122 | {isAuthorized(order?.potrosuvac?.id) && order?.status === OrderStatus.PendingUserApproval &&
|
|---|
| 123 | <>
|
|---|
| 124 | <Button onClick={() => handleSaveNaracka(OrderStatus.PendingUserApproval)}>Save
|
|---|
| 125 | changes</Button>
|
|---|
| 126 | <Button onClick={() => setOpenPaymentModal(true)}>Pay now</Button>
|
|---|
| 127 | </>}
|
|---|
| 128 |
|
|---|
| 129 | {loggedUserRole?.role === UserRole.Admin && ![OrderStatus.Finished, OrderStatus.Terminated, OrderStatus.PendingUserApproval].includes(order.status) &&
|
|---|
| 130 | <>
|
|---|
| 131 | {![OrderStatus.Finished, OrderStatus.Approved, OrderStatus.Delivering].includes(order.status) &&
|
|---|
| 132 | <Button onClick={() => handleAssignAdmin(OrderStatus.Approved)}>Approve</Button>}
|
|---|
| 133 | {![OrderStatus.Finished, OrderStatus.Terminated].includes(order.status) &&
|
|---|
| 134 | <Button onClick={() => handleAssignAdmin(OrderStatus.Terminated)}>Reject
|
|---|
| 135 | Order</Button>}
|
|---|
| 136 | {![OrderStatus.Finished, OrderStatus.PendingAdminApproval].includes(order.status) &&
|
|---|
| 137 | <Button onClick={() => handleAssignAdmin(OrderStatus.Finished)}>Finish
|
|---|
| 138 | Order</Button>}
|
|---|
| 139 | </>}
|
|---|
| 140 |
|
|---|
| 141 | {loggedUserRole?.role === UserRole.Vozac && [OrderStatus.Approved, OrderStatus.Delivering].includes(order.status) &&
|
|---|
| 142 | <>
|
|---|
| 143 | {order.status !== OrderStatus.Delivering &&
|
|---|
| 144 | < Button onClick={() => handleAssignVozac(OrderStatus.Delivering)}>Pick up
|
|---|
| 145 | Order</Button>}
|
|---|
| 146 | {![OrderStatus.Finished, OrderStatus.PendingAdminApproval, OrderStatus.Approved].includes(order.status) &&
|
|---|
| 147 | < Button onClick={() => handleAssignVozac(OrderStatus.Finished)}>Finish
|
|---|
| 148 | Order</Button>}
|
|---|
| 149 | < Button onClick={() => handleAssignVozac(OrderStatus.Terminated)}>Cancel Order</Button>
|
|---|
| 150 | </>}
|
|---|
| 151 | </Grid>
|
|---|
| 152 | </Grid>
|
|---|
| 153 | </CardActions>
|
|---|
| 154 | {openPaymentModal &&
|
|---|
| 155 | <PaymentModal naracka={naracka} open={openPaymentModal} onClose={() => setOpenPaymentModal(false)}/>}
|
|---|
| 156 | </Card>
|
|---|
| 157 | )
|
|---|
| 158 | }
|
|---|
| 159 |
|
|---|
| 160 | export default OrderCard; |
|---|