diff --git a/backend/controllers/taskController.js b/backend/controllers/taskController.js index b9aafa6a..9c8a4227 100644 --- a/backend/controllers/taskController.js +++ b/backend/controllers/taskController.js @@ -27,8 +27,15 @@ export const createTask = async (req, res) => { } // fetch details for task from request body - const { title, description, tags, priority, status, dueDate } = req.body; - if (!title || !priority || !status) { + const { + title, + description, + tags, + priority, + status = "Due", + dueDate, +} = req.body; + if (!title || !priority || !dueDate) { return res .status(400) .json({ success: false, message: "Please enter all the details" }); diff --git a/backend/package-lock.json b/backend/package-lock.json index 9be997c4..be012a4e 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -324,6 +324,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -757,6 +758,7 @@ "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a36cf793..844c0d5a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -63,6 +63,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1676,6 +1677,7 @@ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -1717,6 +1719,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1839,6 +1842,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -2196,6 +2200,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3364,6 +3369,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -3433,6 +3439,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -3442,6 +3449,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.1.tgz", "integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -3741,6 +3749,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -3862,6 +3871,7 @@ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/frontend/src/components/Routine/TaskLibrary.jsx b/frontend/src/components/Routine/TaskLibrary.jsx index 69f6c4b6..502167dd 100644 --- a/frontend/src/components/Routine/TaskLibrary.jsx +++ b/frontend/src/components/Routine/TaskLibrary.jsx @@ -1,6 +1,5 @@ import { useState } from "react"; import { useDraggable } from "@dnd-kit/core"; -import useTasks from "../../hooks/useTasks.js"; import EmptyState from "../EmptyState"; /* ---------------- Draggable Task Item ---------------- */ @@ -59,9 +58,8 @@ function DraggableTask({ task }) { } /* ---------------- Task Library ---------------- */ -export default function TaskLibrary({ onAddTask }) { - const { tasks } = useTasks(); - +export default function TaskLibrary({ tasks, onAddTask }) { + const [query, setQuery] = useState(""); const filteredTasks = tasks?.filter((task) => diff --git a/frontend/src/components/Task/TaskFormModal.jsx b/frontend/src/components/Task/TaskFormModal.jsx index a6874000..05c6c66b 100644 --- a/frontend/src/components/Task/TaskFormModal.jsx +++ b/frontend/src/components/Task/TaskFormModal.jsx @@ -92,13 +92,14 @@ export default function TaskFormModal({ task, onClose, onSubmit, errorMessage, o return alert("Due date cannot be more than 1 year in the future"); } - onSubmit({ - title: title.trim(), - description: description.trim(), - tags, - priority, - dueDate, - }); + onSubmit({ + title: title.trim(), + description: description.trim(), + tags, + priority, + status: "Due", + dueDate, +}); }; const toggleCategory = (categoryName) => { diff --git a/frontend/src/hooks/useTasks.js b/frontend/src/hooks/useTasks.js index bbf67807..4f768d21 100644 --- a/frontend/src/hooks/useTasks.js +++ b/frontend/src/hooks/useTasks.js @@ -16,19 +16,30 @@ const useTasks = () => { // create new task const addTask = async (taskData) => { - try { - await api.post("/tasks", taskData); - getTasks(); - } catch (error) { - if (error.response?.status === 409) { - throw new Error( - error.response.data?.message || - "Task with the same title and due date already exists" - ); - } - throw error; - } - }; + try { + const response = await api.post("/tasks", taskData); + + console.log("Task added:", response.data); + + // instantly update UI + setTasks((prev) => [response.data.newTask, ...prev]); + + } catch (error) { + + console.log("FULL ERROR:", error); + + console.log( + error?.response?.data?.message || + error?.response?.data || + error.message + ); + + alert( + error?.response?.data?.message || + "Failed to create task" + ); + } +}; // update task const updateTask = async (id, updates) => { diff --git a/frontend/src/pages/RoutineBuilder.jsx b/frontend/src/pages/RoutineBuilder.jsx index 0a69cacb..90e2ec6d 100644 --- a/frontend/src/pages/RoutineBuilder.jsx +++ b/frontend/src/pages/RoutineBuilder.jsx @@ -186,6 +186,10 @@ export default function RoutineBuilder() { {/* Main Layout */}