Skip to content

Commit c3e9076

Browse files
author
Duc Le
committed
Handle OnToggleTodoDone
1 parent 57af5f2 commit c3e9076

File tree

4 files changed

+44
-24
lines changed

4 files changed

+44
-24
lines changed

src/Todo.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ const Todo = () => {
5050
saveTodoItemsToLocalStorage('todo', newTodoItems)
5151
}, [todoItems])
5252

53+
const toggleTodoDoneHandler = useCallback(id => {
54+
const todo = todoItems.find(todoItem => todoItem.id === id)
55+
todo.isDone = !todo.isDone
56+
57+
// Update todoItems state
58+
setTodoItems([...todoItems])
59+
60+
// Save to localStorage
61+
saveTodoItemsToLocalStorage('todo', todoItems)
62+
63+
}, [todoItems])
64+
5365
return (
5466
<div className="todo">
5567
<h1>Todo</h1>
@@ -60,10 +72,11 @@ const Todo = () => {
6072

6173
<TodoList
6274
todoItems={todoItems} // Passing todoItems to TodoList
63-
onRemoveTodo={removeTodoHandler} // Passing addTodoHandler to TodoList
75+
onRemoveTodo={removeTodoHandler} // Passing removeTodoHandler to TodoList
76+
onToggleTodoDone={toggleTodoDoneHandler} // Passing toggleTodoDoneHandler to TodoList
6477
/>
6578
</div>
6679
);
6780
}
6881

69-
export default Todo;
82+
export default React.memo(Todo);

src/components/AddNewTodoForm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,4 @@ const AddNewTodoForm = ({ onAddTodo }) => {
5252
)
5353
};
5454

55-
export default AddNewTodoForm;
55+
export default React.memo(AddNewTodoForm);

src/components/TodoItem.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import React, { useCallback } from 'react';
22

3-
const TodoItem = ({ todo, id, onRemoveTodo }) => {
3+
const TodoItem = ({ todo, id, onRemoveTodo, onToggleTodoDone, isDone }) => {
44
const removeTodoHandler = useCallback(() => onRemoveTodo(id), [id, onRemoveTodo])
55

6+
const toggleTodoDoneHandler = useCallback(() => onToggleTodoDone(id), [id, onToggleTodoDone])
7+
68
return (
79
<li>
8-
<span>{todo}</span>
10+
<span style={{textDecoration: isDone ? 'line-through' : 'none'}}>{todo}</span>
911
<button onClick={removeTodoHandler}>Remove</button>
12+
<button onClick={toggleTodoDoneHandler}>{`Mark as ${isDone ? 'pending': 'done'}`}</button>
1013
</li>
1114
)
1215
};
1316

14-
export default TodoItem;
17+
export default React.memo(TodoItem);

src/components/TodoList.js

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,26 @@ import React from 'react';
33
// COMPONENT
44
import TodoItem from './TodoItem';
55

6-
const TodoList = ({ todoItems, onRemoveTodo }) => (
7-
<ul>
8-
{
9-
todoItems && // Check if todoItems exists
10-
Array.isArray(todoItems) && // Check if it's an array
11-
todoItems.length > 0 && // The array should not be empty
12-
todoItems.map(({ id, todo }) => ( // If all conditions are met, we render a list of todo items
13-
<TodoItem
14-
key={id}
15-
id={id}
16-
todo={todo}
17-
onRemoveTodo={onRemoveTodo}
18-
/>
19-
))
20-
}
21-
</ul>
22-
);
6+
const TodoList = ({ todoItems, onRemoveTodo, onToggleTodoDone }) => {
7+
return (
8+
<ul>
9+
{
10+
todoItems && // Check if todoItems exists
11+
Array.isArray(todoItems) && // Check if it's an array
12+
todoItems.length > 0 && // The array should not be empty
13+
todoItems.map(({ id, todo, isDone }) => ( // If all conditions are met, we render a list of todo items
14+
<TodoItem
15+
key={id}
16+
id={id}
17+
todo={todo}
18+
onRemoveTodo={onRemoveTodo}
19+
onToggleTodoDone={onToggleTodoDone}
20+
isDone={isDone}
21+
/>
22+
))
23+
}
24+
</ul>
25+
)
26+
};
2327

24-
export default TodoList;
28+
export default React.memo(TodoList);

0 commit comments

Comments
 (0)