Skip to content

Commit 566a582

Browse files
authored
Video-18-Cart-Screen-Actions (basir#18)
1 parent 076b827 commit 566a582

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

frontend/src/srceens/CartScreen.js

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,53 @@
1-
import { parseRequestUrl } from '../utils';
1+
/* eslint-disable no-use-before-define */
2+
import { parseRequestUrl, rerender } from '../utils';
23
import { getProduct } from '../api';
34
import { getCartItems, setCartItems } from '../localStorage';
45

56
const addToCart = (item, forceUpdate = false) => {
67
let cartItems = getCartItems();
78
const existItem = cartItems.find((x) => x.product === item.product);
89
if (existItem) {
9-
cartItems = cartItems.map((x) =>
10-
x.product === existItem.product ? item : x
11-
);
10+
if (forceUpdate) {
11+
cartItems = cartItems.map((x) =>
12+
x.product === existItem.product ? item : x
13+
);
14+
}
1215
} else {
1316
cartItems = [...cartItems, item];
1417
}
1518
setCartItems(cartItems);
19+
if (forceUpdate) {
20+
rerender(CartScreen);
21+
}
22+
};
23+
const removeFromCart = (id) => {
24+
setCartItems(getCartItems().filter((x) => x.product !== id));
25+
if (id === parseRequestUrl().id) {
26+
document.location.hash = '/cart';
27+
} else {
28+
rerender(CartScreen);
29+
}
1630
};
1731

1832
const CartScreen = {
19-
after_render: () => {},
33+
after_render: () => {
34+
const qtySelects = document.getElementsByClassName('qty-select');
35+
Array.from(qtySelects).forEach((qtySelect) => {
36+
qtySelect.addEventListener('change', (e) => {
37+
const item = getCartItems().find((x) => x.product === qtySelect.id);
38+
addToCart({ ...item, qty: Number(e.target.value) }, true);
39+
});
40+
});
41+
const deleteButtons = document.getElementsByClassName('delete-button');
42+
Array.from(deleteButtons).forEach((deleteButton) => {
43+
deleteButton.addEventListener('click', () => {
44+
removeFromCart(deleteButton.id);
45+
});
46+
});
47+
document.getElementById('checkout-button').addEventListener('click', () => {
48+
document.location.hash = '/signin';
49+
});
50+
},
2051
render: async () => {
2152
const request = parseRequestUrl();
2253
if (request.id) {
@@ -58,9 +89,16 @@ const CartScreen = {
5889
<div>
5990
Qty:
6091
<select class="qty-select" id="${item.product}">
61-
<option value="1">1</option>
92+
${[...Array(item.countInStock).keys()].map((x) =>
93+
item.qty === x + 1
94+
? `<option selected value="${x + 1}">${x + 1}</option>`
95+
: `<option value="${x + 1}">${x + 1}</option>`
96+
)}
97+
6298
</select>
63-
<button type="button" class="delete-button" id="${item.product}">
99+
<button type="button" class="delete-button" id="${
100+
item.product
101+
}">
64102
Delete
65103
</button>
66104
</div>

frontend/src/utils.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ export const parseRequestUrl = () => {
77
action: request[3],
88
};
99
};
10+
export const rerender = async (component) => {
11+
document.getElementById(
12+
'main-container'
13+
).innerHTML = await component.render();
14+
await component.after_render();
15+
};

0 commit comments

Comments
 (0)