Skip to content

Commit 933eff9

Browse files
author
Duc Le
committed
Handle onEditTodo
1 parent c3e9076 commit 933eff9

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

src/Todo.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const Todo = () => {
3737

3838
// Save to localStorage
3939
saveTodoItemsToLocalStorage('todo', newTodoItems)
40+
console.log(newTodoItems)
4041
}, [todoItems]) // Dependencies list for useCallback
4142

4243
const removeTodoHandler = useCallback(id => {
@@ -62,18 +63,30 @@ const Todo = () => {
6263

6364
}, [todoItems])
6465

66+
const editTodoHandler = useCallback((id, todo) => {
67+
const editingTodo = todoItems.find(todoItem => todoItem.id === id)
68+
editingTodo.todo = todo
69+
// Update todoItems state
70+
setTodoItems([...todoItems])
71+
72+
// Save to localStorage
73+
saveTodoItemsToLocalStorage('todo', todoItems)
74+
75+
}, [todoItems])
76+
6577
return (
6678
<div className="todo">
6779
<h1>Todo</h1>
6880

6981
<AddNewTodoForm
70-
onAddTodo={addTodoHandler} // Passing addTodoHandler to AddNewTodoForm
82+
onAddTodo={addTodoHandler} // Passing down addTodoHandler
7183
/>
7284

7385
<TodoList
74-
todoItems={todoItems} // Passing todoItems to TodoList
75-
onRemoveTodo={removeTodoHandler} // Passing removeTodoHandler to TodoList
76-
onToggleTodoDone={toggleTodoDoneHandler} // Passing toggleTodoDoneHandler to TodoList
86+
todoItems={todoItems} // Passing down todoItems
87+
onRemoveTodo={removeTodoHandler} // Passing down removeTodoHandler
88+
onToggleTodoDone={toggleTodoDoneHandler} // Passing down toggleTodoDoneHandler
89+
onEditTodo={editTodoHandler} // Passing down editTodoHandler
7790
/>
7891
</div>
7992
);

src/components/TodoItem.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
11
import React, { useCallback } from 'react';
22

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

66
const toggleTodoDoneHandler = useCallback(() => onToggleTodoDone(id), [id, onToggleTodoDone])
7+
const editTodoHandler = useCallback(event => {
8+
if (event.keyCode === 13) { // Detect ENTER key down
9+
event.preventDefault(); // Prevent adding a new line because it's supposed to be single line
10+
onEditTodo(id, event.target.value);
11+
event.target.blur(); // Make the current input lost focus after finishing onEditTodo
12+
}
13+
}, [id, onEditTodo])
714

815
return (
916
<li>
10-
<span style={{textDecoration: isDone ? 'line-through' : 'none'}}>{todo}</span>
17+
<input
18+
defaultValue={todo} // innerHTML of the editable div
19+
disabled={false} // use true to disable editing
20+
onKeyDown={editTodoHandler} // handle innerHTML change
21+
tagName='span' // Use a custom HTML tag (uses a div by default)
22+
style={{textDecoration: isDone ? 'line-through' : 'none'}}
23+
/>
1124
<button onClick={removeTodoHandler}>Remove</button>
1225
<button onClick={toggleTodoDoneHandler}>{`Mark as ${isDone ? 'pending': 'done'}`}</button>
1326
</li>

src/components/TodoList.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react';
33
// COMPONENT
44
import TodoItem from './TodoItem';
55

6-
const TodoList = ({ todoItems, onRemoveTodo, onToggleTodoDone }) => {
6+
const TodoList = ({ todoItems, onRemoveTodo, onToggleTodoDone, onEditTodo }) => {
77
return (
88
<ul>
99
{
@@ -17,6 +17,7 @@ const TodoList = ({ todoItems, onRemoveTodo, onToggleTodoDone }) => {
1717
todo={todo}
1818
onRemoveTodo={onRemoveTodo}
1919
onToggleTodoDone={onToggleTodoDone}
20+
onEditTodo={onEditTodo}
2021
isDone={isDone}
2122
/>
2223
))

0 commit comments

Comments
 (0)