);
};
diff --git a/src/components/TaskManager.tsx b/src/components/TaskManager.tsx
index 7b280e8..e5d01b5 100644
--- a/src/components/TaskManager.tsx
+++ b/src/components/TaskManager.tsx
@@ -1,87 +1,156 @@
-import React, { useState } from "react";
+import React, { useState, useEffect } from "react";
import TaskItem from "./TaskItem";
+import Task from "../interfaces/task.interface";
+import Menu from "./Menu";
+import ConfirmationModal from "./ConfirmationModal";
+import Button from "./Button";
+import { getFromLocalStorage, setOnLocalStorage } from "../store/task";
const TaskManager = () => {
- const [tasks, setTasks] = useState([
- { id: 1, title: "Buy groceries", completed: false },
- { id: 2, title: "Clean the house", completed: true },
- ]);
+ const [tasks, setTasks] = useState([]);
const [filter, setFilter] = useState("all");
- const [newTask, setNewTask] = useState();
+ const [newTask, setNewTask] = useState("");
+ const [filterName, setFilterName] = useState("All");
+ const [isModalOpen, setIsModalOpen] = useState(false);
+ const [selectedTask, setSelectedTask] = useState();
- // Intentional bug: The filter conditions are reversed.
+ // Get tasks from the local storage on the page mount
+ useEffect(() => {
+ setTasks(getFromLocalStorage());
+ }, []);
+
+ useEffect(() => {
+ setSelectedFilters();
+ }, [filter]);
+
+ // Update the state list (not have to go to the localstorage every time to get data) and the localStorage.
+ const updateTasksList = (newList: Task[]) => {
+ setTasks(newList);
+ setOnLocalStorage(newList);
+ }
+
+ const setSelectedFilters = () => {
+ const filters = document.querySelectorAll('.filter-button');
+ filters.forEach(f => {
+ if(f.id === filter + 'Button') f.classList.add('border-b-2', 'border-b-white', 'font-bold');
+ else f.classList.remove('border-b-2', 'border-b-white', 'font-bold');
+ });
+ };
+
const filteredTasks = tasks.filter((task) => {
- if (filter === "completed") return task.completed === false;
- if (filter === "pending") return task.completed === true;
+ if (filter === "completed") return task.completed === true;
+ if (filter === "pending") return task.completed === false;
return true;
});
const handleAddTask = (e: React.FormEvent) => {
e.preventDefault();
if (newTask!.trim() === "") return;
- const newTaskObj = {
- id: tasks.length + 1,
- name: newTask,
+ const newTaskObj: Task = {
+ id: tasks.reduce((max, item) => Math.max(max, item.id), 0) + 1,
+ title: newTask,
completed: false,
};
- setTasks([...tasks, newTaskObj]);
+ updateTasksList([...tasks, newTaskObj]);
setNewTask("");
};
- // Intentional bug: Directly mutating the tasks array when deleting.
+ const confirmDeleteTask = (task: Task) => {
+ setSelectedTask(task)
+ setIsModalOpen(true);
+ }
+
+ const closeModal = () => {
+ setIsModalOpen(false);
+ }
+
const handleDeleteTask = (id: number) => {
- const index = tasks.findIndex((task) => task.id === id);
- if (index !== -1) {
- tasks.splice(index, 1);
- setTasks(tasks);
- }
+ const updatedTasks = tasks.filter((item) => item.id !== id);
+ updateTasksList(updatedTasks);
+ closeModal();
};
const toggleTaskCompletion = (id: number) => {
- const task = tasks.find((task) => task.id === id);
-
- task.isCompleted = !task.isCompleted;
- };
+ //Update function to get new tasks list to update and use states;
+ const updatedTasks = tasks.map((task) => {
+ if (task.id === id) {
+ return { ...task, completed: !task.completed };
+ }
+ return task;
+ });
+ //Sort the list to put the completed on the end. The secondary sort is by id.
+ updateTasksList(updatedTasks.sort((a, b) => {
+ if (a.completed === b.completed) {
+ return a.id - b.id;
+ }
+ return a.completed - b.completed;
+ }));
+ };
return (
-
-
-
-
-
-
+
+ {/* Using this hidden class to instanciate color because of a major problem on Tailwind where the color's variable are not iniciated before use */}
+
+
+ {"There are no " + (filter === 'all' ? '' : (filterName + ' ')) + 'tasks yet'}
+ {
+ filter === 'completed' ?
+ "Complete a task to see on this list!"
+ :
+ "Add a new one and start to control your tasks!"
+ }
+
+