App.jsx
import { useEffect, useState } from "react";
import { NewTodoForm } from "./NewTodoForm";
import "./styles.css";
import { TodoList } from "./TodoList";
export default function App() {
const [todos, setTodos] = useState(() => {
const localValue = localStorage.getItem("ITEMS");
if (localValue == null) return [];
return JSON.parse(localValue);
});
useEffect(() => {
localStorage.setItem("ITEMS", JSON.stringify(todos));
}, [todos]);
function addTodo(title) {
setTodos((currentTodos) => {
return [
...currentTodos,
{ id: crypto.randomUUID(), title, completed: false },
];
});
}
function toggleTodo(id, completed) {
setTodos((currentTodos) => {
return currentTodos.map((todo) => {
if (todo.id === id) {
return { ...todo, completed };
}
return todo;
});
});
}
function deleteTodo(id) {
setTodos((currentTodos) => {
return currentTodos.filter((todo) => todo.id !== id);
});
}
return (
<>
<NewTodoForm onSubmit={addTodo} />
<h1 className="header">Todo List</h1>
<TodoList todos={todos} toggleTodo={toggleTodo} deleteTodo={deleteTodo} />
</>
);
}
Explanation
- This is the main application component. It stores
todos in state and persists them to localStorage.
addTodo, toggleTodo, and deleteTodo are passed down to child components.
- The component imports
NewTodoForm and TodoList which are defined separately.