Skip to content

Commit 585c803

Browse files
authored
Video 29 order screen (basir#29)
* Video-29-Order-Screen * Video-29-Order-Screen
1 parent eb77483 commit 585c803

File tree

5 files changed

+132
-2
lines changed

5 files changed

+132
-2
lines changed

backend/routers/orderRouter.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,18 @@ import { isAuth } from '../utils';
44
import Order from '../models/orderModel';
55

66
const orderRouter = express.Router();
7-
7+
orderRouter.get(
8+
'/:id',
9+
isAuth,
10+
expressAsyncHandler(async (req, res) => {
11+
const order = await Order.findById(req.params.id);
12+
if (order) {
13+
res.send(order);
14+
} else {
15+
res.status(404).send({ message: 'Order Not Found' });
16+
}
17+
})
18+
);
819
orderRouter.post(
920
'/',
1021
isAuth,
@@ -15,12 +26,13 @@ orderRouter.post(
1526
shipping: req.body.shipping,
1627
payment: req.body.payment,
1728
itemsPrice: req.body.itemsPrice,
18-
taxtPrice: req.body.taxtPrice,
29+
taxPrice: req.body.taxPrice,
1930
shippingPrice: req.body.shippingPrice,
2031
totalPrice: req.body.totalPrice,
2132
});
2233
const createdOrder = await order.save();
2334
res.status(201).send({ message: 'New Order Created', order: createdOrder });
2435
})
2536
);
37+
2638
export default orderRouter;

frontend/src/api.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,21 @@ export const createOrder = async (order) => {
110110
return { error: err.response ? err.response.data.message : err.message };
111111
}
112112
};
113+
export const getOrder = async (id) => {
114+
try {
115+
const { token } = getUserInfo();
116+
const response = await axios({
117+
url: `${apiUrl}/api/orders/${id}`,
118+
headers: {
119+
'Content-Type': 'application/json',
120+
Authorization: `Bearer ${token}`,
121+
},
122+
});
123+
if (response.statusText !== 'OK') {
124+
throw new Error(response.data.message);
125+
}
126+
return response.data;
127+
} catch (err) {
128+
return { error: err.message };
129+
}
130+
};

frontend/src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import ProfileScreen from './srceens/ProfileScreen';
1010
import ShippingScreen from './srceens/ShippingScreen';
1111
import PaymentScreen from './srceens/PaymentScreen';
1212
import PlaceOrderScreen from './srceens/PlaceOrderScreen';
13+
import OrderScreen from './srceens/OrderScreen';
1314

1415
const routes = {
1516
'/': HomeScreen,
1617
'/product/:id': ProductScreen,
18+
'/order/:id': OrderScreen,
1719
'/cart/:id': CartScreen,
1820
'/cart': CartScreen,
1921
'/signin': SigninScreen,
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { parseRequestUrl } from '../utils';
2+
import { getOrder } from '../api';
3+
4+
const OrderScreen = {
5+
after_render: async () => {},
6+
render: async () => {
7+
const request = parseRequestUrl();
8+
const {
9+
_id,
10+
shipping,
11+
payment,
12+
orderItems,
13+
itemsPrice,
14+
shippingPrice,
15+
taxPrice,
16+
totalPrice,
17+
isDelivered,
18+
deliveredAt,
19+
isPaid,
20+
paidAt,
21+
} = await getOrder(request.id);
22+
return `
23+
<div>
24+
<h1>Order ${_id}</h1>
25+
<div class="order">
26+
<div class="order-info">
27+
<div>
28+
<h2>Shipping</h2>
29+
<div>
30+
${shipping.address}, ${shipping.city}, ${shipping.postalCode},
31+
${shipping.country}
32+
</div>
33+
${
34+
isDelivered
35+
? `<div class="success">Delivered at ${deliveredAt}</div>`
36+
: `<div class="error">Not Delivered</div>`
37+
}
38+
39+
</div>
40+
<div>
41+
<h2>Payment</h2>
42+
<div>
43+
Payment Method : ${payment.paymentMethod}
44+
</div>
45+
${
46+
isPaid
47+
? `<div class="success">Paid at ${paidAt}</div>`
48+
: `<div class="error">Not Paid</div>`
49+
}
50+
</div>
51+
<div>
52+
<ul class="cart-list-container">
53+
<li>
54+
<h2>Shopping Cart</h2>
55+
<div>Price</div>
56+
</li>
57+
${orderItems
58+
.map(
59+
(item) => `
60+
<li>
61+
<div class="cart-image">
62+
<img src="${item.image}" alt="${item.name}" />
63+
</div>
64+
<div class="cart-name">
65+
<div>
66+
<a href="/#/product/${item.product}">${item.name} </a>
67+
</div>
68+
<div> Qty: ${item.qty} </div>
69+
</div>
70+
<div class="cart-price"> $${item.price}</div>
71+
</li>
72+
`
73+
)
74+
.join('\n')}
75+
</ul>
76+
</div>
77+
</div>
78+
<div class="order-action">
79+
<ul>
80+
<li>
81+
<h2>Order Summary</h2>
82+
</li>
83+
<li><div>Items</div><div>$${itemsPrice}</div></li>
84+
<li><div>Shipping</div><div>$${shippingPrice}</div></li>
85+
<li><div>Tax</div><div>$${taxPrice}</div></li>
86+
<li class="total"><div>Order Total</div><div>$${totalPrice}</div></li>
87+
<li>
88+
89+
</div>
90+
</div>
91+
</div>
92+
`;
93+
},
94+
};
95+
export default OrderScreen;

frontend/style.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,9 @@ footer {
322322
.order-info > div:first-child {
323323
margin-top: 0;
324324
}
325+
.order-info > div > div {
326+
padding: 1rem;
327+
}
325328
.order-action {
326329
flex: 1 1 20rem;
327330
border: 0.1rem #c0c0c0 solid;

0 commit comments

Comments
 (0)