From e102c8334422b4b14b8889429d9096acf46b50fd Mon Sep 17 00:00:00 2001 From: Rock3r Date: Mon, 27 Apr 2026 14:37:07 +0200 Subject: [PATCH] refactor(logic): extract task management into useTasks custom hook --- src/App.tsx | 42 +++++------------------------------------- src/hooks/useTasks.tsx | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 37 deletions(-) create mode 100644 src/hooks/useTasks.tsx diff --git a/src/App.tsx b/src/App.tsx index d8e76c0..6d525b9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,43 +1,11 @@ -import { useEffect, useState } from "react" -import type { Task } from "./types/task"; +import { useState } from "react" import { TaskItem } from "./components/TaskItem"; +import { useTasks } from "./hooks/useTasks"; function App() { - const [tasks, setTasks] = useState(() => { - const savedTasks = localStorage.getItem('tasks'); - return savedTasks ? JSON.parse(savedTasks) : [] - }); - + const [inputValue, setInputValue] = useState(''); - - useEffect(() => { - localStorage.setItem('tasks', JSON.stringify(tasks)); - }, [tasks]); - - const addTask = () => { - if (inputValue.trim() === '') return; - - const newTask: Task = { - id: Date.now(), - title: inputValue, - completed: false, - createdAt: new Date().toISOString() - }; - - setTasks([...tasks, newTask]); - - setInputValue(''); - }; - - const deleteTask = (id: number) => { - setTasks(tasks.filter(task => task.id !== id)); - } - - const toggleTask = (id: number) => { - setTasks(tasks.map(task => - task.id === id ? { ...task, completed: !task.completed} : task - )); - }; + const { tasks, addTask, deleteTask, toggleTask } = useTasks(); return (
@@ -49,7 +17,7 @@ function App() { value={inputValue} onChange={(e) => setInputValue(e.target.value)} /> - +
{tasks.length === 0 ? ( diff --git a/src/hooks/useTasks.tsx b/src/hooks/useTasks.tsx new file mode 100644 index 0000000..6e71f47 --- /dev/null +++ b/src/hooks/useTasks.tsx @@ -0,0 +1,40 @@ +import { useEffect, useState } from "react"; +import type { Task } from "../types/task"; + +export const useTasks = () => { + const [tasks, setTasks] = useState(() => { + const savedTasks = localStorage.getItem('tasks'); + return savedTasks ? JSON.parse(savedTasks) : [] + }); + + useEffect(() => { + localStorage.setItem('tasks', JSON.stringify(tasks)); + }, [tasks]); + + const addTask = (title: string) => { + if (title.trim() === '') return; + + const newTask: Task = { + id: Date.now(), + title: title, + completed: false, + createdAt: new Date().toISOString() + }; + + setTasks([...tasks, newTask]); + + setTasks(prev => [...prev, newTask]); + }; + + const deleteTask = (id: number) => { + setTasks(tasks.filter(task => task.id !== id)); + } + + const toggleTask = (id: number) => { + setTasks(tasks.map(task => + task.id === id ? { ...task, completed: !task.completed } : task + )); + + } + return { tasks, addTask, deleteTask, toggleTask }; +}; \ No newline at end of file