Skip to content

Commit 3d66fcf

Browse files
authored
Video 41 deliver order (basir#41)
* Video-40-Admin-Orders * Video-41-Deliver-Order
1 parent 98cf7a7 commit 3d66fcf

File tree

5 files changed

+63
-3
lines changed

5 files changed

+63
-3
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ Feel free to take a look at the course preview and enroll if it is along with yo
346346
4. list them in the screen
347347
5. show delete and edit button
348348
6. redirect to order details on edit action
349-
41. Edit Order
349+
41. Deliver Order
350350
1. if order is payed show deliver button for admin
351351
2. handle click on deliver button
352352
3. set state to delivered

backend/routers/orderRouter.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,20 @@ orderRouter.put(
8888
}
8989
})
9090
);
91+
92+
orderRouter.put(
93+
'/:id/deliver',
94+
isAuth,
95+
expressAsyncHandler(async (req, res) => {
96+
const order = await Order.findById(req.params.id);
97+
if (order) {
98+
order.isDelivered = true;
99+
order.deliveredAt = Date.now();
100+
const updatedOrder = await order.save();
101+
res.send({ message: 'Order Delivered', order: updatedOrder });
102+
} else {
103+
res.status(404).send({ message: 'Order Not Found.' });
104+
}
105+
})
106+
);
91107
export default orderRouter;

frontend/src/api.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,3 +320,22 @@ export const payOrder = async (orderId, paymentResult) => {
320320
return { error: err.response ? err.response.data.message : err.message };
321321
}
322322
};
323+
export const deliverOrder = async (orderId) => {
324+
try {
325+
const { token } = getUserInfo();
326+
const response = await axios({
327+
url: `${apiUrl}/api/orders/${orderId}/deliver`,
328+
method: 'PUT',
329+
headers: {
330+
'Content-Type': 'application/json',
331+
Authorization: `Bearer ${token}`,
332+
},
333+
});
334+
if (response.statusText !== 'OK') {
335+
throw new Error(response.data.message);
336+
}
337+
return response.data;
338+
} catch (err) {
339+
return { error: err.response ? err.response.data.message : err.message };
340+
}
341+
};

frontend/src/srceens/OrderListScreen.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ const OrderListScreen = {
1919
}
2020
});
2121
});
22+
const editButtons = document.getElementsByClassName('edit-button');
23+
Array.from(editButtons).forEach((editButton) => {
24+
editButton.addEventListener('click', async () => {
25+
document.location.hash = `/order/${editButton.id}`;
26+
});
27+
});
2228
},
2329
render: async () => {
2430
const orders = await getOrders();

frontend/src/srceens/OrderScreen.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import {
55
showMessage,
66
rerender,
77
} from '../utils';
8-
import { getOrder, getPaypalClientId, payOrder } from '../api';
8+
import { getOrder, getPaypalClientId, payOrder, deliverOrder } from '../api';
9+
import { getUserInfo } from '../localStorage';
910

1011
const addPaypalSdk = async (totalPrice) => {
1112
const clientId = await getPaypalClientId();
@@ -70,8 +71,20 @@ const handlePayment = (clientId, totalPrice) => {
7071
});
7172
};
7273
const OrderScreen = {
73-
after_render: async () => {},
74+
after_render: async () => {
75+
const request = parseRequestUrl();
76+
document
77+
.getElementById('deliver-order-button')
78+
.addEventListener('click', async () => {
79+
showLoading();
80+
await deliverOrder(request.id);
81+
hideLoading();
82+
showMessage('Order Delivered.');
83+
rerender(OrderScreen);
84+
});
85+
},
7486
render: async () => {
87+
const { isAdmin } = getUserInfo();
7588
const request = parseRequestUrl();
7689
const {
7790
_id,
@@ -157,6 +170,12 @@ const OrderScreen = {
157170
<li class="total"><div>Order Total</div><div>$${totalPrice}</div></li>
158171
<li><div class="fw" id="paypal-button"></div></li>
159172
<li>
173+
${
174+
isPaid && !isDelivered && isAdmin
175+
? `<button id="deliver-order-button" class="primary fw">Deliver Order</button>`
176+
: ''
177+
}
178+
<li>
160179
161180
</div>
162181
</div>

0 commit comments

Comments
 (0)