# REDUX CART
### APRIL 29, 2020
- great job doing redux :clap:
- we can also seperate the redux logic in seperate `redux` folder
- the `action types` can be made in a seperate file
- you can also make a `root_reduer` to combine all the reducers, since there is only one reducer, it may be overkill too.
- you have done `store` code in `App.js` it is better to keep it at a different file, its a better practice.
- in `action.js` there is only one action to remove item but redux dev tools shows other actions too, how is it working
- Oh i see. you put other actions in `CartItem.js` directly in `mapStateToProps`
- little shortcut
```jsx=
function mapStateToProps(store) {
const { cart, total } = store
return { cart, total }
}
```
can be written as
```json=
const mapStateToProps = ({ cart, total }) => ({ cart, total })
```
# TODO APP
## BACKEND
### APRIL 24, 2020
- great project nice :clap: :clap:
### APRIL 23, 2020
- you may have forgotten to use doten. you have made `.env` file but you are not registering it in the node app. you can do this by adding `require('dotenv').config()` at the top of entrypoing, in this case `server.js`
- the best practice is not to push the `.env` file to github. so you may want to `.gitignore` it
- you are using local mongodb so thats okay to include the mongo URI hardcoded, but while using [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) you may also want to put it in the `.env` file
- try using es6 features, you know its a new thing 😉
- I saw that you are using `callback` for router callbacks, you can also consider using `async`-`await` syntax for more code readablity too. but this is also good :smile:
### APRIL 22, 2020
- following best practices by organising code like in MVC format
- you may not want to include your node_modules folder to the github
- you can check this out [dotenv](https://www.npmjs.com/package/dotenv) for using `.env` configuration
- in `todo-router.js`
you forgot to import `express` 😉
```js
module.exports = todoRouter.route('/').get(function (req, res) {
Todo.find(function (err, todos) {
if (err) {
console.log(err)
} else {
res.json(todos)
}
})
})
```
you have done `module.exports = object.key1`
and also `module.exports = object.key2`
what we can also do is
```
object.key1
object.key2
module.exports=object
```
- you dont have to do `todoRouter.route('/').get(callback)`
- you can simply do `todoRouter.get('/',callback)`
- in `todo.model.js`
while defining schema you may want to specify some required fields too like
```js
description: {
type: String,
required:true,
},
```
if there is only need of type property in the object then you can do
```js
description: String
```
## FRONTEND
### APRIL 24, 2020
- after creating todo, the app navigates to homepage, but shows old todo values, it would be better to load new values when going to that page
- Looks like delete button is missing :wink:
- good job :+1: :+1: :100:
### APRIL 23, 2020
- in `todos.component.jsx` you have used `props.todo.something`
- you can do it like this also
```jsx=
export default function Todo({todo:{_id,description,responsible,priority}}) {
return (
<tr>
<td>{description}</td>
<td>{responsible}</td>
<td>{priority}</td>
<td>
<Link to={`/edit/${_id}`}>Edit</Link>
</td>
</tr>
);
}
```
I have destructered the props here. You may check about destructuring [here](https://www.youtube.com/watch?v=_ApRMRGI-6g)
### APRIL 22, 2020
- you can also extract the navbar to different component
- nice you read articles from [Coding Smart Way](https://codingthesmartway.com),nice website
- Nice use or _exact_ you can also check this article from stackoverflow [stackoverflow](https://stackoverflow.com/questions/49162311/react-difference-between-route-exact-path-and-route-path)
- I see that you have used `.bind()` to bind the `this` value
- binding is not necessary with the use of es6 arrow funcitons
```js
onSubmit(e) {
e.preventDefault()
console.log('Form Submitted')
console.log(`TODO Description: ${this.state.description}`)
console.log(`TODO Responsible: ${this.state.responsible}`)
console.log(`TODO Priority: ${this.state.priority}`)
this.setState({
priority: '',
description: '',
responsible: '',
completed: false,
})
}
```
this code could be replaced with
```js
onSubmit = e => {
e.preventDefault()
console.log('Form Submitted')
console.log(`TODO Description: ${this.state.description}`)
console.log(`TODO Responsible: ${this.state.responsible}`)
console.log(`TODO Priority: ${this.state.priority}`)
this.setState({
priority: '',
description: '',
responsible: '',
completed: false,
})
}
```
and there will be no need of binding `this`
- like I have said using arrow functions reduces from binding `this`
you can see why use arrow function and whats the need of binding from [here](https://www.codementor.io/@dariogarciamoya/understanding-this-in-javascript-with-arrow-functions-gcpjwfyuc)
- in `create-todo.component.jsx`
```js
onChangeTodoDescription(e) {
this.setState({
description: e.target.value,
});
}
onChangeTodoResponsible(e) {
this.setState({
responsible: e.target.value,
});
}
onChangeTodoPriority(e) {
this.setState({
priority: e.target.value,
});
}
```
all the code above can be replaced with single function
```js
onFormFieldChange = e => {
this.setState({
[e.target.name]: e.target.value,
})
}
```
you can learn more about dynamic object casting from [here](https://www.samanthaming.com/tidbits/37-dynamic-property-name-with-es6/)
- in `edit-todo.component.jsx` since you are just returning `jsx` we can simply use a functional component
```js
export default () => {
return (
<div>
<p>Welcome to Edit Todo Component!!</p>
</div>
)
}
```
- same in `todos-list.component.jsx`
```js
const youDidFantasticWork = () => {
console.log('Proud of you 💗 ')
}
```