source: frontend/src/components/cards/order-card.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.9 KB
Line 
1import React, {useState} from "react";
2import {Button, Card, CardActions, CardContent, CardHeader, Grid, Typography} from "@mui/material";
3import MenuItemCard from "./menu-item-card";
4import {calculateTotalPrice, formatDate} from "../functions";
5import {useAuthContext} from "../../configurations/AuthContext";
6import {AssignOrderAdmin, AssignOrderDriver, OrderStatus, UpdateOrder} from "../../services/order-service";
7import {Link, useLocation, useNavigate} from "react-router-dom";
8import {UserRole} from "../../services/user-service";
9import PaymentModal from "../modals/payment-modal";
10
11const 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
160export default OrderCard;
Note: See TracBrowser for help on using the repository browser.