) => {\n setTitle(event.target.value)\n };\n\n const keyHandler = (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\") {\n props.onAdd(ref.current!.value);//для примера используем ref\n setTitle(\"\");\n event.preventDefault();\n }\n };\n\n return (\n <>\n \n \n \n
\n >\n )\n};\n\n","import React from 'react';\nimport {ITodo} from \"../interfaces\";\n\ntype TodoListProps = {\n todos: ITodo[]\n onToggle(id: number): void\n onRemove: (id: number) => void // можно через лямбда функцию\n}\n\nexport const TodoList: React.FC = ({todos, onToggle, onRemove}) => {\n if (!todos.length) {\n return Добавьте первое дело
;\n }\n\n const handleRemove = (e: React.MouseEvent, id: number) => {\n e.preventDefault();\n onRemove(id);\n };\n\n return (\n <>\n \n >\n )\n};\n","import React, {useEffect, useState} from \"react\";\nimport {TodoForm} from \"../components/TodoForm\";\nimport {TodoList} from \"../components/TodoList\";\nimport {ITodo} from \"../interfaces\";\n\ndeclare var confirm: (question: string) => boolean; // Чтобы typescript не ругался на глобальный метод\n\nexport const TodoPage: React.FC = () => {\n const [todos, setTodos] = useState([]);\n\n useEffect(() => {\n const saved = JSON.parse(localStorage.getItem('todos') || '[]') as ITodo[];\n setTodos(saved);\n }, []);\n\n useEffect(() => {\n localStorage.setItem('todos', JSON.stringify(todos));\n }, [todos]);\n\n const addHandler = (title: string) => {\n const newTodo: ITodo = {\n title,\n id: Date.now(),\n completed: false\n };\n\n // setTodos([newTodo, ...todos]); перетирает предыдущий стейт\n\n setTodos(prev => [newTodo, ...prev]) // точно уверены что добавляем новый item в пред. стейт\n };\n\n const toggleHandler = (id: number) => {\n setTodos(prev =>\n prev.map(item => {\n if (item.id === id) {\n return {\n ...item,\n completed: !item.completed\n }\n }\n return item;\n }))\n };\n\n const removeHandler = (id: number) => {\n const shouldRemove = confirm('Вы уверены, что хотите удалить элемент?');\n if (shouldRemove) setTodos(prev => prev.filter(item => item.id !== id))\n };\n\n return (\n <>\n \n \n >\n )\n};\n","import {useHistory} from 'react-router-dom';\n\nexport const AboutPage: React.FC = () => {\n const history = useHistory();\n return (\n <>\n About
\n \n >\n )\n};\n","import React from 'react';\nimport {BrowserRouter, Switch, Route} from 'react-router-dom';\nimport {Navbar} from \"./components/Navbar\";\nimport {TodoPage} from \"./pages/TodosPage\";\nimport {AboutPage} from \"./pages/AboutPage\";\n\n\nconst App: React.FC = () => {\n\n return (\n \n \n \n \n \n \n \n
\n \n )\n};\n\n\nexport default App;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}