source: frontend/src/screens/AdminOrderScreen.js@ 55ed171

Last change on this file since 55ed171 was 55ed171, checked in by Nace Gjorgjievski <nace.gorgievski123@…>, 21 months ago

Full Admin Functionality Added

  • Property mode set to 100644
File size: 8.8 KB
Line 
1import axios from "axios";
2import React, { useContext, useEffect, useReducer } from "react";
3import { Link, useNavigate, useParams } from "react-router-dom";
4import LoadingBox from "../components/LoadingBox";
5import MessageBox from "../components/MessageBox";
6import { Store } from "../Store";
7import { getError } from "../components/utils";
8import { Helmet } from "react-helmet-async";
9import Row from "react-bootstrap/Row";
10import Card from "react-bootstrap/Card";
11import Col from "react-bootstrap/Col";
12import ListGroup from "react-bootstrap/ListGroup";
13import Button from "react-bootstrap/Button";
14import { toast } from "react-toastify";
15
16function reducer(state, action) {
17 switch (action.type) {
18 case "FETCH_REQUEST":
19 return { ...state, loading: true, error: "" };
20 case "FETCH_SUCCESS":
21 return { ...state, loading: false, order: action.payload, error: "" };
22 case "FETCH_FAIL":
23 return { ...state, loading: false, error: action.payload };
24 default:
25 return state;
26 }
27}
28
29export default function OrderScreen() {
30 const { state } = useContext(Store);
31 const { userInfo } = state;
32 const params = useParams();
33 const { id: orderId } = params;
34 const navigate = useNavigate();
35
36 const [{ loading, error, order }, dispatch] = useReducer(reducer, {
37 loading: true,
38 order: {},
39 error: "",
40 });
41
42 useEffect(() => {
43 const fetchOrder = async () => {
44 try {
45 dispatch({ type: "FETCH_REQUEST" });
46 const { data } = await axios.get(`/api/orders/${orderId}`, {
47 headers: { authorization: `Bearer ${userInfo.token}` },
48 });
49 dispatch({ type: "FETCH_SUCCESS", payload: data });
50 } catch (err) {
51 dispatch({ type: "FETCH_FAIL", payload: getError(err) });
52 }
53 };
54 if (!userInfo) {
55 return navigate("/login");
56 }
57 if (!order._id || (order._id && order._id !== orderId)) {
58 fetchOrder();
59 }
60 }, [order, userInfo, orderId, navigate]);
61
62 const confirmOrderHandler = async () => {
63 let isConfirmed = true;
64 let _id = order._id;
65 try {
66 const { data } = await axios.put("/api/orders/action", {
67 isConfirmed,
68 _id,
69 });
70
71 toast.success("Нарачката е потврдена");
72 } catch (err) {
73 dispatch({ type: "FETCH_FAIL" });
74 toast.error("Грешка");
75 }
76 };
77 const sendOrderHandler = async () => {
78 let isShipped = true;
79 let shippedAt = Date();
80 let _id = order._id;
81 try {
82 const { data } = await axios.put("/api/orders/action", {
83 isShipped,
84 shippedAt,
85 _id,
86 });
87
88 toast.success("Нарачката е испратена");
89 } catch (err) {
90 dispatch({ type: "FETCH_FAIL" });
91 toast.error("Грешка");
92 }
93 };
94 const finishOrderHandler = async () => {
95 let isDelivered = true;
96 let deliveredAt = Date();
97 let _id = order._id;
98 try {
99 if (order.isPaid) {
100 const { data } = await axios.put("/api/orders/action", {
101 isDelivered,
102 deliveredAt,
103 _id,
104 });
105 } else {
106 let isPaid = true;
107 let paidAt = Date();
108 const { data } = await axios.put("/api/orders/action", {
109 _id,
110 isDelivered,
111 deliveredAt,
112 isPaid,
113 paidAt,
114 });
115 }
116
117 toast.success("Нарачката е пристигната");
118 } catch (err) {
119 dispatch({ type: "FETCH_FAIL" });
120 toast.error("Грешка");
121 }
122 };
123
124 return loading ? (
125 <LoadingBox></LoadingBox>
126 ) : error ? (
127 <MessageBox variant="danger">{error}</MessageBox>
128 ) : (
129 <div className="pageContainer shipPC">
130 <Helmet>
131 <title>Нарачка {orderId}</title>
132 </Helmet>
133 <h1 style={{ marginTop: "20px" }}>Нарачка {orderId}</h1>
134 <Row style={{ width: "90%" }}>
135 <Col md={8}>
136 <Card className="mb-3">
137 <Card.Body>
138 <Card.Title>Испорака</Card.Title>
139 <Card.Text>
140 <strong>Име:</strong> {order.shippingAddress.fullName}
141 <br />
142 <strong>Адреса:</strong> {order.shippingAddress.address},
143 {order.shippingAddress.city},{order.shippingAddress.postalCode},
144 {order.shippingAddress.country}
145 <br />
146 <strong>Телефон:</strong> {order.contactNumber}
147 <br />
148 </Card.Text>
149 </Card.Body>
150 </Card>
151 <Card className="mb-3">
152 <Card.Body>
153 <Card.Title>Плаќање</Card.Title>
154 <Card.Text>
155 <strong>Начин:</strong>{" "}
156 {order.paymentMethod === "Karticka"
157 ? "Со платежна картичка"
158 : "Во готово при достава"}
159 </Card.Text>
160 {order.isPaid ? (
161 <MessageBox variant="success">
162 Платено на {order.paidAt}
163 </MessageBox>
164 ) : (
165 <MessageBox variant="danger">Не е платено</MessageBox>
166 )}
167 </Card.Body>
168 </Card>
169 <Card className="mb-3">
170 <Card.Body>
171 <Card.Title>Продукти</Card.Title>
172 <ListGroup variant="flush">
173 {order.orderItems.map((item) => (
174 <ListGroup.Item key={item._id}>
175 <div
176 style={{
177 display: "flex",
178 justifyContent: "space-between",
179 }}
180 >
181 <div style={{ display: "flex", alignItems: "center" }}>
182 <img
183 src={item.image}
184 alt={item.name}
185 className="img-fluid rounded img-thumbnail"
186 style={{ margin: "0px" }}
187 ></img>
188 <Link to={`/product/${item.slug}`}>{item.name}</Link>
189 </div>
190
191 <span>{item.quantity}</span>
192
193 <span>{item.price} ден</span>
194 </div>
195 </ListGroup.Item>
196 ))}
197 </ListGroup>
198 </Card.Body>
199 </Card>
200 </Col>
201 <Col md={4}>
202 <Card>
203 <Card.Body>
204 <Card.Title>Нарачка</Card.Title>
205 <ListGroup variant="flush">
206 <ListGroup.Item>
207 <Row>
208 <Col>Продукти:</Col>
209 <Col>{order.itemsPrice.toFixed(2)} ден</Col>
210 </Row>
211 </ListGroup.Item>
212 <ListGroup.Item>
213 <Row>
214 <Col>Испорака:</Col>
215 <Col>{order.shippingPrice.toFixed(2)} ден</Col>
216 </Row>
217 </ListGroup.Item>
218
219 <ListGroup.Item>
220 <Row>
221 <Col>
222 <strong>Вкупно</strong>
223 </Col>
224 <Col>
225 <strong>{order.totalPrice.toFixed(2)} ден</strong>
226 </Col>
227 </Row>
228 </ListGroup.Item>
229 </ListGroup>
230 </Card.Body>
231 </Card>
232 <Card style={{ marginTop: "40px" }}>
233 <Card.Body>
234 <Card.Title>Акции</Card.Title>
235 <ListGroup variant="flush">
236 <ListGroup.Item>
237 <Button
238 style={{ width: "100%" }}
239 disabled={order.isConfirmed === true}
240 onClick={confirmOrderHandler}
241 >
242 Потврди Нарачка
243 </Button>
244 </ListGroup.Item>
245 <ListGroup.Item>
246 <Button
247 style={{ width: "100%" }}
248 disabled={
249 order.isConfirmed === false || order.isShipped === true
250 }
251 onClick={sendOrderHandler}
252 >
253 Испрати Нарачка
254 </Button>
255 </ListGroup.Item>
256
257 <ListGroup.Item>
258 <Button
259 style={{ width: "100%" }}
260 disabled={
261 order.isConfirmed === false ||
262 order.isShipped === false ||
263 order.isDelivered === true
264 }
265 onClick={finishOrderHandler}
266 >
267 Нарачката е пристигната
268 </Button>
269 </ListGroup.Item>
270 </ListGroup>
271 </Card.Body>
272 </Card>
273 </Col>
274 </Row>
275 </div>
276 );
277}
Note: See TracBrowser for help on using the repository browser.