Skip to content

Commit 9b0829d

Browse files
authored
Video-24-Register-Screen (basir#24)
1 parent a958a38 commit 9b0829d

File tree

5 files changed

+147
-21
lines changed

5 files changed

+147
-21
lines changed

README.md

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -216,75 +216,84 @@ 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. Register Screen Action
220-
1. after_render handle form submit
221-
2. create register request in frontend
222-
3. create register api in backend
223-
25. Create Checkout Wizard Header Component
219+
24. Register Screen
220+
1. create RegisterScreen.js
221+
2. add form elements
222+
3. after_render handle form submit
223+
4. create register request in frontend
224+
5. create register api in backend
225+
25. User Profile Screen
226+
1. create ProfileScreen.js
227+
2. add form elements
228+
3. after_render handle form submit
229+
4. create profile update request in frontend
230+
5. create profile update api in backend
231+
6. implement sign out
232+
26. Create Checkout Wizard Header Component
224233
1. create component
225234
2. style component
226-
26. Shipping Screen
235+
27. Shipping Screen
227236
1. create ShippingScreen.js
228237
2. style elements
229238
3. handle form submit
230-
27. Payment Screen
239+
28. Payment Screen
231240
1. create PaymentScreen.js
232241
2. style elements
233242
3. handle form submit
234-
28. PlaceOrder Screen UI
243+
29. PlaceOrder Screen UI
235244
1. create PlaceOrder.js
236245
2. style elements
237-
29. PlaceOrder Screen Action
246+
30. PlaceOrder Screen Action
238247
1. handle form submit
239248
2. create backend api to create order
240-
30. Order Screen
249+
31. Order Screen
241250
1. create OrderScreen.js
242251
2. style elements
243-
31. PayPal Payment
252+
32. PayPal Payment
244253
1. add paypal checkout script
245254
2. show paypal button
246255
3. update order after payment
247-
32. User Profile UI
256+
33. User Profile UI
248257
1. create ProfileScreen.js
249258
2. style elements
250-
33. User Profile Data
259+
34. User Profile Data
251260
1. Create profile info backend api
252261
2. Create user orders api
253262
3. Call apis in the backend
254-
34. Update Profile
263+
35. Update Profile
255264
1. handle form submit
256265
2. send request to backend
257266
3. create api to update profile
258-
35. Admin Products UI
267+
36. Admin Products UI
259268
1. create Admin Order menu in header
260269
2. create ProductListScreen.js
261270
3. show products with edit and delete button
262271
4. show create product button
263272
5. implement create product backend
264273
6. redirect user to edit product screen
265-
36. Edit Product
274+
37. Edit Product
266275
1. create ProductListScreen.js
267276
2. load product data from backend
268277
3. handle form submit
269278
4. save product in backend
270-
37. Delete Product
279+
38. Delete Product
271280
1. update ProductListScreen.js
272281
2. handle delete button
273282
3. rerender after deletion
274-
38. Admin Orders
283+
39. Admin Orders
275284
1. create Admin Order menu in header
276285
2. create AdminOrder.js
277286
3. load orders from backend
278287
4. list them in the screen
279288
5. show delete and edit button
280289
6. redirect to order details on edit action
281-
39. Edit Order
290+
40. Edit Order
282291
1. if order is payed show deliver button for admin
283292
2. handle click on deliver button
284293
3. set state to delivered
285-
40. Delete Order
294+
41. Delete Order
286295
1. update OrderListScreen.js
287296
2. handle delete button
288297
3. rerender after deletion
289-
41. Publish heroku
298+
42. Publish heroku
290299
1. publish steps

backend/routers/userRouter.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,28 @@ userRouter.post(
4444
}
4545
})
4646
);
47+
userRouter.post(
48+
'/register',
49+
expressAsyncHandler(async (req, res) => {
50+
const user = new User({
51+
name: req.body.name,
52+
email: req.body.email,
53+
password: req.body.password,
54+
});
55+
const createdUser = await user.save();
56+
if (!createdUser) {
57+
res.status(401).send({
58+
message: 'Invalid User Data',
59+
});
60+
} else {
61+
res.send({
62+
_id: createdUser._id,
63+
name: createdUser.name,
64+
email: createdUser.email,
65+
isAdmin: createdUser.isAdmin,
66+
token: generateToken(createdUser),
67+
});
68+
}
69+
})
70+
);
4771
export default userRouter;

frontend/src/api.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,26 @@ export const signin = async ({ email, password }) => {
4141
return { error: err.response.data.message || err.message };
4242
}
4343
};
44+
export const register = async ({ name, email, password }) => {
45+
try {
46+
const response = await axios({
47+
url: `${apiUrl}/api/users/register`,
48+
method: 'POST',
49+
header: {
50+
'Content-Type': 'application/json',
51+
},
52+
data: {
53+
name,
54+
email,
55+
password,
56+
},
57+
});
58+
if (response.statusText !== 'OK') {
59+
throw new Error(response.data.message);
60+
}
61+
return response.data;
62+
} catch (err) {
63+
console.log(err);
64+
return { error: err.response.data.message || err.message };
65+
}
66+
};

frontend/src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import Error404Screen from './srceens/Error404Screen';
55
import CartScreen from './srceens/CartScreen';
66
import SigninScreen from './srceens/SigninScreen';
77
import Header from './components/Header';
8+
import RegisterScreen from './srceens/RegisterScreen';
89

910
const routes = {
1011
'/': HomeScreen,
1112
'/product/:id': ProductScreen,
1213
'/cart/:id': CartScreen,
1314
'/cart': CartScreen,
1415
'/signin': SigninScreen,
16+
'/register': RegisterScreen,
1517
};
1618
const router = async () => {
1719
showLoading();
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { register } from '../api';
2+
import { getUserInfo, setUserInfo } from '../localStorage';
3+
import { showLoading, hideLoading, showMessage } from '../utils';
4+
5+
const RegisterScreen = {
6+
after_render: () => {
7+
document
8+
.getElementById('register-form')
9+
.addEventListener('submit', async (e) => {
10+
e.preventDefault();
11+
showLoading();
12+
const data = await register({
13+
name: document.getElementById('name').value,
14+
email: document.getElementById('email').value,
15+
password: document.getElementById('password').value,
16+
});
17+
hideLoading();
18+
if (data.error) {
19+
showMessage(data.error);
20+
} else {
21+
setUserInfo(data);
22+
document.location.hash = '/';
23+
}
24+
});
25+
},
26+
render: () => {
27+
if (getUserInfo().name) {
28+
document.location.hash = '/';
29+
}
30+
return `
31+
<div class="form-container">
32+
<form id="register-form">
33+
<ul class="form-items">
34+
<li>
35+
<h1>Create Account</h1>
36+
</li>
37+
<li>
38+
<label for="name">Name</label>
39+
<input type="name" name="name" id="name" />
40+
</li>
41+
<li>
42+
<label for="email">Email</label>
43+
<input type="email" name="email" id="email" />
44+
</li>
45+
<li>
46+
<label for="password">Password</label>
47+
<input type="password" name="password" id="password" />
48+
</li>
49+
<li>
50+
<label for="repassword">Re-Enter Password</label>
51+
<input type="password" name="repassword" id="repassword" />
52+
</li>
53+
<li>
54+
<button type="submit" class="primary">Register</button>
55+
</li>
56+
<li>
57+
<div>
58+
Already have an account?
59+
<a href="/#/signin">Sign-In </a>
60+
</div>
61+
</li>
62+
</ul>
63+
</form>
64+
</div>
65+
`;
66+
},
67+
};
68+
export default RegisterScreen;

0 commit comments

Comments
 (0)