Skip to content

Commit a958a38

Browse files
authored
Video-23-Create-Progress-Indicator (#23)
1 parent 30afc98 commit a958a38

8 files changed

Lines changed: 86 additions & 25 deletions

File tree

README.md

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -216,79 +216,75 @@ JS AMAZONA
216216
12. button id message-overlay-close-button OK
217217
13. add class active to it
218218
14. add event listener for button to call callback
219-
24. Create Header Component
220-
1. update index.html
221-
2. add header render and after render to router function
222-
3. show header menu based on user logged in or not
223-
25. Register Screen Action
219+
24. Register Screen Action
224220
1. after_render handle form submit
225221
2. create register request in frontend
226222
3. create register api in backend
227-
26. Create Checkout Wizard Header Component
223+
25. Create Checkout Wizard Header Component
228224
1. create component
229225
2. style component
230-
27. Shipping Screen
226+
26. Shipping Screen
231227
1. create ShippingScreen.js
232228
2. style elements
233229
3. handle form submit
234-
28. Payment Screen
230+
27. Payment Screen
235231
1. create PaymentScreen.js
236232
2. style elements
237233
3. handle form submit
238-
29. PlaceOrder Screen UI
234+
28. PlaceOrder Screen UI
239235
1. create PlaceOrder.js
240236
2. style elements
241-
30. PlaceOrder Screen Action
237+
29. PlaceOrder Screen Action
242238
1. handle form submit
243239
2. create backend api to create order
244-
31. Order Screen
240+
30. Order Screen
245241
1. create OrderScreen.js
246242
2. style elements
247-
32. PayPal Payment
243+
31. PayPal Payment
248244
1. add paypal checkout script
249245
2. show paypal button
250246
3. update order after payment
251-
33. User Profile UI
247+
32. User Profile UI
252248
1. create ProfileScreen.js
253249
2. style elements
254-
34. User Profile Data
250+
33. User Profile Data
255251
1. Create profile info backend api
256252
2. Create user orders api
257253
3. Call apis in the backend
258-
35. Update Profile
254+
34. Update Profile
259255
1. handle form submit
260256
2. send request to backend
261257
3. create api to update profile
262-
36. Admin Products UI
258+
35. Admin Products UI
263259
1. create Admin Order menu in header
264260
2. create ProductListScreen.js
265261
3. show products with edit and delete button
266262
4. show create product button
267263
5. implement create product backend
268264
6. redirect user to edit product screen
269-
37. Edit Product
265+
36. Edit Product
270266
1. create ProductListScreen.js
271267
2. load product data from backend
272268
3. handle form submit
273269
4. save product in backend
274-
38. Delete Product
270+
37. Delete Product
275271
1. update ProductListScreen.js
276272
2. handle delete button
277273
3. rerender after deletion
278-
39. Admin Orders
274+
38. Admin Orders
279275
1. create Admin Order menu in header
280276
2. create AdminOrder.js
281277
3. load orders from backend
282278
4. list them in the screen
283279
5. show delete and edit button
284280
6. redirect to order details on edit action
285-
40. Edit Order
281+
39. Edit Order
286282
1. if order is payed show deliver button for admin
287283
2. handle click on deliver button
288284
3. set state to delivered
289-
41. Delete Order
285+
40. Delete Order
290286
1. update OrderListScreen.js
291287
2. handle delete button
292288
3. rerender after deletion
293-
42. Publish heroku
289+
41. Publish heroku
294290
1. publish steps

frontend/index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
<title>JS Amazona</title>
1212
</head>
1313
<body>
14+
<div class="overlay" id="loading-overlay">Loading...</div>
15+
<div class="overlay" id="message-overlay"></div>
1416
<div class="grid-container">
1517
<header id="header-container"></header>
1618
<main id="main-container"></main>

frontend/src/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import HomeScreen from './srceens/HomeScreen';
22
import ProductScreen from './srceens/ProductScreen';
3-
import { parseRequestUrl } from './utils';
3+
import { parseRequestUrl, showLoading, hideLoading } from './utils';
44
import Error404Screen from './srceens/Error404Screen';
55
import CartScreen from './srceens/CartScreen';
66
import SigninScreen from './srceens/SigninScreen';
@@ -14,6 +14,7 @@ const routes = {
1414
'/signin': SigninScreen,
1515
};
1616
const router = async () => {
17+
showLoading();
1718
const request = parseRequestUrl();
1819
const parseUrl =
1920
(request.resource ? `/${request.resource}` : '/') +
@@ -26,6 +27,7 @@ const router = async () => {
2627
const main = document.getElementById('main-container');
2728
main.innerHTML = await screen.render();
2829
await screen.after_render();
30+
hideLoading();
2931
};
3032
window.addEventListener('load', router);
3133
window.addEventListener('hashchange', router);

frontend/src/srceens/HomeScreen.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import axios from 'axios';
22
import Rating from '../components/Rating';
3+
import { hideLoading, showLoading } from '../utils';
34

45
const HomeScreen = {
56
render: async () => {
7+
showLoading();
68
const response = await axios({
79
url: 'http://localhost:5000/api/products',
810
headers: {
911
'Content-Type': 'application/json',
1012
},
1113
});
14+
hideLoading();
1215
if (!response || response.statusText !== 'OK') {
1316
return '<div>Error in getting data</div>';
1417
}

frontend/src/srceens/ProductScreen.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { parseRequestUrl } from '../utils';
1+
import { parseRequestUrl, showLoading, hideLoading } from '../utils';
22
import { getProduct } from '../api';
33
import Rating from '../components/Rating';
44

@@ -11,10 +11,12 @@ const ProductScreen = {
1111
},
1212
render: async () => {
1313
const request = parseRequestUrl();
14+
showLoading();
1415
const product = await getProduct(request.id);
1516
if (product.error) {
1617
return `<div>${product.error}</div>`;
1718
}
19+
hideLoading();
1820
return `
1921
<div class="content">
2022
<div class="back-to-result">

frontend/src/srceens/SigninScreen.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import { signin } from '../api';
22
import { getUserInfo, setUserInfo } from '../localStorage';
3+
import { showLoading, hideLoading, showMessage } from '../utils';
34

45
const SigninScreen = {
56
after_render: () => {
67
document
78
.getElementById('signin-form')
89
.addEventListener('submit', async (e) => {
910
e.preventDefault();
11+
showLoading();
1012
const data = await signin({
1113
email: document.getElementById('email').value,
1214
password: document.getElementById('password').value,
1315
});
16+
hideLoading();
1417
if (data.error) {
15-
alert(data.error);
18+
showMessage(data.error);
1619
} else {
1720
setUserInfo(data);
1821
document.location.hash = '/';

frontend/src/utils.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,28 @@ export const rerender = async (component) => {
1313
).innerHTML = await component.render();
1414
await component.after_render();
1515
};
16+
17+
export const showLoading = () => {
18+
document.getElementById('loading-overlay').classList.add('active');
19+
};
20+
21+
export const hideLoading = () => {
22+
document.getElementById('loading-overlay').classList.remove('active');
23+
};
24+
export const showMessage = (message, callback) => {
25+
document.getElementById('message-overlay').innerHTML = `
26+
<div>
27+
<div id="message-overlay-content">${message}</div>
28+
<button id="message-overlay-close-button">OK</button>
29+
</div>
30+
`;
31+
document.getElementById('message-overlay').classList.add('active');
32+
document
33+
.getElementById('message-overlay-close-button')
34+
.addEventListener('click', () => {
35+
document.getElementById('message-overlay').classList.remove('active');
36+
if (callback) {
37+
callback();
38+
}
39+
});
40+
};

frontend/style.css

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,34 @@ button:hover {
3333
button.primary {
3434
background-color: #f0c040;
3535
}
36+
.overlay {
37+
display: none;
38+
position: fixed;
39+
z-index: 1000;
40+
top: 0;
41+
left: 0;
42+
width: 100%;
43+
height: 100%;
44+
background-color: rgba(16, 16, 16, 0.5);
45+
}
46+
.overlay.active {
47+
display: flex;
48+
justify-content: center;
49+
align-items: center;
50+
color: #ffffff;
51+
}
52+
.overlay > div {
53+
background-color: #ffffff;
54+
color: #000000;
55+
border-radius: 0.5rem;
56+
display: flex;
57+
flex-direction: column;
58+
justify-content: space-around;
59+
max-width: 40rem;
60+
}
61+
.overlay > div > * {
62+
margin: 2rem;
63+
}
3664
.fw {
3765
width: 100%;
3866
}

0 commit comments

Comments
 (0)