source: frontend/src/screens/OrderScreen.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: 6.5 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";
13
14function reducer(state, action) {
15 switch (action.type) {
16 case "FETCH_REQUEST":
17 return { ...state, loading: true, error: "" };
18 case "FETCH_SUCCESS":
19 return { ...state, loading: false, order: action.payload, error: "" };
20 case "FETCH_FAIL":
21 return { ...state, loading: false, error: action.payload };
22 default:
23 return state;
24 }
25}
26
27export default function OrderScreen() {
28 const { state } = useContext(Store);
29 const { userInfo } = state;
30 const params = useParams();
31 const { id: orderId } = params;
32 const navigate = useNavigate();
33
34 const [{ loading, error, order }, dispatch] = useReducer(reducer, {
35 loading: true,
36 order: {},
37 error: "",
38 });
39
40 useEffect(() => {
41 const fetchOrder = async () => {
42 try {
43 dispatch({ type: "FETCH_REQUEST" });
44 const { data } = await axios.get(`/api/orders/${orderId}`, {
45 headers: { authorization: `Bearer ${userInfo.token}` },
46 });
47 dispatch({ type: "FETCH_SUCCESS", payload: data });
48 } catch (err) {
49 dispatch({ type: "FETCH_FAIL", payload: getError(err) });
50 }
51 };
52 if (!userInfo) {
53 return navigate("/login");
54 }
55 if (!order._id || (order._id && order._id !== orderId)) {
56 fetchOrder();
57 }
58 }, [order, userInfo, orderId, navigate]);
59
60 return loading ? (
61 <LoadingBox></LoadingBox>
62 ) : error ? (
63 <MessageBox variant="danger">{error}</MessageBox>
64 ) : (
65 <div className="pageContainer shipPC">
66 <Helmet>
67 <title>Нарачка {orderId}</title>
68 </Helmet>
69 <h1 style={{ marginTop: "20px" }}>Нарачка {orderId}</h1>
70 <Row style={{ width: "90%" }}>
71 <Col md={8}>
72 <Card className="mb-3">
73 <Card.Body>
74 <Card.Title>Испорака</Card.Title>
75 <Card.Text>
76 <strong>Име:</strong> {order.shippingAddress.fullName}
77 <br />
78 <strong>Адреса:</strong> {order.shippingAddress.address},
79 {order.shippingAddress.city},{order.shippingAddress.postalCode},
80 {order.shippingAddress.country}
81 </Card.Text>
82 {order.isDelivered ? (
83 <MessageBox variant="success">
84 Доставено на {order.deliveredAt}
85 </MessageBox>
86 ) : order.isShipped ? (
87 <MessageBox variant="primary">
88 Вашата нарачка е испратена.
89 </MessageBox>
90 ) : order.isConfirmed ? (
91 <MessageBox variant="primary">
92 Вашата нарачка се процесира.
93 </MessageBox>
94 ) : (
95 <MessageBox variant="danger">
96 Потребно е да ја потврдите нарачката. Ќе бидете контактирани
97 преку телефонскиот број оставен за контакт.
98 </MessageBox>
99 )}
100 </Card.Body>
101 </Card>
102 <Card className="mb-3">
103 <Card.Body>
104 <Card.Title>Плаќање</Card.Title>
105 <Card.Text>
106 <strong>Начин:</strong>{" "}
107 {order.paymentMethod === "Karticka"
108 ? "Со платежна картичка"
109 : "Во готово при достава"}
110 </Card.Text>
111 {order.isPaid ? (
112 <MessageBox variant="success">
113 Платено на {order.paidAt}
114 </MessageBox>
115 ) : (
116 <MessageBox variant="danger">Не е платено</MessageBox>
117 )}
118 </Card.Body>
119 </Card>
120 <Card className="mb-3">
121 <Card.Body>
122 <Card.Title>Продукти</Card.Title>
123 <ListGroup variant="flush">
124 {order.orderItems.map((item) => (
125 <ListGroup.Item key={item._id}>
126 <div
127 style={{
128 display: "flex",
129 justifyContent: "space-between",
130 }}
131 >
132 <div style={{ display: "flex", alignItems: "center" }}>
133 <img
134 src={item.image}
135 alt={item.name}
136 className="img-fluid rounded img-thumbnail"
137 style={{ margin: "0px" }}
138 ></img>
139 <Link to={`/product/${item.slug}`}>{item.name}</Link>
140 </div>
141
142 <span>{item.quantity}</span>
143
144 <span>{item.price} ден</span>
145 </div>
146 </ListGroup.Item>
147 ))}
148 </ListGroup>
149 </Card.Body>
150 </Card>
151 </Col>
152 <Col md={4}>
153 <Card>
154 <Card.Body>
155 <Card.Title>Нарачка</Card.Title>
156 <ListGroup variant="flush">
157 <ListGroup.Item>
158 <Row>
159 <Col>Продукти:</Col>
160 <Col>{order.itemsPrice.toFixed(2)} ден</Col>
161 </Row>
162 </ListGroup.Item>
163 <ListGroup.Item>
164 <Row>
165 <Col>Испорака:</Col>
166 <Col>{order.shippingPrice.toFixed(2)} ден</Col>
167 </Row>
168 </ListGroup.Item>
169
170 <ListGroup.Item>
171 <Row>
172 <Col>
173 <strong>Вкупно</strong>
174 </Col>
175 <Col>
176 <strong>{order.totalPrice.toFixed(2)} ден</strong>
177 </Col>
178 </Row>
179 </ListGroup.Item>
180 </ListGroup>
181 </Card.Body>
182 </Card>
183 </Col>
184 </Row>
185 </div>
186 );
187}
Note: See TracBrowser for help on using the repository browser.