From b1a25823af08b4afb1f1055f76082d7e5cf861bc Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 1 Feb 2025 12:03:26 +0530 Subject: [PATCH 01/26] Added Database Schemas and Diagrams --- backend/src/models/assignment.models.js | 36 +++++++++++++ .../diagram-export-1-29-2025-6_49_52-PM.png | Bin 0 -> 419521 bytes backend/src/models/schedules.models.js | 31 +++++++++++ backend/src/models/task.models.js | 30 +++++++++++ backend/src/models/user.models.js | 49 ++++++++++++++++++ 5 files changed, 146 insertions(+) create mode 100644 backend/src/models/assignment.models.js create mode 100644 backend/src/models/diagram-export-1-29-2025-6_49_52-PM.png create mode 100644 backend/src/models/schedules.models.js create mode 100644 backend/src/models/task.models.js create mode 100644 backend/src/models/user.models.js diff --git a/backend/src/models/assignment.models.js b/backend/src/models/assignment.models.js new file mode 100644 index 0000000..d688a6a --- /dev/null +++ b/backend/src/models/assignment.models.js @@ -0,0 +1,36 @@ +import mongoose, { Schema } from "mongoose"; + +const assignmentSchema = new Schema( + { + title: { + type: String, + required: true, + }, + description: { + type: String, + }, + docs: [ + { + type: String, + required: true, + }, + ], + due_date: { + type: Date, + required: true, + }, + isComplete: { + type: Boolean, + default: false, + }, + user: { + type: Schema.Types.ObjectId, + ref: "User", + }, + }, + { + timestamps: true, + } +); + +export const Assignment = mongoose.model("Assignment", assignmentSchema); diff --git a/backend/src/models/diagram-export-1-29-2025-6_49_52-PM.png b/backend/src/models/diagram-export-1-29-2025-6_49_52-PM.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f0673a5c9745279ae4a1adc3c718c861504651 GIT binary patch literal 419521 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

InrxF>LP;Buso6CWa^MuBW{hBkQFwo@u<^ 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

diff --git a/frontend/pages/Signup.jsx b/frontend/pages/Signup.jsx index a71cb07..fe8dcf8 100644 --- a/frontend/pages/Signup.jsx +++ b/frontend/pages/Signup.jsx @@ -18,7 +18,7 @@ const Signup = () => { const submitHandler = async (e) => { e.preventDefault(); const newUser = { - name: name, + fullName: name, username:username, email:email, password:password, @@ -71,7 +71,7 @@ const Signup = () => { placeholder="Name" className="bg-[#c3bef0] w-72 h-10 p-3 rounded-lg mb-2" value={name} - onChange={(e)=>setEmail(e.target.value)} + onChange={(e)=>setName(e.target.value)} /> Date: Mon, 3 Feb 2025 01:59:14 +0530 Subject: [PATCH 17/26] fix:signup page --- frontend/pages/Signup.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/pages/Signup.jsx b/frontend/pages/Signup.jsx index fe8dcf8..ea97cba 100644 --- a/frontend/pages/Signup.jsx +++ b/frontend/pages/Signup.jsx @@ -25,7 +25,7 @@ const Signup = () => { }; try{ - const response=await axios.post(`${import.meta.env.VITE_BASE_URL}/signup`) + const response=await axios.post(`${import.meta.env.VITE_BASE_URL}/register`) if (response.status === 201) { const data = response.data; setUser(data.user); From dc22f4cbd6fd955ddee10bf75feb55153754f140 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Mon, 3 Feb 2025 04:03:35 +0530 Subject: [PATCH 18/26] feat: implement Tasks controllers --- backend/src/controllers/task.controller.js | 96 ++++++++++++++++++++++ backend/src/routes/user.routes.js | 8 +- 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 backend/src/controllers/task.controller.js diff --git a/backend/src/controllers/task.controller.js b/backend/src/controllers/task.controller.js new file mode 100644 index 0000000..6d1b6b4 --- /dev/null +++ b/backend/src/controllers/task.controller.js @@ -0,0 +1,96 @@ +import { Task } from "../models/task.models.js"; +import { ApiError } from "../utils/ApiError.js"; +import { ApiResponse } from "../utils/ApiResponse.js"; +import { asyncHandler } from "../utils/asyncHandler.js"; + +const createTask = asyncHandler(async (req, res) => { + const { title, description, due_date } = req.body; + + if ([title, due_date].some((field) => field?.trim() === "")) { + throw new ApiError(400, "Some fields are required fields"); + } + + const task = await Task.create({ + title, + description, + due_date, + user: req.user._id, + }); + + const taskFromDB = await Task.findById(task._id); + + if (!taskFromDB) { + throw new ApiError(500, "Something went wrong while creating Task"); + } + + return res + .status(201) + .json(new ApiResponse(200, taskFromDB, "Task Ban Gaya 🤡!")); +}); + +const getUserTasks = asyncHandler(async (req, res) => { + const userId = req.user.id; + + const tasks = await Task.find({ user: userId }).sort({ + createdAt: -1, + }); + + if (!tasks.length) { + throw new ApiError(404, "No tasks found for this user..."); + } + + return res.status(200).json(new ApiResponse(200, tasks, "Tasks Fetched")); +}); + +const updateTask = asyncHandler(async (req, res) => { + const { taskId } = req.params; + const { title, description, due_date } = req.body; + + // Validate ObjectId + if (!isValidObjectId(taskId)) { + throw new ApiError(400, "Invalid Task ID"); + } + + // Better approach (apparently😭) + const task = await Task.findOne({ + _id: taskId, + user: req.user._id, + }); + // Validation Again 💀 + if (!task) { + throw new ApiError(404, "Task not found or unauthorized access"); + } + + task.title = title || task.title; + task.description = description || task.description; + task.due_date = due_date || task.due_date; + + await task.save(); + + return res + .status(200) + .json(new ApiResponse(200, task, "Task Updated Successfully")); +}); + +const deleteTask = asyncHandler(async (req, res) => { + const { taskId } = req.params; + + if (!mongoose.Types.ObjectId.isValid(taskId)) { + throw new ApiError(400, "Invalid Task ID."); + } + + const task = await Task.findOne({ + _id: taskId, + user: req.user._id, + }); + // Validation Again 💀 + if (!task) { + throw new ApiError(404, "Task not found or unauthorized access"); + } + + await Task.findByIdAndDelete(taskId); + + return res.status(200).json(new ApiResponse(200, {}, "Khatam tata bye bye")); +}); + +export { createTask, getUserTasks, updateTask, deleteTask }; diff --git a/backend/src/routes/user.routes.js b/backend/src/routes/user.routes.js index 8bbfd20..6f6cf10 100644 --- a/backend/src/routes/user.routes.js +++ b/backend/src/routes/user.routes.js @@ -1,5 +1,11 @@ import { Router } from "express"; -import { register, logout, login, refreshAccessToken, getCurrentUser } from "../controllers/user.controllers.js"; +import { + register, + logout, + login, + refreshAccessToken, + getCurrentUser, +} from "../controllers/user.controllers.js"; import { upload } from "../middlewares/multer.middleware.js"; import { verifyJWT } from "../middlewares/auth.middleware.js"; From 0659468df7752833afdf6c69ada246cc0c9a2d73 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Mon, 3 Feb 2025 04:17:09 +0530 Subject: [PATCH 19/26] feat: add task routes and integrate with main app --- backend/src/app.js | 6 +++++- backend/src/routes/task.routes.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 backend/src/routes/task.routes.js diff --git a/backend/src/app.js b/backend/src/app.js index 5291369..5cac8ac 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -20,10 +20,14 @@ app.use(express.static("public")); // Cookie Parser configuration for tokens app.use(cookieParser()); -// TODO: Routes will go here +// TODO: Routes will go here ✔ import userRouter from "./routes/user.routes.js"; +import assignmentRouter from "./routes/assignment.routes.js"; +import taskRouter from "./routes/task.routes.js"; // Routes Declaration app.use("/users", userRouter); +app.use("/assignments", assignmentRouter); +app.use("/tasks", taskRouter); export { app }; diff --git a/backend/src/routes/task.routes.js b/backend/src/routes/task.routes.js new file mode 100644 index 0000000..06b2c65 --- /dev/null +++ b/backend/src/routes/task.routes.js @@ -0,0 +1,21 @@ +import { Router } from "express"; +import { verifyJWT } from "../middlewares/auth.middleware"; +import { + createTask, + getUserTasks, + updateTask, + deleteTask, +} from "../controllers/task.controller.js"; +const router = Router(); + +router.use(verifyJWT); + +router.route("/").post(createTask); + +// Fetch all tasks of current user +router.route("/getTasks").get(getUserTasks); + +// Task update and delete routes +router.route("/:taskId").patch(updateTask).delete(deleteTask); + +export default router; From 0aecd4ee1c5d917a24c2ae96eeaed42461d006ff Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:38:59 +0530 Subject: [PATCH 20/26] feat: Messaging functionality setup --- backend/src/app.js | 2 ++ backend/src/controllers/message.controller.js | 29 +++++++++++++++++++ backend/src/models/message.models.js | 27 +++++++++++++++++ backend/src/routes/message.routes.js | 10 +++++++ 4 files changed, 68 insertions(+) create mode 100644 backend/src/controllers/message.controller.js create mode 100644 backend/src/models/message.models.js create mode 100644 backend/src/routes/message.routes.js diff --git a/backend/src/app.js b/backend/src/app.js index 5cac8ac..afe7745 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -24,10 +24,12 @@ app.use(cookieParser()); import userRouter from "./routes/user.routes.js"; import assignmentRouter from "./routes/assignment.routes.js"; import taskRouter from "./routes/task.routes.js"; +import messageRouter from "./routes/message.routes.js"; // Routes Declaration app.use("/users", userRouter); app.use("/assignments", assignmentRouter); app.use("/tasks", taskRouter); +app.use("/messages", messageRouter); export { app }; diff --git a/backend/src/controllers/message.controller.js b/backend/src/controllers/message.controller.js new file mode 100644 index 0000000..58da92d --- /dev/null +++ b/backend/src/controllers/message.controller.js @@ -0,0 +1,29 @@ +import { User } from "../models/user.models.js"; +import { ApiError } from "../utils/ApiError.js"; +import { ApiResponse } from "../utils/ApiResponse.js"; +import { asyncHandler } from "../utils/asyncHandler.js"; +import { uploadToCloud } from "../utils/cloudinary.js"; + +const getUsers = asyncHandler(async (req, res) => { + try { + const loggedUserId = req.user._id; + + // Get all users except the logged in user + const filteredUsers = await User.find({ + _id: { $ne: loggedUserId }, + }).select("-password"); + + if (!filteredUsers) { + return res.status(404).json(new ApiResponse(404, null, "No users found")); + } + + return res + .status(200) + .json(new ApiResponse(200, filteredUsers, "Users fetched")); + } catch (error) { + console.error("Error in getUsersForSidebar: ", error.message); + throw new ApiError(500, "Something went wrong while fetching users"); + } +}); + +export { getUsers }; diff --git a/backend/src/models/message.models.js b/backend/src/models/message.models.js new file mode 100644 index 0000000..2ea009f --- /dev/null +++ b/backend/src/models/message.models.js @@ -0,0 +1,27 @@ +import mongoose, { Schema } from "mongoose"; + +const messageSchema = new Schema( + { + senderId: { + type: mongoose.Schema.Types.ObjectId, + ref: "User", + required: true, + }, + receiverId: { + type: mongoose.Schema.Types.ObjectId, + ref: "User", + required: true, + }, + text: { + type: String, + }, + image: { + type: String, //URL 😏 + }, + }, + { timestamps: true } +); + +const Message = mongoose.model("Message", messageSchema); + +export default Message; diff --git a/backend/src/routes/message.routes.js b/backend/src/routes/message.routes.js new file mode 100644 index 0000000..c3dda66 --- /dev/null +++ b/backend/src/routes/message.routes.js @@ -0,0 +1,10 @@ +import { Router } from "express"; +import { verifyJWT } from "../middlewares/auth.middleware.js"; +import { getUsers, getMessages } from "../controllers/message.controller.js"; + +const router = Router(); + +router.get("/users", verifyJWT, getUsers); +router.get("/:id", verifyJWT, getMessages); + +export default router; From 055daf2d7ef281ef2e9a337680cf93b1756fd2b5 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Mon, 3 Feb 2025 20:19:51 +0530 Subject: [PATCH 21/26] feat: implement messaging functionality with getMessages and sendMessage endpoints --- backend/src/controllers/message.controller.js | 66 ++++++++++++++++++- backend/src/routes/assignment.routes.js | 2 +- backend/src/routes/message.routes.js | 9 ++- backend/src/routes/task.routes.js | 2 +- 4 files changed, 75 insertions(+), 4 deletions(-) diff --git a/backend/src/controllers/message.controller.js b/backend/src/controllers/message.controller.js index 58da92d..52a2210 100644 --- a/backend/src/controllers/message.controller.js +++ b/backend/src/controllers/message.controller.js @@ -1,4 +1,5 @@ import { User } from "../models/user.models.js"; +import Message from "../models/message.models.js"; import { ApiError } from "../utils/ApiError.js"; import { ApiResponse } from "../utils/ApiResponse.js"; import { asyncHandler } from "../utils/asyncHandler.js"; @@ -26,4 +27,67 @@ const getUsers = asyncHandler(async (req, res) => { } }); -export { getUsers }; +const getMessages = asyncHandler(async (req, res) => { + try { + const loggedUserId = req.user._id; + const receiverId = req.params.id; + + // Fetching messages + const messages = await Message.find({ + $or: [ + { sender: loggedUserId, receiver: receiverId }, + { sender: receiverId, receiver: loggedUserId }, + ], + }).sort({ createdAt: 1 }); + + if (!messages) { + return res + .status(404) + .json(new ApiResponse(404, null, "No messages found")); + } + + return res + .status(200) + .json(new ApiResponse(200, messages, "Messages fetched")); + } catch (error) { + console.error("Error in getMessages: ", error.message); + throw new ApiError(500, "Something went wrong while fetching messages"); + } +}); + +const sendMessage = asyncHandler(async (req, res) => { + try { + const loggedUserId = req.user._id; + const receiverId = req.params.id; + const { text } = req.body; + + let doc = null; + const file = req.file; + if (file) { + const localPath = file.path; + doc = await uploadToCloud(localPath); + + if (!doc) { + throw new ApiError(400, "File couldn't be saved"); + } + } + + const message = await Message.create({ + sender: loggedUserId, + receiver: receiverId, + text, + doc: doc ? doc.url : null, + }); + + if (!message) { + throw new ApiError(400, "Message couldn't be saved"); + } + + return res.status(201).json(new ApiResponse(201, message, "Message sent")); + } catch (error) { + console.error("Error in sendMessage: ", error.message); + throw new ApiError(500, "Something went wrong while sending message"); + } +}); + +export { getUsers, getMessages, sendMessage }; diff --git a/backend/src/routes/assignment.routes.js b/backend/src/routes/assignment.routes.js index 03d9da7..966c862 100644 --- a/backend/src/routes/assignment.routes.js +++ b/backend/src/routes/assignment.routes.js @@ -1,5 +1,5 @@ import { Router } from "express"; -import { verifyJWT } from "../middlewares/auth.middleware"; +import { verifyJWT } from "../middlewares/auth.middleware.js"; import { upload } from "../middlewares/multer.middleware.js"; import { createAssignment, diff --git a/backend/src/routes/message.routes.js b/backend/src/routes/message.routes.js index c3dda66..2867a50 100644 --- a/backend/src/routes/message.routes.js +++ b/backend/src/routes/message.routes.js @@ -1,10 +1,17 @@ import { Router } from "express"; import { verifyJWT } from "../middlewares/auth.middleware.js"; -import { getUsers, getMessages } from "../controllers/message.controller.js"; +import { + getUsers, + getMessages, + sendMessage, +} from "../controllers/message.controller.js"; +import { upload } from "../middlewares/multer.middleware.js"; const router = Router(); router.get("/users", verifyJWT, getUsers); router.get("/:id", verifyJWT, getMessages); +router.post("/send/:id", verifyJWT, upload.single("img"), sendMessage); + export default router; diff --git a/backend/src/routes/task.routes.js b/backend/src/routes/task.routes.js index 06b2c65..e6961ca 100644 --- a/backend/src/routes/task.routes.js +++ b/backend/src/routes/task.routes.js @@ -1,5 +1,5 @@ import { Router } from "express"; -import { verifyJWT } from "../middlewares/auth.middleware"; +import { verifyJWT } from "../middlewares/auth.middleware.js"; import { createTask, getUserTasks, From 4885ba6e801a01f03dc845c17f053d2cf55c5835 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Tue, 4 Feb 2025 14:28:41 +0530 Subject: [PATCH 22/26] feat: setup --- backend/src/controllers/message.controller.js | 2 +- frontend/package-lock.json | 301 +++++++++--------- frontend/package.json | 8 +- frontend/pages/Chat.jsx | 7 + frontend/src/App.jsx | 33 +- frontend/src/index.css | 1 + frontend/vite.config.js | 1 - 7 files changed, 181 insertions(+), 172 deletions(-) create mode 100644 frontend/pages/Chat.jsx diff --git a/backend/src/controllers/message.controller.js b/backend/src/controllers/message.controller.js index 52a2210..55d6702 100644 --- a/backend/src/controllers/message.controller.js +++ b/backend/src/controllers/message.controller.js @@ -90,4 +90,4 @@ const sendMessage = asyncHandler(async (req, res) => { } }); -export { getUsers, getMessages, sendMessage }; +export { getUsers, getMessages, sendMessage }; \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7e2d2d1..3eaf4d9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,26 +13,26 @@ "@fortawesome/free-brands-svg-icons": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", - "@tailwindcss/vite": "^4.0.1", "axios": "^1.7.9", "motion": "^12.0.6", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.4.0", - "react-router-dom": "^7.1.4", - "tailwindcss": "^4.0.1" + "react-router-dom": "^7.1.4" }, "devDependencies": { "@eslint/js": "^9.17.0", + "@tailwindcss/vite": "^4.0.3", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^4.3.4", - "daisyui": "^4.12.23", + "daisyui": "^5.0.0-beta.6", "eslint": "^9.17.0", "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-react-refresh": "^0.4.16", "globals": "^15.14.0", + "tailwindcss": "^4.0.3", "vite": "^6.0.5" } }, @@ -339,6 +339,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -355,6 +356,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -371,6 +373,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -387,6 +390,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -403,6 +407,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -419,6 +424,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -435,6 +441,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -451,6 +458,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -467,6 +475,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -483,6 +492,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -499,6 +509,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -515,6 +526,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -531,6 +543,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -547,6 +560,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -563,6 +577,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -579,6 +594,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -595,6 +611,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -611,6 +628,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -627,6 +645,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -643,6 +662,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -659,6 +679,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -675,6 +696,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -691,6 +713,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -707,6 +730,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -723,6 +747,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1066,6 +1091,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1079,6 +1105,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1092,6 +1119,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1105,6 +1133,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1118,6 +1147,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1131,6 +1161,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1144,6 +1175,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1157,6 +1189,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1170,6 +1203,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1183,6 +1217,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1196,6 +1231,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1209,6 +1245,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1222,6 +1259,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1235,6 +1273,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1248,6 +1287,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1261,6 +1301,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1274,6 +1315,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1287,6 +1329,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1300,6 +1343,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1307,45 +1351,48 @@ ] }, "node_modules/@tailwindcss/node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.1.tgz", - "integrity": "sha512-lc+ly6PKHqgCVl7eO8D2JlV96Lks5bmL6pdtM6UasyUHLU2zmrOqU6jfgln120IVnCh3VC8GG/ca24xVTtSokw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.3.tgz", + "integrity": "sha512-QsVJokOl0pJ4AbJV33D2npvLcHGPWi5MOSZtrtE0GT3tSx+3D0JE2lokLA8yHS1x3oCY/3IyRyy7XX6tmzid7A==", + "dev": true, "license": "MIT", "dependencies": { "enhanced-resolve": "^5.18.0", "jiti": "^2.4.2", - "tailwindcss": "4.0.1" + "tailwindcss": "4.0.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.1.tgz", - "integrity": "sha512-3z1SpWoDeaA6K6jd92CRrGyDghOcRILEgyWVHRhaUm/tcpiazwJpU9BSG0xB7GGGnl9capojaC+zme/nKsZd/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.3.tgz", + "integrity": "sha512-FFcp3VNvRjjmFA39ORM27g2mbflMQljhvM7gxBAujHxUy4LXlKa6yMF9wbHdTbPqTONiCyyOYxccvJyVyI/XBg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.0.1", - "@tailwindcss/oxide-darwin-arm64": "4.0.1", - "@tailwindcss/oxide-darwin-x64": "4.0.1", - "@tailwindcss/oxide-freebsd-x64": "4.0.1", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.1", - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.1", - "@tailwindcss/oxide-linux-arm64-musl": "4.0.1", - "@tailwindcss/oxide-linux-x64-gnu": "4.0.1", - "@tailwindcss/oxide-linux-x64-musl": "4.0.1", - "@tailwindcss/oxide-win32-arm64-msvc": "4.0.1", - "@tailwindcss/oxide-win32-x64-msvc": "4.0.1" + "@tailwindcss/oxide-android-arm64": "4.0.3", + "@tailwindcss/oxide-darwin-arm64": "4.0.3", + "@tailwindcss/oxide-darwin-x64": "4.0.3", + "@tailwindcss/oxide-freebsd-x64": "4.0.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.3", + "@tailwindcss/oxide-linux-x64-musl": "4.0.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.1.tgz", - "integrity": "sha512-eP/rI9WaAElpeiiHDqGtDqga9iDsOClXxIqdHayHsw93F24F03b60CwgGhrGF9Io/EuWIpz3TMRhPVOLhoXivw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.3.tgz", + "integrity": "sha512-S8XOTQuMnpijZRlPm5HBzPJjZ28quB+40LSRHjRnQF6rRYKsvpr1qkY7dfwsetNdd+kMLOMDsvmuT8WnqqETvg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1356,12 +1403,13 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.1.tgz", - "integrity": "sha512-jZVUo0kNd1IjxdCYwg4dwegDNsq7PoUx4LM814RmgY3gfJ63Y6GlpJXHOpd5FLv1igpeZox5LzRk2oz8MQoJwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.3.tgz", + "integrity": "sha512-smrY2DpzhXvgDhZtQlYAl8+vxJ04lv2/64C1eiRxvsRT2nkw/q+zA1/eAYKvUHat6cIuwqDku3QucmrUT6pCeg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1372,12 +1420,13 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.1.tgz", - "integrity": "sha512-E31wHiIf4LB0aKRohrS4U6XfFSACCL9ifUFfPQ16FhcBIL4wU5rcBidvWvT9TQFGPkpE69n5dyXUcqiMrnF/Ig==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.3.tgz", + "integrity": "sha512-NTz8x/LcGUjpZAWUxz0ZuzHao90Wj9spoQgomwB+/hgceh5gcJDfvaBYqxLFpKzVglpnbDSq1Fg0p0zI4oa5Pg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1388,12 +1437,13 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.1.tgz", - "integrity": "sha512-8/3ZKLMYqgAsBzTeczOKWtT4geF02g9S7cntY5gvqQZ4E0ImX724cHcZJi9k6fkE6aLbvwxxHxaShFvRxblwKQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.3.tgz", + "integrity": "sha512-yQc9Q0JCOp3kkAV8gKgDctXO60IkQhHpqGB+KgOccDtD5UmN6Q5+gd+lcsDyQ7N8dRuK1fAud51xQpZJgKfm7g==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1404,12 +1454,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.1.tgz", - "integrity": "sha512-EYjbh225klQfWzy6LeIAfdjHCK+p71yLV/GjdPNW47Bfkkq05fTzIhHhCgshUvNp78EIA33iQU+ktWpW06NgHw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.3.tgz", + "integrity": "sha512-e1ivVMLSnxTOU1O3npnxN16FEyWM/g3SuH2pP6udxXwa0/SnSAijRwcAYRpqIlhVKujr158S8UeHxQjC4fGl4w==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1420,12 +1471,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.1.tgz", - "integrity": "sha512-PrX2SwIqWNP5cYeSyQfrhbk4ffOM338T6CrEwIAGvLPoUZiklt19yknlsBme6bReSw7TSAMy+8KFdLLi5fcWNQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.3.tgz", + "integrity": "sha512-PLrToqQqX6sdJ9DmMi8IxZWWrfjc9pdi9AEEPTrtMts3Jm9HBi1WqEeF1VwZZ2aW9TXloE5OwA35zuuq1Bhb/Q==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1436,12 +1488,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.1.tgz", - "integrity": "sha512-iuoFGhKDojtfloi5uj6MIk4kxEOGcsAk/kPbZItF9Dp7TnzVhxo2U/718tXhxGrg6jSL3ST3cQHIjA6yw3OeXw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.3.tgz", + "integrity": "sha512-YlzRxx7N1ampfgSKzEDw0iwDkJXUInR4cgNEqmR4TzHkU2Vhg59CGPJrTI7dxOBofD8+O35R13Nk9Ytyv0JUFg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1452,12 +1505,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.1.tgz", - "integrity": "sha512-pNUrGQYyE8RK+N9yvkPmHnlKDfFbni9A3lsi37u4RoA/6Yn+zWVoegvAQMZu3w+jqnpb2A/bYJ+LumcclUZ3yg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.3.tgz", + "integrity": "sha512-Xfc3z/li6XkuD7Hs+Uk6pjyCXnfnd9zuQTKOyDTZJ544xc2yoMKUkuDw6Et9wb31MzU2/c0CIUpTDa71lL9KHw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1468,12 +1522,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.1.tgz", - "integrity": "sha512-xSGWaDcT6SJ75su9zWXj8GYb2jM/przXwZGH96RTS7HGDIoI1tvgpls88YajG5Sx7hXaqAWCufjw5L/dlu+lzg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.3.tgz", + "integrity": "sha512-ugKVqKzwa/cjmqSQG17aS9DYrEcQ/a5NITcgmOr3JLW4Iz64C37eoDlkC8tIepD3S/Td/ywKAolTQ8fKbjEL4g==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1484,12 +1539,13 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.1.tgz", - "integrity": "sha512-BUNL2isUZ2yWnbplPddggJpZxsqGHPZ1RJAYpu63W4znUnKCzI4m/jiy0WpyYqqOKL9jDM5q0QdsQ9mc3aw5YQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.3.tgz", + "integrity": "sha512-qHPDMl+UUwsk1RMJMgAXvhraWqUUT+LR/tkXix5RA39UGxtTrHwsLIN1AhNxI5i2RFXAXfmFXDqZCdyQ4dWmAQ==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1500,12 +1556,13 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.1.tgz", - "integrity": "sha512-ZtcVu+XXOddGsPlvO5nh2fnbKmwly2C07ZB1lcYCf/b8qIWF04QY9o6vy6/+6ioLRfbp3E7H/ipFio38DZX4oQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.3.tgz", + "integrity": "sha512-+ujwN4phBGyOsPyLgGgeCyUm4Mul+gqWVCIGuSXWgrx9xVUnf6LVXrw0BDBc9Aq1S2qMyOTX4OkCGbZeoIo8Qw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1516,15 +1573,16 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.1.tgz", - "integrity": "sha512-ZkwMBA7uR+nyrafIZI8ce3PduE0dDVFVmxmInCUPTN17Jgy6RfEPXzqtL5fz658eDDxKa5xZ+gmiTt+5AMD0pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.3.tgz", + "integrity": "sha512-Qj6rSO+EvXnNDymloKZ11D54JJTnDrkRWJBzNHENDxjt0HtrCZJbSLIrcJ/WdaoU4othrel/oFqHpO/doxIS/Q==", + "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "^4.0.1", - "@tailwindcss/oxide": "^4.0.1", + "@tailwindcss/node": "^4.0.3", + "@tailwindcss/oxide": "^4.0.3", "lightningcss": "^1.29.1", - "tailwindcss": "4.0.1" + "tailwindcss": "4.0.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6" @@ -1585,6 +1643,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1995,16 +2054,6 @@ "node": ">=6" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001696", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", @@ -2113,30 +2162,6 @@ "node": ">= 8" } }, - "node_modules/css-selector-tokenizer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", - "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -2144,34 +2169,14 @@ "dev": true, "license": "MIT" }, - "node_modules/culori": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", - "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/daisyui": { - "version": "4.12.23", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.23.tgz", - "integrity": "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ==", + "version": "5.0.0-beta.6", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.0.0-beta.6.tgz", + "integrity": "sha512-gwXHv6MApRBrvUayzg83vS6bfZ+y7/1VGLu0a8/cEAMviS4rXLCd4AndEdlVxhq+25wkAp0CZRkNQ7O4wIoFnQ==", "dev": true, "license": "MIT", - "dependencies": { - "css-selector-tokenizer": "^0.8", - "culori": "^3", - "picocolors": "^1", - "postcss-js": "^4" - }, - "engines": { - "node": ">=16.9.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/daisyui" + "url": "https://github.com/saadeghi/daisyui?sponsor=1" } }, "node_modules/data-view-buffer": { @@ -2302,6 +2307,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, "license": "Apache-2.0", "bin": { "detect-libc": "bin/detect-libc.js" @@ -2349,6 +2355,7 @@ "version": "5.18.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -2533,6 +2540,7 @@ "version": "0.24.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -2823,13 +2831,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true, - "license": "MIT" - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -2962,6 +2963,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -3140,6 +3142,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/has-bigints": { @@ -3692,6 +3695,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -3807,6 +3811,7 @@ "version": "1.29.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", + "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^1.0.3" @@ -3838,6 +3843,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3858,6 +3864,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3878,6 +3885,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3898,6 +3906,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3918,6 +3927,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3938,6 +3948,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3958,6 +3969,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3978,6 +3990,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -3998,6 +4011,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4018,6 +4032,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4172,6 +4187,7 @@ "version": "3.3.8", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, "funding": [ { "type": "github", @@ -4418,6 +4434,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/possible-typed-array-names": { @@ -4434,6 +4451,7 @@ "version": "8.5.1", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -4458,26 +4476,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4681,6 +4679,7 @@ "version": "4.32.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz", "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.6" @@ -4947,6 +4946,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -5090,15 +5090,17 @@ } }, "node_modules/tailwindcss": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.1.tgz", - "integrity": "sha512-UK5Biiit/e+r3i0O223bisoS5+y7ZT1PM8Ojn0MxRHzXN1VPZ2KY6Lo6fhu1dOfCfyUAlK7Lt6wSxowRabATBw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.3.tgz", + "integrity": "sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA==", + "dev": true, "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5271,6 +5273,7 @@ "version": "6.0.11", "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", + "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.24.2", diff --git a/frontend/package.json b/frontend/package.json index ab91bf0..1e6e7c7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,26 +15,26 @@ "@fortawesome/free-brands-svg-icons": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", - "@tailwindcss/vite": "^4.0.1", "axios": "^1.7.9", "motion": "^12.0.6", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.4.0", - "react-router-dom": "^7.1.4", - "tailwindcss": "^4.0.1" + "react-router-dom": "^7.1.4" }, "devDependencies": { "@eslint/js": "^9.17.0", + "@tailwindcss/vite": "^4.0.3", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^4.3.4", - "daisyui": "^4.12.23", + "daisyui": "^5.0.0-beta.6", "eslint": "^9.17.0", "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-react-refresh": "^0.4.16", "globals": "^15.14.0", + "tailwindcss": "^4.0.3", "vite": "^6.0.5" } } diff --git a/frontend/pages/Chat.jsx b/frontend/pages/Chat.jsx new file mode 100644 index 0000000..42d91ed --- /dev/null +++ b/frontend/pages/Chat.jsx @@ -0,0 +1,7 @@ +const Chat = () => { + return ( + + ); +}; + +export default Cha \ No newline at end of file diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index e3e6a60..6c07414 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,21 +1,20 @@ -import React from 'react' -import { BrowserRouter as Router,Route,Routes } from 'react-router-dom' -import { useState } from 'react' -import './App.css' -import Home from '../pages/Home' -import Login from '../pages/Login' -import Signup from '../pages/Signup' +import React from "react"; +import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; +import { useState } from "react"; +import "./App.css"; +import Home from "../pages/Home"; +import Login from "../pages/Login"; +import Signup from "../pages/Signup"; +import Chat from "../pages/Chat"; function App() { - return ( - - - }/> - } /> - } /> - - - ) + + } /> + } /> + } /> + } /> + + ); } -export default App +export default App; diff --git a/frontend/src/index.css b/frontend/src/index.css index f1d8c73..4c1b0c2 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1 +1,2 @@ @import "tailwindcss"; +@plugin "daisyui"; diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 3e96bf6..c72c0ae 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,7 +1,6 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' -import daisyui from 'daisyui' // https://vite.dev/config/ export default defineConfig({ From 69f88ff4a739bafb443cbc20f1294333653c72d7 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 8 Feb 2025 05:09:35 +0530 Subject: [PATCH 23/26] feat: add socket.io integration and update various components for chat functionality --- backend/package.json | 3 +- backend/src/app.js | 2 +- .../src/controllers/assignment.controllers.js | 20 +- backend/src/controllers/message.controller.js | 16 +- .../src/controllers/schedule.controllers.js | 74 ++++++ backend/src/controllers/task.controller.js | 11 +- backend/src/controllers/user.controllers.js | 18 +- backend/src/index.js | 50 +++- backend/src/middlewares/auth.middleware.js | 2 +- backend/src/models/assignment.models.js | 23 ++ backend/src/models/schedules.models.js | 8 +- backend/src/models/task.models.js | 30 +++ backend/src/routes/schedule.routes.js | 21 ++ backend/src/routes/task.routes.js | 3 +- backend/src/utils/cloudinary.js | 2 +- backend/src/utils/socket.js | 36 +++ backend/yarn.lock | 96 +++++++- frontend/components/AssignmentsManager.jsx | 219 ++++++++++++++++++ frontend/components/ChatContainer.jsx | 89 +++++++ frontend/components/ChatHeader.jsx | 37 +++ frontend/components/DashHeader.jsx | 43 ++++ frontend/components/DashboardSidebar.jsx | 44 ++++ frontend/components/MessageInput.jsx | 59 +++++ frontend/components/Modal.jsx | 1 - frontend/components/Navbar.jsx | 51 ++++ frontend/components/NavbarHome.jsx | 75 ++++++ frontend/components/NoChatSelected.jsx | 27 +++ frontend/components/QuoteDisplay.jsx | 54 +++++ frontend/components/RollingQuotes.jsx | 39 ++++ frontend/components/Sidebar.jsx | 89 +++++++ frontend/components/TaskManager.jsx | 164 +++++++++++++ frontend/components/TextAnimate.jsx | 53 +++++ frontend/components/ThemeSwitcher.jsx | 74 ++++++ frontend/context/ModalContext.jsx | 2 +- frontend/context/TaskContext.jsx | 98 ++++++++ frontend/context/ThemeContext.jsx | 47 ++++ frontend/context/apitask.jsx | 33 +++ frontend/package-lock.json | 202 +++++++++++++++- frontend/package.json | 5 +- frontend/pages/Assignments.jsx | 24 ++ frontend/pages/Chat.jsx | 25 +- frontend/pages/ContactUs.jsx | 2 +- frontend/pages/Dashboard.jsx | 27 +++ frontend/pages/Home.jsx | 210 ++++++++--------- frontend/pages/Layout1.jsx | 10 +- frontend/pages/Login.jsx | 128 ++++------ frontend/pages/Signup.jsx | 184 ++++++++------- frontend/pages/styles.css | 153 ------------ frontend/pages/theme.css | 0 frontend/src/App.css | 42 ---- frontend/src/App.jsx | 67 +++++- frontend/src/lib/axios.js | 6 + frontend/src/main.jsx | 28 +-- frontend/src/store/useAssignmentStore.js | 76 ++++++ frontend/src/store/useAuthStore.js | 89 +++++++ frontend/src/store/useChatStore.js | 75 ++++++ frontend/src/store/useTaskStore.js | 75 ++++++ frontend/tailwind.config.js | 6 +- 58 files changed, 2601 insertions(+), 546 deletions(-) create mode 100644 backend/src/controllers/schedule.controllers.js create mode 100644 backend/src/routes/schedule.routes.js create mode 100644 backend/src/utils/socket.js create mode 100644 frontend/components/AssignmentsManager.jsx create mode 100644 frontend/components/ChatContainer.jsx create mode 100644 frontend/components/ChatHeader.jsx create mode 100644 frontend/components/DashHeader.jsx create mode 100644 frontend/components/DashboardSidebar.jsx create mode 100644 frontend/components/MessageInput.jsx create mode 100644 frontend/components/Navbar.jsx create mode 100644 frontend/components/NavbarHome.jsx create mode 100644 frontend/components/NoChatSelected.jsx create mode 100644 frontend/components/QuoteDisplay.jsx create mode 100644 frontend/components/RollingQuotes.jsx create mode 100644 frontend/components/Sidebar.jsx create mode 100644 frontend/components/TaskManager.jsx create mode 100644 frontend/components/TextAnimate.jsx create mode 100644 frontend/components/ThemeSwitcher.jsx create mode 100644 frontend/context/TaskContext.jsx create mode 100644 frontend/context/ThemeContext.jsx create mode 100644 frontend/context/apitask.jsx create mode 100644 frontend/pages/Assignments.jsx create mode 100644 frontend/pages/Dashboard.jsx create mode 100644 frontend/pages/theme.css create mode 100644 frontend/src/lib/axios.js create mode 100644 frontend/src/store/useAssignmentStore.js create mode 100644 frontend/src/store/useAuthStore.js create mode 100644 frontend/src/store/useChatStore.js create mode 100644 frontend/src/store/useTaskStore.js diff --git a/backend/package.json b/backend/package.json index 607e9e8..2498fb4 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,7 +19,8 @@ "jsonwebtoken": "^9.0.2", "mongoose": "^8.9.5", "mongoose-aggregate-paginate-v2": "^1.1.3", - "multer": "^1.4.5-lts.1" + "multer": "^1.4.5-lts.1", + "socket.io": "^4.8.1" }, "devDependencies": { "nodemon": "^3.1.9", diff --git a/backend/src/app.js b/backend/src/app.js index afe7745..0dc4b90 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -6,7 +6,7 @@ const app = express(); app.use( cors({ - origin: process.env.CORS_ORIGIN, + origin: "http://localhost:5173", credentials: true, }) ); diff --git a/backend/src/controllers/assignment.controllers.js b/backend/src/controllers/assignment.controllers.js index de9761f..1f6d6cd 100644 --- a/backend/src/controllers/assignment.controllers.js +++ b/backend/src/controllers/assignment.controllers.js @@ -2,7 +2,8 @@ import { Assignment } from "../models/assignment.models.js"; import { ApiError } from "../utils/ApiError.js"; import { ApiResponse } from "../utils/ApiResponse.js"; import { asyncHandler } from "../utils/asyncHandler.js"; -import { uploadToCloud } from "../utils/cloudinary.js"; +import { uploadToCloud, cloud } from "../utils/cloudinary.js"; +import mongoose, { isValidObjectId } from "mongoose"; const createAssignment = asyncHandler(async (req, res) => { const { title, description, due_date } = req.body; @@ -17,7 +18,7 @@ const createAssignment = asyncHandler(async (req, res) => { console.log(localPath); const doc = await uploadToCloud(localPath); - return doc.url; + return doc?.url; }) : []; @@ -49,9 +50,9 @@ const getUserAssignments = asyncHandler(async (req, res) => { createdAt: -1, }); - if (!assignments.length) { - throw new ApiError(404, "No assignments found for this user..."); - } + // if (!assignments.length) { + // throw new ApiError(404, "No assignments found for this user..."); + // } return res .status(200) @@ -129,7 +130,7 @@ const deleteAssignment = asyncHandler(async (req, res) => { const deleteFilePromises = assignment.docs.map(async (fileUrl) => { try { const publicId = fileUrl.split("/").pop().split(".")[0]; // Extract public ID (got this from stackoverflow) - await cloudinary.uploader.destroy(publicId); + await cloud.uploader.destroy(publicId); } catch (error) { console.error(`Failed to delete file: ${fileUrl}`, error); } @@ -142,4 +143,9 @@ const deleteAssignment = asyncHandler(async (req, res) => { return res.status(200).json(new ApiResponse(200, {}, "Khatam tata bye bye")); }); -export { createAssignment, getUserAssignments, updateAssignment, deleteAssignment }; +export { + createAssignment, + getUserAssignments, + updateAssignment, + deleteAssignment, +}; diff --git a/backend/src/controllers/message.controller.js b/backend/src/controllers/message.controller.js index 55d6702..19a6f0e 100644 --- a/backend/src/controllers/message.controller.js +++ b/backend/src/controllers/message.controller.js @@ -4,6 +4,7 @@ import { ApiError } from "../utils/ApiError.js"; import { ApiResponse } from "../utils/ApiResponse.js"; import { asyncHandler } from "../utils/asyncHandler.js"; import { uploadToCloud } from "../utils/cloudinary.js"; +import { getReceiverSocketId, io } from "../utils/socket.js"; const getUsers = asyncHandler(async (req, res) => { try { @@ -35,8 +36,8 @@ const getMessages = asyncHandler(async (req, res) => { // Fetching messages const messages = await Message.find({ $or: [ - { sender: loggedUserId, receiver: receiverId }, - { sender: receiverId, receiver: loggedUserId }, + { senderId: loggedUserId, receiverId: receiverId }, + { senderId: receiverId, receiverId: loggedUserId }, ], }).sort({ createdAt: 1 }); @@ -73,8 +74,8 @@ const sendMessage = asyncHandler(async (req, res) => { } const message = await Message.create({ - sender: loggedUserId, - receiver: receiverId, + senderId: loggedUserId, + receiverId: receiverId, text, doc: doc ? doc.url : null, }); @@ -83,6 +84,11 @@ const sendMessage = asyncHandler(async (req, res) => { throw new ApiError(400, "Message couldn't be saved"); } + const receiverSocketId = getReceiverSocketId(receiverId); + if (receiverSocketId) { + io.to(receiverSocketId).emit("newMessage", message); + } + return res.status(201).json(new ApiResponse(201, message, "Message sent")); } catch (error) { console.error("Error in sendMessage: ", error.message); @@ -90,4 +96,4 @@ const sendMessage = asyncHandler(async (req, res) => { } }); -export { getUsers, getMessages, sendMessage }; \ No newline at end of file +export { getUsers, getMessages, sendMessage }; diff --git a/backend/src/controllers/schedule.controllers.js b/backend/src/controllers/schedule.controllers.js new file mode 100644 index 0000000..d8bf0e5 --- /dev/null +++ b/backend/src/controllers/schedule.controllers.js @@ -0,0 +1,74 @@ +import { Schedule } from "../models/schedules.models.js"; +import { ApiError } from "../utils/ApiError.js"; +import { ApiResponse } from "../utils/ApiResponse.js"; +import { asyncHandler } from "../utils/asyncHandler.js"; +import mongoose from "mongoose"; + +// const createSchedule = asyncHandler(async (req, res) => { +// const { reminderDate, assignmentId, taskId, message } = req.body; + +// if (!reminderDate) { +// throw new ApiError(400, "date is required"); +// } + +// if (assignmentId && taskId) { +// throw new ApiError( +// 400, +// "Schedule can be linked to either an assignment or a task, not both." +// ); +// } + +// const schedule = await Schedule.create({ +// user: req.user._id, +// reminderDate, +// assignmentId: assignmentId || null, +// taskId: taskId || null, +// message: message || "Karle Bhai Complete", +// }); + +// return res +// .status(201) +// .json(new ApiResponse(201, schedule, "Schedule Bangaya 🤩!")); +// }); + +const getUserSchedules = asyncHandler(async (req, res) => { + const userId = req.user._id; + + const schedules = await Schedule.find({ user: userId }) + .populate("assignmentId", "title due_date") + .populate("taskId", "title deadline") + .sort({ reminderDate: 1 }); + + if (!schedules.length) { + throw new ApiError(404, "No Schedule"); + } + + return res + .status(200) + .json(new ApiResponse(200, schedules, "Schedules Fetched Successfully")); +}); + +const deleteSchedule = asyncHandler(async (req, res) => { + const { scheduleId } = req.params; + + if (!mongoose.Types.ObjectId.isValid(scheduleId)) { + throw new ApiError(400, "Invalid ScheduleId."); + } + + const schedule = await Schedule.findOne({ + _id: scheduleId, + user: req.user._id, + }); + + if (!schedule) { + throw new ApiError(404, "Schedule not found or unauthorized access"); + } + + await Schedule.findByIdAndDelete(scheduleId); + + return res + .status(200) + .json(new ApiResponse(200, {}, "Schedule Deleted Successfully")); +}); + +export { getUserSchedules, deleteSchedule }; diff --git a/backend/src/controllers/task.controller.js b/backend/src/controllers/task.controller.js index 6d1b6b4..4ff17d2 100644 --- a/backend/src/controllers/task.controller.js +++ b/backend/src/controllers/task.controller.js @@ -2,6 +2,7 @@ import { Task } from "../models/task.models.js"; import { ApiError } from "../utils/ApiError.js"; import { ApiResponse } from "../utils/ApiResponse.js"; import { asyncHandler } from "../utils/asyncHandler.js"; +import mongoose from "mongoose"; const createTask = asyncHandler(async (req, res) => { const { title, description, due_date } = req.body; @@ -10,6 +11,8 @@ const createTask = asyncHandler(async (req, res) => { throw new ApiError(400, "Some fields are required fields"); } + if (!title || !description) throw new ApiError(400, "Not present"); + const task = await Task.create({ title, description, @@ -35,9 +38,9 @@ const getUserTasks = asyncHandler(async (req, res) => { createdAt: -1, }); - if (!tasks.length) { - throw new ApiError(404, "No tasks found for this user..."); - } + // if (!tasks.length) { + // throw new ApiError(404, "No tasks found for this user..."); + // } return res.status(200).json(new ApiResponse(200, tasks, "Tasks Fetched")); }); @@ -47,7 +50,7 @@ const updateTask = asyncHandler(async (req, res) => { const { title, description, due_date } = req.body; // Validate ObjectId - if (!isValidObjectId(taskId)) { + if (!mongoose.isValidObjectId(taskId)) { throw new ApiError(400, "Invalid Task ID"); } diff --git a/backend/src/controllers/user.controllers.js b/backend/src/controllers/user.controllers.js index 5fce2d6..00503ce 100644 --- a/backend/src/controllers/user.controllers.js +++ b/backend/src/controllers/user.controllers.js @@ -27,6 +27,7 @@ const generateAccessRefreshTokens = async (userId) => { const register = asyncHandler(async (req, res) => { // Get Data from req.body const { fullName, username, email, password } = req.body; + if(!fullName) console.log("Nahi mila"); if ([fullName, email, username, password].some((field) => !field?.trim())) { throw new ApiError(400, "Fill all fields"); @@ -63,12 +64,23 @@ const register = asyncHandler(async (req, res) => { }); const userFromDB = await User.findById(user._id).select( - "-password -refresh-token" + "-password -refreshToken" + ); + + const { accessToken, refreshToken } = await generateAccessRefreshTokens( + user._id ); + const cookieOptions = { + httpOnly: true, + secure: true, + }; + // Returned Created user and message return res .status(201) + .cookie("accessToken", accessToken, cookieOptions) + .cookie("refreshToken", refreshToken, cookieOptions) .json(new ApiResponse(200, userFromDB, "User Ban Gaya 🤩!")); }); @@ -78,7 +90,7 @@ const login = asyncHandler(async (req, res) => { // Validation if (!username && !email) { - throw new ApiError(400, "username or password is required"); + throw new ApiError(400, "username or email is required"); } // find user in database @@ -208,7 +220,7 @@ const refreshAccessToken = asyncHandler(async (req, res) => { const getCurrentUser = asyncHandler(async (req, res) => { return res .status(200) - .json(200, req.user, "Current User Fetched successfully"); + .json(new ApiResponse(200, req.user, "Current User Data")); }); export { register, login, logout, refreshAccessToken, getCurrentUser }; diff --git a/backend/src/index.js b/backend/src/index.js index 32aa522..936aaca 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -1,17 +1,63 @@ +import express from "express"; // dotenv for env variable access throughout the project import "dotenv/config"; +import cookieParser from "cookie-parser"; +import cors from "cors"; // this file will handle core routing logic and route controllers -import { app } from "./app.js"; +import { app, server } from "./utils/socket.js"; // mongodb connection import connectDB from "./db/db.js"; const PORT = process.env.PORT || 8000; +app.use(express.json({ limit: "16kb" })); +app.use(express.urlencoded({ extended: true, limit: "16kb" })); + +// Configuring express to mark public as static storage folder +app.use(express.static("public")); + +// Cookie Parser configuration for tokens +app.use(cookieParser()); + +app.use( + cors({ + origin: "http://localhost:5173", + credentials: true, + }) +); + +import userRouter from "./routes/user.routes.js"; +import assignmentRouter from "./routes/assignment.routes.js"; +import taskRouter from "./routes/task.routes.js"; +import messageRouter from "./routes/message.routes.js"; +import scheduleRouter from "./routes/schedule.routes.js"; + +// Routes Declaration +app.use("/users", userRouter); +app.use("/assignments", assignmentRouter); +app.use("/tasks", taskRouter); +app.use("/messages", messageRouter); +app.use("/schedules", scheduleRouter); + +app.get("/quote", async (req, res) => { + try { + const response = await fetch("https://zenquotes.io/api/random"); + if (!response.ok) throw new Error("Failed to fetch quote"); + + const data = await response.json(); + res.json(data); + console.log("Quote fetched from ZenQuotes API"); + } catch (error) { + console.error("Error fetching quote from ZenQuotes API:", error); + res.status(500).json({ error: "Failed to fetch quote from ZenQuotes" }); + } +}); + connectDB() .then(() => { - app.listen(PORT, () => { + server.listen(PORT, () => { console.log(`🤖 Server running on port ${PORT}`); }); }) diff --git a/backend/src/middlewares/auth.middleware.js b/backend/src/middlewares/auth.middleware.js index 6bba5a3..a0b3365 100644 --- a/backend/src/middlewares/auth.middleware.js +++ b/backend/src/middlewares/auth.middleware.js @@ -22,6 +22,6 @@ export const verifyJWT = asyncHandler(async (req, _, next) => { req.user = user; next(); } catch (err) { - throw new ApiError(401, "Something went wrong"); + throw new ApiError(401, err); } }); diff --git a/backend/src/models/assignment.models.js b/backend/src/models/assignment.models.js index d688a6a..f72e88d 100644 --- a/backend/src/models/assignment.models.js +++ b/backend/src/models/assignment.models.js @@ -1,4 +1,5 @@ import mongoose, { Schema } from "mongoose"; +import { Schedule } from "./schedules.models.js"; const assignmentSchema = new Schema( { @@ -33,4 +34,26 @@ const assignmentSchema = new Schema( } ); +assignmentSchema.post("save", async function (doc, next) { + try { + await Schedule.create({ + user: doc.user, + reminderDate: doc.due_date, + assignmentId: doc._id, + message: `Reminder: Complete the assignment "${doc.title}"`, + }); + console.log("Schedule created for Assignment:", doc.title); + } catch (error) { + console.error("Error creating schedule for assignment:", error); + } + next(); +}); + +assignmentSchema.post("findOneAndDelete", async function (doc) { + if (doc) { + await Schedule.deleteMany({ assignmentId: doc._id }); + console.log("Deleted schedule for assignment:", doc.title); + } +}); + export const Assignment = mongoose.model("Assignment", assignmentSchema); diff --git a/backend/src/models/schedules.models.js b/backend/src/models/schedules.models.js index 0456839..bd512fd 100644 --- a/backend/src/models/schedules.models.js +++ b/backend/src/models/schedules.models.js @@ -13,6 +13,12 @@ const scheduleSchema = new Schema( assignmentId: { type: Schema.Types.ObjectId, ref: "Assignment", + default: null, + }, + taskId: { + type: Schema.Types.ObjectId, + ref: "Task", + default: null, }, message: { type: String, @@ -28,4 +34,4 @@ const scheduleSchema = new Schema( } ); -export const Task = mongoose.model("Task", scheduleSchema); +export const Schedule = mongoose.model("Schedule", scheduleSchema); diff --git a/backend/src/models/task.models.js b/backend/src/models/task.models.js index e593a99..28efefd 100644 --- a/backend/src/models/task.models.js +++ b/backend/src/models/task.models.js @@ -1,4 +1,5 @@ import mongoose, { Schema } from "mongoose"; +import { Schedule } from "./schedules.models.js"; const taskSchema = new Schema( { @@ -27,4 +28,33 @@ const taskSchema = new Schema( } ); +taskSchema.pre("save", function (next) { + if (typeof this.due_date === "string") { + this.due_date = new Date(this.due_date); + } + next(); +}); + +taskSchema.post("save", async function (doc, next) { + try { + await Schedule.create({ + user: doc.user, + reminderDate: doc.due_date, + taskId: doc._id, + message: `Reminder: Complete the task "${doc.title}"`, + }); + console.log("Schedule created for Task:", doc.title); + } catch (error) { + console.error("Error creating schedule for task:", error); + } + next(); +}); + +taskSchema.post("findOneAndDelete", async function (doc) { + if (doc) { + await Schedule.deleteMany({ taskId: doc._id }); + console.log("Deleted schedule for task:", doc.title); + } +}); + export const Task = mongoose.model("Task", taskSchema); diff --git a/backend/src/routes/schedule.routes.js b/backend/src/routes/schedule.routes.js new file mode 100644 index 0000000..f10ac88 --- /dev/null +++ b/backend/src/routes/schedule.routes.js @@ -0,0 +1,21 @@ +import { Router } from "express"; +import { verifyJWT } from "../middlewares/auth.middleware.js"; +import { + getUserSchedules, + deleteSchedule, +} from "../controllers/schedule.controllers.js"; + +const router = Router(); + +router.use(verifyJWT); + +// Create a new schedule +// router.route("/").post(createSchedule); + +// Fetch all schedules of the current user +router.route("/getSchedules").get(getUserSchedules); + +// Delete a schedule +router.route("/:scheduleId").delete(deleteSchedule); + +export default router; diff --git a/backend/src/routes/task.routes.js b/backend/src/routes/task.routes.js index e6961ca..708432c 100644 --- a/backend/src/routes/task.routes.js +++ b/backend/src/routes/task.routes.js @@ -1,5 +1,6 @@ import { Router } from "express"; import { verifyJWT } from "../middlewares/auth.middleware.js"; +import { upload } from "../middlewares/multer.middleware.js"; import { createTask, getUserTasks, @@ -10,7 +11,7 @@ const router = Router(); router.use(verifyJWT); -router.route("/").post(createTask); +router.route("/").post(upload.none(), createTask); // Fetch all tasks of current user router.route("/getTasks").get(getUserTasks); diff --git a/backend/src/utils/cloudinary.js b/backend/src/utils/cloudinary.js index bd9ab30..cbcb287 100644 --- a/backend/src/utils/cloudinary.js +++ b/backend/src/utils/cloudinary.js @@ -40,4 +40,4 @@ const uploadToCloud = async (localPath) => { } }; -export { uploadToCloud }; +export { uploadToCloud, cloud }; diff --git a/backend/src/utils/socket.js b/backend/src/utils/socket.js new file mode 100644 index 0000000..01810cf --- /dev/null +++ b/backend/src/utils/socket.js @@ -0,0 +1,36 @@ +import { Server } from "socket.io"; +import http from "http"; +import express from "express"; + +const app = express(); +const server = http.createServer(app); + +const io = new Server(server, { + cors: { + origin: ["http://localhost:5173"], + }, +}); + +export function getReceiverSocketId(userId) { + return userSocketMap[userId]; +} + +const userSocketMap = {}; + +io.on("connection", (socket) => { + console.log("A user connected", socket.id); + + const userId = socket.handshake.query.userId; + if (userId) userSocketMap[userId] = socket.id; + + // io.emit() is used to send events to all the connected clients + io.emit("getOnlineUsers", Object.keys(userSocketMap)); + + socket.on("disconnect", () => { + console.log("A user disconnected", socket.id); + delete userSocketMap[userId]; + io.emit("getOnlineUsers", Object.keys(userSocketMap)); + }); +}); + +export { io, app, server }; diff --git a/backend/yarn.lock b/backend/yarn.lock index 0dc290b..247ff6b 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -24,6 +24,25 @@ dependencies: sparse-bitfield "^3.0.3" +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "22.13.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.1.tgz#a2a3fefbdeb7ba6b89f40371842162fac0934f33" + integrity sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew== + dependencies: + undici-types "~6.20.0" + "@types/webidl-conversions@*": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" @@ -41,7 +60,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -97,6 +116,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + bcrypt@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.1.1.tgz#0f732c6dcb4e12e5b70a25e326a72965879ba6e2" @@ -269,7 +293,7 @@ cookie@0.7.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== -cookie@0.7.2: +cookie@0.7.2, cookie@~0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -279,7 +303,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.5: +cors@^2.8.5, cors@~2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -301,6 +325,13 @@ debug@4, debug@4.x, debug@^4: dependencies: ms "^2.1.3" +debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -362,6 +393,26 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +engine.io@~6.6.0: + version "6.6.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" + integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== + dependencies: + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.7.2" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" @@ -1198,6 +1249,35 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" +socket.io-adapter@~2.5.2: + version "2.5.5" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" + integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== + dependencies: + debug "~4.3.4" + ws "~8.17.1" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" + integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.6.0" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + sparse-bitfield@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" @@ -1311,6 +1391,11 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -1369,6 +1454,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" diff --git a/frontend/components/AssignmentsManager.jsx b/frontend/components/AssignmentsManager.jsx new file mode 100644 index 0000000..cfa505f --- /dev/null +++ b/frontend/components/AssignmentsManager.jsx @@ -0,0 +1,219 @@ +import { useState, useEffect } from "react"; +import { useAssignmentStore } from "../src/store/useAssignmentStore"; +import { useTheme } from "../context/ThemeContext"; +import { LuUpload } from "react-icons/lu"; +import { FaFileAlt } from "react-icons/fa"; + +export default function AssignmentsManager() { + const theme = useTheme(); + const { + assignments, + fetchAssignments, + createAssignment, + updateAssignment, + deleteAssignment, + isLoading, + error, + } = useAssignmentStore(); + + const [assignmentData, setAssignmentData] = useState({ + title: "", + description: "", + due_date: "", + docs: [], + }); + const [editingId, setEditingId] = useState(null); + + useEffect(() => { + fetchAssignments(); + }, [fetchAssignments]); + + const handleFileChange = (e) => { + const files = Array.from(e.target.files); + setAssignmentData((prev) => ({ ...prev, docs: [...prev.docs, ...files] })); + }; + + const removeFile = (index) => { + setAssignmentData((prev) => ({ + ...prev, + docs: prev.docs.filter((_, i) => i !== index), + })); + }; + + const handleEdit = (assignment) => { + setEditingId(assignment._id); + setAssignmentData({ + title: assignment.title, + description: assignment.description, + due_date: assignment.due_date || "", + docs: [], + }); + }; + + const handleCancelEdit = () => { + setEditingId(null); + setAssignmentData({ title: "", description: "", due_date: "", docs: [] }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + const formData = new FormData(); + formData.append("title", assignmentData.title); + formData.append("description", assignmentData.description); + formData.append("due_date", assignmentData.due_date); + assignmentData.docs.forEach((file) => formData.append("docs", file)); + if (editingId) { + await updateAssignment(editingId, formData); + } else { + await createAssignment(formData); + } + handleCancelEdit(); + fetchAssignments(); + }; + + return ( +
+
+
+

+ {editingId ? "Edit Assignment" : "Assignments"} +

+ + {error &&

{error}

} + +
+ + + setAssignmentData({ ...assignmentData, title: e.target.value }) + } + className="input input-bordered w-full" + /> + + + + setAssignmentData({ + ...assignmentData, + due_date: e.target.value, + }) + } + className="input input-bordered w-full" + /> + + + + + +
+ +
+ + {assignmentData.docs?.length > 0 && ( +
+ {assignmentData.docs.map((file, index) => ( +
+ {file.name} + +
+ ))} +
+ )} + +
+ + {editingId && ( + + )} +
+
+
+
+ + {isLoading && ( +

Loading assignments...

+ )} + +
+
+ ); +} diff --git a/frontend/components/ChatContainer.jsx b/frontend/components/ChatContainer.jsx new file mode 100644 index 0000000..67be2cd --- /dev/null +++ b/frontend/components/ChatContainer.jsx @@ -0,0 +1,89 @@ +import { useChatStore } from "../src/store/useChatStore.js"; +import { useAuthStore } from "../src/store/useAuthStore.js"; +import { useEffect, useRef } from "react"; +import ChatHeader from "./ChatHeader"; +import MessageInput from "./MessageInput"; + +function ChatContainer() { + // StackOverflow + AI + function formatMessageTime(date) { + return new Date(date).toLocaleTimeString("en-US", { + hour: "2-digit", + minute: "2-digit", + hour12: false, + }); + } + const { + messages, + getMessages, + isMessagesLoading, + currentUser, + updateOnRealtime, + removeUpdateOnRealtime, + } = useChatStore(); + const { authUser } = useAuthStore(); + const messageEndRef = useRef(null); + + useEffect(() => { + getMessages(currentUser._id); + updateOnRealtime(); + + return () => removeUpdateOnRealtime(); + }, [currentUser._id, getMessages, updateOnRealtime, removeUpdateOnRealtime]); + + useEffect(() => { + const scrollToBottom = () => { + messageEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }; + + scrollToBottom(); + }, [messages]); + + if (isMessagesLoading) { + return
Loading...
; + } + + return ( +
+ + +
+ {messages.map((message) => ( +
+
+
+ profile pic +
+
+
+ +
+
+

{message.text}

+
+
+ ))} +
+ + +
+ ); +} + +export default ChatContainer; diff --git a/frontend/components/ChatHeader.jsx b/frontend/components/ChatHeader.jsx new file mode 100644 index 0000000..afe4251 --- /dev/null +++ b/frontend/components/ChatHeader.jsx @@ -0,0 +1,37 @@ +import { RxCross1 } from "react-icons/rx"; +import { useAuthStore } from "../src/store/useAuthStore"; +import { useChatStore } from "../src/store/useChatStore"; + +const ChatHeader = () => { + const { currentUser, setCurrentUser } = useChatStore(); + const { onlineUsers } = useAuthStore(); + + return ( +
+
+
+ {/* Avatar */} +
+
+ {currentUser.fullName} +
+
+ + {/* User info */} +
+

{currentUser.fullName}

+

+ {onlineUsers.includes(currentUser._id) ? "Online" : "Offline"} +

+
+
+ + {/* Close button */} + +
+
+ ); +}; +export default ChatHeader; \ No newline at end of file diff --git a/frontend/components/DashHeader.jsx b/frontend/components/DashHeader.jsx new file mode 100644 index 0000000..68fb72e --- /dev/null +++ b/frontend/components/DashHeader.jsx @@ -0,0 +1,43 @@ +import { HiOutlineMenuAlt2 } from "react-icons/hi"; +import { HiOutlineBadgeCheck } from "react-icons/hi"; +import ThemeSwitcher from './ThemeSwitcher'; +import { useTheme } from "../context/ThemeContext"; // Import theme context + +const DashHeader = () => { + const { theme } = useTheme(); // Get the current theme + + return ( + + ); +} + +export default DashHeader; \ No newline at end of file diff --git a/frontend/components/DashboardSidebar.jsx b/frontend/components/DashboardSidebar.jsx new file mode 100644 index 0000000..54af467 --- /dev/null +++ b/frontend/components/DashboardSidebar.jsx @@ -0,0 +1,44 @@ +import { + HiOutlineViewGrid, + HiOutlineClipboardList, + HiOutlineChartBar, + HiOutlineChatAlt, + HiOutlineLogout, +} from "react-icons/hi"; +import { Link } from "react-router-dom"; + +const DashboardSidebar = () => { + return ( +
+
    +
  • + + Dashboard + +
  • +
  • + + Assignments + +
  • +
  • + + Heatmap + +
  • +
  • + + Chats + +
  • +
  • + + Logout + +
  • +
+
+ ); +}; + +export default DashboardSidebar; diff --git a/frontend/components/MessageInput.jsx b/frontend/components/MessageInput.jsx new file mode 100644 index 0000000..7ca52bd --- /dev/null +++ b/frontend/components/MessageInput.jsx @@ -0,0 +1,59 @@ +import { useState } from "react"; +import { useChatStore } from "../src/store/useChatStore"; +import { LuSend } from "react-icons/lu"; +// import toast from "react-hot-toast"; + +const MessageInput = () => { + const [messageText, setMessageText] = useState(""); + const { sendMessage } = useChatStore(); + + const handleSendMessage = async (e) => { + e.preventDefault(); + if (messageText.trim() === "") return; + + try { + await sendMessage({ + text: messageText.trim(), + }); + // Clear form + setMessageText(""); + } catch (error) { + console.error("Failed to send message:", error); + } + }; + + return ( +
+
+
+ setMessageText(e.target.value)} + /> + {/* + */} +
+ +
+
+ ); +}; +export default MessageInput; diff --git a/frontend/components/Modal.jsx b/frontend/components/Modal.jsx index bd8c7da..5044de9 100644 --- a/frontend/components/Modal.jsx +++ b/frontend/components/Modal.jsx @@ -1,4 +1,3 @@ -import React from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { useModal } from '../context/ModalContext'; diff --git a/frontend/components/Navbar.jsx b/frontend/components/Navbar.jsx new file mode 100644 index 0000000..d71e3a9 --- /dev/null +++ b/frontend/components/Navbar.jsx @@ -0,0 +1,51 @@ +import { NavLink, useNavigate } from "react-router-dom"; +import { TbLogout } from "react-icons/tb"; +import { useAuthStore } from "../src/store/useAuthStore"; + +function Navbar() { + const navigate = useNavigate(); + const { authUser, logout } = useAuthStore(); + console.log("Auth User:", authUser); + console.log(authUser.username); + + return ( +
+
+ + Your Chats + +
+ +
+
+
+ User Avatar +
+
+
    +
  • + Profile +
  • +
  • + +
  • +
+
+
+ ); +} + +export default Navbar; diff --git a/frontend/components/NavbarHome.jsx b/frontend/components/NavbarHome.jsx new file mode 100644 index 0000000..b3d1fcc --- /dev/null +++ b/frontend/components/NavbarHome.jsx @@ -0,0 +1,75 @@ +import { useState } from "react"; +import { FaSearch, FaBars, FaArrowRight, FaRightToBracket } from "react-icons/fa"; + +const Navbar = () => { + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + return ( +
+ {/* Top navbar */} + + + {/* Bottom navbar (mobile only) */} + +
+ ); +}; + +export default Navbar; diff --git a/frontend/components/NoChatSelected.jsx b/frontend/components/NoChatSelected.jsx new file mode 100644 index 0000000..9f6735d --- /dev/null +++ b/frontend/components/NoChatSelected.jsx @@ -0,0 +1,27 @@ +// import { FaRegMessage } from "react-icons/fa6"; +import { TbMessage } from "react-icons/tb"; + + +function NoChatSelected() { + return ( +
+
+
+
+
+ +
+
+
+

Chat Area

+

+ Select a user from sidebar to start chatting +

+
+
+ ); +} + +export default NoChatSelected; diff --git a/frontend/components/QuoteDisplay.jsx b/frontend/components/QuoteDisplay.jsx new file mode 100644 index 0000000..7d908b3 --- /dev/null +++ b/frontend/components/QuoteDisplay.jsx @@ -0,0 +1,54 @@ +import { useState, useEffect } from "react"; +import axios from "axios"; +import { useTheme } from "../context/ThemeContext"; +import { axiosInstance } from "../src/lib/axios"; +const QuoteDisplay = () => { + const { theme } = useTheme(); // Get theme state + const [quote, setQuote] = useState(""); + const [author, setAuthor] = useState(""); + const [loading, setLoading] = useState(true); + + // Fetch a random quote from ZenQuote API + const fetchQuote = async () => { + try { + const response = await axiosInstance.get('/quote') + setQuote(response.data[0].q); + setAuthor(response.data[0].a); + setLoading(false); + } catch (error) { + console.error("Error fetching quote:", error); + setLoading(false); + } + }; + + useEffect(() => { + fetchQuote(); // Fetch the quote when the component mounts + }, []); + + return ( +
+ {loading ? ( +

Loading quote...

+ ) : ( +
+
+ {quote} +
+

+ - {author} +

+
+ )} +
+ ); +}; + +export default QuoteDisplay; diff --git a/frontend/components/RollingQuotes.jsx b/frontend/components/RollingQuotes.jsx new file mode 100644 index 0000000..225dd28 --- /dev/null +++ b/frontend/components/RollingQuotes.jsx @@ -0,0 +1,39 @@ +import { useState, useEffect } from "react"; +import { motion } from "framer-motion"; + +export default function RollingQuotes() { + const quotes = [ + "The best way to predict the future is to create it.", + "Success is not final, failure is not fatal: It is the courage to continue that counts.", + "Believe you can and you're halfway there.", + "The only limit to our realization of tomorrow is our doubts of today.", + "The future belongs to those who learn more skills and combine them in creative ways. – Robert Greene", + ]; + + const [currentQuote, setCurrentQuote] = useState(0); + + // Automatically switch to the next quote every 3 seconds + useEffect(() => { + const interval = setInterval(() => { + setCurrentQuote((prevQuote) => (prevQuote + 1) % quotes.length); + ease: "easeInOut"; + }, 2000); // Change quote every 3 seconds + + return () => clearInterval(interval); // Clean up interval on component unmount + }, []); + + return ( +
+ +

{quotes[currentQuote]}

+
+
+ ); +} diff --git a/frontend/components/Sidebar.jsx b/frontend/components/Sidebar.jsx new file mode 100644 index 0000000..8841b06 --- /dev/null +++ b/frontend/components/Sidebar.jsx @@ -0,0 +1,89 @@ +import { useEffect, useState } from "react"; +import { useChatStore } from "../src/store/useChatStore"; +// import { useAuthStore } from "../src/store/useAuthStore"; +import { LuUsers } from "react-icons/lu"; +import { useAuthStore } from "../src/store/useAuthStore"; + +function Sidebar() { + const { getUsers, users, currentUser, setCurrentUser, isUsersLoading } = + useChatStore(); + + const { onlineUsers } = useAuthStore(); + const [showOnlineOnly, setShowOnlineOnly] = useState(false); + + useEffect(() => { + getUsers(); + }, [getUsers]); + + const filteredUsers = showOnlineOnly + ? users.filter((user) => onlineUsers.includes(user._id)) + : users; + + // if (isUsersLoading) return (
Loading...
); + return ( + + ); +} + +export default Sidebar; diff --git a/frontend/components/TaskManager.jsx b/frontend/components/TaskManager.jsx new file mode 100644 index 0000000..7b7d0e0 --- /dev/null +++ b/frontend/components/TaskManager.jsx @@ -0,0 +1,164 @@ +import { useState, useEffect } from "react"; +import useTaskStore from "../src/store/useTaskStore.js"; +import { useTheme } from "../context/ThemeContext"; + +export default function TaskManager() { + const { theme } = useTheme(); + const { + tasks, + fetchTasks, + handleCreate, + handleUpdate, + handleDelete, + isLoading, + error, + } = useTaskStore(); + + const [taskData, setTaskData] = useState({ + title: "", + description: "", + due_date: "", + }); + const [editingId, setEditingId] = useState(null); + + useEffect(() => { + fetchTasks(); + }, [fetchTasks]); + + const handleEdit = (task) => { + setEditingId(task._id); + setTaskData({ + title: task.title, + description: task.description, + due_date: task.due_date ? task.due_date.split("T")[0] : "", // Extract "YYYY-MM-DD" + }); + }; + + const handleCancelEdit = () => { + setEditingId(null); + setTaskData({ title: "", description: "", due_date: "" }); + }; + + const handleSubmit = async () => { + if (editingId) { + await handleUpdate(editingId, taskData); + } else { + await handleCreate(taskData); + } + handleCancelEdit(); + }; + + return ( +
+
+
+

+ {editingId ? "Edit Task" : "Task Manager"} +

+ {error &&

{error}

} +
+ + + setTaskData({ ...taskData, title: e.target.value }) + } + className="input input-bordered w-full" + /> + + + setTaskData({ ...taskData, due_date: e.target.value }) + } + className="input input-bordered w-full" + /> + + +
+ + {editingId && ( + + )} +
+
+
+
+ + {isLoading && ( +

Loading tasks...

+ )} + +
+ {tasks.length > 0 + ? tasks.map((task) => ( +
+
+

{task.title}

+

+ {task.description} +

+

+ Due:{" "} + {task.due_date + ? task.due_date.split("T")[0] + : "No date set"} +

+
+ + +
+
+
+ )) + : !isLoading && ( +

+ No tasks found. Add a new task to get started! +

+ )} +
+
+ ); +} diff --git a/frontend/components/TextAnimate.jsx b/frontend/components/TextAnimate.jsx new file mode 100644 index 0000000..4b84b1e --- /dev/null +++ b/frontend/components/TextAnimate.jsx @@ -0,0 +1,53 @@ +import { useRef } from "react"; +import PropTypes from "prop-types"; +import { motion, useInView } from "framer-motion"; + +const animationVariants = { + fadeIn: { + hidden: { opacity: 0 }, + visible: { opacity: 1, transition: { staggerChildren: 0.05 } }, + }, + fadeInUp: { + hidden: { opacity: 0, y: 20 }, + visible: { opacity: 1, y: 0, transition: { duration: 0.5 } }, + }, + popIn: { + hidden: { scale: 0 }, + visible: { + scale: 1, + transition: { type: "spring", damping: 15, stiffness: 400 }, + }, + }, +}; + +const TextAnimate = ({ text, type = "fadeInUp", ...props }) => { + const ref = useRef(null); + const isInView = useInView(ref, { once: true }); + const { hidden, visible } = + animationVariants[type] || animationVariants.fadeIn; + + return ( + + {text.split(" ").map((word, index) => ( + + {word} + + ))} + + ); +}; +TextAnimate.propTypes = { + text: PropTypes.string.isRequired, + type: PropTypes.oneOf(["fadeIn", "fadeInUp", "popIn"]), +}; + +export { TextAnimate }; diff --git a/frontend/components/ThemeSwitcher.jsx b/frontend/components/ThemeSwitcher.jsx new file mode 100644 index 0000000..42978c0 --- /dev/null +++ b/frontend/components/ThemeSwitcher.jsx @@ -0,0 +1,74 @@ +import { useTheme } from "../context/ThemeContext"; // Import the custom hook +import { FaMoon, FaSun } from "react-icons/fa"; + +const ThemeSwitcher = () => { + const { theme, toggleTheme } = useTheme(); + + return ( + <> + + + + + ); +}; + +export default ThemeSwitcher; \ No newline at end of file diff --git a/frontend/context/ModalContext.jsx b/frontend/context/ModalContext.jsx index 404d969..1b95c40 100644 --- a/frontend/context/ModalContext.jsx +++ b/frontend/context/ModalContext.jsx @@ -1,4 +1,4 @@ -import React, { createContext, useState, useContext } from 'react'; +import { createContext, useState, useContext } from 'react'; const ModalContext = createContext(); diff --git a/frontend/context/TaskContext.jsx b/frontend/context/TaskContext.jsx new file mode 100644 index 0000000..acc0e87 --- /dev/null +++ b/frontend/context/TaskContext.jsx @@ -0,0 +1,98 @@ +import { createContext, useState, useContext, useEffect } from "react"; +import { createTask, getUserTasks, updateTask, deleteTask } from "./apitask"; // Import API functions + +// Create Context +const TaskContext = createContext(); + +// Custom hook to use TaskContext +export const useTasks = () => { + return useContext(TaskContext); +}; + +// Function to validate MongoDB ObjectId +const isValidObjectId = (id) => /^[a-f\d]{24}$/i.test(id); + + +// TaskProvider Component +export const TaskProvider = ({ children }) => { + const [tasks, setTasks] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + // Fetch tasks from API + const fetchTasks = async () => { + setIsLoading(true); + try { + const response = await getUserTasks(); + setTasks(response.data.data); // Assuming response.data.data holds the tasks array + } catch (err) { + setError(err.response?.data?.message || "Error fetching tasks"); + console.error(err); + } finally { + setIsLoading(false); + } + }; + + // Add a new task + const handleCreate = async (taskData) => { + setIsLoading(true); + try { + await createTask(taskData); + fetchTasks(); // Refresh task list + } catch (err) { + setError(err.response?.data?.message || "Error creating task"); + console.error(err); + } finally { + setIsLoading(false); + } + }; + + // Update an existing task + const handleUpdate = async (taskId, taskData) => { + if (!isValidObjectId(taskId)) { + setError("Invalid Task ID"); + return; + } + + setIsLoading(true); + try { + await updateTask(taskId, taskData); + fetchTasks(); // Refresh task list + } catch (err) { + setError(err.response?.data?.message || "Error updating task"); + console.error(err); + } finally { + setIsLoading(false); + } + }; + + // Delete a task + const handleDelete = async (taskId) => { + if (!isValidObjectId(taskId)) { + setError("Invalid Task ID"); + return; + } + + setIsLoading(true); + try { + await deleteTask(taskId); + fetchTasks(); // Refresh task list + } catch (err) { + setError(err.response?.data?.message || "Error deleting task"); + console.error(err); + } finally { + setIsLoading(false); + } + }; + + // Load tasks when component mounts + useEffect(() => { + fetchTasks(); + }, []); + + return ( + + {children} + + ); +}; \ No newline at end of file diff --git a/frontend/context/ThemeContext.jsx b/frontend/context/ThemeContext.jsx new file mode 100644 index 0000000..74a891e --- /dev/null +++ b/frontend/context/ThemeContext.jsx @@ -0,0 +1,47 @@ +import { createContext, useContext, useEffect, useState } from "react"; +import PropTypes from "prop-types"; + +// Create a context +const ThemeContext = createContext(); + +// Custom hook to use the theme context +export const useTheme = () => useContext(ThemeContext); + +// Theme provider component +export function ThemeProvider({ children }) { + const storedTheme = localStorage.getItem("theme") || "light"; + const [theme, setTheme] = useState(storedTheme); + + useEffect(() => { + document.documentElement.setAttribute("data-theme", theme); + localStorage.setItem("theme", theme); + }, [theme]); + + // Toggle theme function + const toggleTheme = () => { + setTheme(theme === "light" ? "dark" : "light"); + }; + + return ( + + {children} + + ); +} + +ThemeProvider.propTypes = { + children: PropTypes.node.isRequired, +}; + +// Dark Mode Page Component +export default function DarkModePage() { + const { theme, toggleTheme } = useTheme(); + + return ( +
+ +
+ ); +} diff --git a/frontend/context/apitask.jsx b/frontend/context/apitask.jsx new file mode 100644 index 0000000..c41080f --- /dev/null +++ b/frontend/context/apitask.jsx @@ -0,0 +1,33 @@ +import axios from "axios"; + +const API = axios.create({ + baseURL: "http://localhost:8000/tasks", + withCredentials: true, // Required for cookies (refresh tokens) +}); + +API.interceptors.request.use((config) => { + const token = localStorage.getItem("token"); + if (token) { + console.log("Adding Authorization header:", token); // Log token for debugging + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }); + + + + +// Create a new task +export const createTask = (taskData) => API.post("/", taskData); + +// Get all tasks for the current user +export const getUserTasks = () => API.get("/getTasks"); + +// Get a specific task by ID +export const getTaskById = (taskId) => API.get(`/${taskId}`); + +// Update a task +export const updateTask = (taskId, taskData) => API.patch(`/${taskId}`, taskData); + +// Delete a task +export const deleteTask = (taskId) => API.delete(`/${taskId}`); \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3eaf4d9..273705b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,8 +17,11 @@ "motion": "^12.0.6", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-hot-toast": "^2.5.1", "react-icons": "^5.4.0", - "react-router-dom": "^7.1.4" + "react-router-dom": "^7.1.4", + "socket.io-client": "^4.8.1", + "zustand": "^5.0.3" }, "devDependencies": { "@eslint/js": "^9.17.0", @@ -1350,6 +1353,12 @@ "win32" ] }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@tailwindcss/node": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.3.tgz", @@ -1657,14 +1666,14 @@ "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.18", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2166,7 +2175,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/daisyui": { @@ -2351,6 +2359,45 @@ "dev": true, "license": "ISC" }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", @@ -3125,6 +3172,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/goober": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -4180,7 +4236,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -4538,6 +4593,23 @@ "react": "^18.3.1" } }, + "node_modules/react-hot-toast": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.1.tgz", + "integrity": "sha512-54Gq1ZD1JbmAb4psp9bvFHjS7lje+8ubboUmvKZkCsQBLH6AOpZ9JemfRvIdHcfb9AZXRaFLrb3qUobGYDJhFQ==", + "license": "MIT", + "dependencies": { + "csstype": "^3.1.3", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/react-icons": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz", @@ -4942,6 +5014,68 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5455,6 +5589,35 @@ "node": ">=0.10.0" } }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -5474,6 +5637,35 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/frontend/package.json b/frontend/package.json index 1e6e7c7..d0e52ea 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,8 +19,11 @@ "motion": "^12.0.6", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-hot-toast": "^2.5.1", "react-icons": "^5.4.0", - "react-router-dom": "^7.1.4" + "react-router-dom": "^7.1.4", + "socket.io-client": "^4.8.1", + "zustand": "^5.0.3" }, "devDependencies": { "@eslint/js": "^9.17.0", diff --git a/frontend/pages/Assignments.jsx b/frontend/pages/Assignments.jsx new file mode 100644 index 0000000..d173efd --- /dev/null +++ b/frontend/pages/Assignments.jsx @@ -0,0 +1,24 @@ +import { ThemeProvider } from "../context/ThemeContext"; +import DashHeader from "../components/DashHeader"; +import DashboardSidebar from "../components/DashboardSidebar"; +// import QuoteDisplay from "../components/QuoteDisplay"; +import AssignmentsManager from "../components/AssignmentsManager"; +// import { TaskProvider } from "../context/TaskContext"; +const Dashboard = () => { + return ( + +
+ +
+ +
+
+ {/* */} + +
+
+
+ ); +}; + +export default Dashboard; diff --git a/frontend/pages/Chat.jsx b/frontend/pages/Chat.jsx index 42d91ed..6922ca8 100644 --- a/frontend/pages/Chat.jsx +++ b/frontend/pages/Chat.jsx @@ -1,7 +1,28 @@ +import { useChatStore } from "../src/store/useChatStore"; +import Sidebar from "../components/Sidebar"; +import NoChatSelected from "../components/NoChatSelected"; +import ChatContainer from "../components/ChatContainer"; +import Navbar from "../components/Navbar"; + const Chat = () => { + const { currentUser } = useChatStore(); + return ( - + <> + +
+
+
+
+ + + {!currentUser ? : } +
+
+
+
+ ); }; -export default Cha \ No newline at end of file +export default Chat; diff --git a/frontend/pages/ContactUs.jsx b/frontend/pages/ContactUs.jsx index 8aaafa6..fc66684 100644 --- a/frontend/pages/ContactUs.jsx +++ b/frontend/pages/ContactUs.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faInstagram, faTwitter, faGithub } from "@fortawesome/free-brands-svg-icons"; diff --git a/frontend/pages/Dashboard.jsx b/frontend/pages/Dashboard.jsx new file mode 100644 index 0000000..ee802b7 --- /dev/null +++ b/frontend/pages/Dashboard.jsx @@ -0,0 +1,27 @@ +// import { IoIosLogOut } from "react-icons/io"; +// import { FaChartBar, FaCalendarAlt, FaFacebookMessenger, FaUsersCog } from "react-icons/fa"; +// import ThemeSwitcher from '../components/ThemeSwitcher'; +import { ThemeProvider } from "../context/ThemeContext"; +import DashHeader from "../components/DashHeader"; +import DashboardSidebar from "../components/DashboardSidebar"; +// import QuoteDisplay from "../components/QuoteDisplay"; +import TaskManager from "../components/TaskManager"; +// import { TaskProvider } from "../context/TaskContext"; +const Dashboard = () => { + return ( + +
+ +
+ +
+
+ {/* */} + +
+
+
+ ); +}; + +export default Dashboard; diff --git a/frontend/pages/Home.jsx b/frontend/pages/Home.jsx index 5863fa9..168d0b2 100644 --- a/frontend/pages/Home.jsx +++ b/frontend/pages/Home.jsx @@ -1,106 +1,111 @@ -import React from 'react' -import { useState } from 'react' -import {motion} from "framer-motion" -import { Link } from 'react-router-dom' -import { useContext } from 'react' -import './styles.css'; -import useScrollTo from '../hooks/useScrollTo' -import Login from './Login' -import Signup from './Signup' -import useActiveForm from '../hooks/useActiveForm' -import Modal from '../components/Modal' -import { useModal } from '../context/ModalContext' -import ContactUs from './ContactUs' -import Photos from './Photos' -import Layout1 from './Layout1' -const Home = () => { - const [isActive1, setIsActive1] = useState(false); +import { useState } from "react"; +import { motion } from "framer-motion"; +import Login from "./Login"; +import Signup from "./Signup"; +import useActiveForm from "../hooks/useActiveForm"; +import Modal from "../components/Modal"; +import { useModal } from "../context/ModalContext"; +import ContactUs from "./ContactUs"; +import Photos from "./Photos"; +import Layout1 from "./Layout1"; +import { FaBars, FaArrowRight } from "react-icons/fa"; +import { FaRightToBracket } from "react-icons/fa6"; +import { HiOutlineBadgeCheck } from "react-icons/hi"; +import RollingQuotes from "../components/RollingQuotes"; - const scrollTo = useScrollTo(); +const Home = () => { const { isModalOpen, toggleModal } = useModal(); const [isSignUp, toggleForm] = useActiveForm(); + const [isDropdownOpen, setIsDropdownOpen] = useState(false); - const toggleActiveClass = () => { - setIsActive1(!isActive1); - }; - - const removeActive = () => { - setIsActive1(false); + const openGetStartedModal = () => { + toggleForm(true); + toggleModal(); }; - const openGetStartedModal = () => { + const openLoginModal = () => { + toggleForm(false); toggleModal(); }; return ( -
- {/* Starry Background */} -
- - - - - - - - - -
- - {/* Navbar */} -
-
-
+ {isDropdownOpen && ( + + )} +
+
-
-
-
{/* Modal Component */} {isModalOpen && (
{/* Sign Up Form */} -
- {isSignUp && } +
+ {isSignUp && }
{/* Sign In Form */} -
- {!isSignUp && } +
+ {!isSignUp && }
{/* Toggle Panel */}
-

{isSignUp ? "Hello, User!" : "Welcome User!"}

-

{isSignUp ? "If you already have an account" : "If you don't have an account"}

-
@@ -108,10 +113,10 @@ const Home = () => {
)} - {/* Main Container */} -
+ {/* Main Container */} +
{ whileHover={{ scale: 1.1, color: "#c3bef0", - boxShadow: "0 0 1rem #ffffff, inset 0 0 1rem rgb(255, 255, 255), 0 0 2rem #ffffff, inset 0 0 2rem rgb(255, 255, 255)", - }} - > + boxShadow: + "0 0 1rem #ffffff, inset 0 0 1rem rgb(255, 255, 255), 0 0 2rem #ffffff, inset 0 0 2rem rgb(255, 255, 255)", + }}> ASSIGNIFY -

- "The future belongs to those who learn more skills and combine them in creative ways." – Robert Greene -

+ + + Get started + +
-
- -
-
-
-
-
-

- {/* Contact Us Section */} -
-
+
+
{ whileHover={{ scale: 1.1, color: "#c3bef0", - boxShadow: "0 0 1rem #ffffff, inset 0 0 1rem rgb(255, 255, 255), 0 0 2rem #ffffff, inset 0 0 2rem rgb(255, 255, 255)", - }} - > + boxShadow: + "0 0 1rem #ffffff, inset 0 0 1rem rgb(255, 255, 255), 0 0 2rem #ffffff, inset 0 0 2rem rgb(255, 255, 255)", + }}> CONTACT US
-
-
-
- {/* Left Side: Contact Us */}
- - {/* Right Side: Photo Content */}
@@ -180,6 +172,6 @@ const Home = () => {
); -} +}; -export default Home +export default Home; diff --git a/frontend/pages/Layout1.jsx b/frontend/pages/Layout1.jsx index 9ebdd5b..327e3cd 100644 --- a/frontend/pages/Layout1.jsx +++ b/frontend/pages/Layout1.jsx @@ -67,15 +67,15 @@ export default function Gestures() { * ============== Styles ================ */ const box = { - width: "100%", // Full width on small screens - height: "300px", // Adjust height for small screens, but ensure it's enough to fill the screen - maxWidth: "100%", // Ensure the width is responsive + width: "100%", + height: "300px", + maxWidth: "100%", paddingLeft: "30px", paddingRight: "30px", backgroundColor: "#c3bef0", borderRadius: 10, border: "2px solid #ffffff", boxShadow: "0 0 2rem #ffffff, inset 0 0 2rem rgb(255, 255, 255)", - backgroundSize: "cover", // Ensures the background image covers the div properly - backgroundPosition: "center", // Centers the background image + backgroundSize: "cover", + backgroundPosition: "center", }; diff --git a/frontend/pages/Login.jsx b/frontend/pages/Login.jsx index 21d995c..8190b9d 100644 --- a/frontend/pages/Login.jsx +++ b/frontend/pages/Login.jsx @@ -1,101 +1,63 @@ -import React, { useState, useContext } from 'react'; -import { useNavigate } from 'react-router-dom'; -import UserContext from '../context/UserContext'; -import axios from 'axios' +import { useState } from "react"; +import { useAuthStore } from "../src/store/useAuthStore"; +import { LuEye, LuEyeOff } from "react-icons/lu"; const Login = () => { // State variables for email and password - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - - // Hook for navigation - const navigate = useNavigate(); - - // Accessing setUser function from UserContext - const { setUser } = useContext(UserContext); + const [showPassword, setShowPassword] = useState(false); + const [formData, setFormData] = useState({ + email: "", + password: "", + }); + const { login, isLoggingIn } = useAuthStore(); - // Handler for form submission - const submitHandler = async (e) => { - e.preventDefault(); // Prevent default form submission behavior - - // User data to be sent to the server - const userData = { - email: email, - password: password, - }; - - try { - // Sending a POST request to the login endpoint - const response = await axios.post(`${import.meta.env.VITE_BASE_URL}/login`, userData); - - // If login is successful - if (response.status === 200) { - const data = response.data; - - // Setting the user data in context - setUser(data.user); - - // Storing the token and user data in local storage - localStorage.setItem('token', data.token); - localStorage.setItem('user', JSON.stringify(data.user)); - - // Navigating to the main page - navigate('/main-page'); - } - } catch (error) { - // Logging the error to the console - console.error('Error during login:', error); - - // Handling different types of errors - if (error.response) { - console.error('Error response:', error.response); - const errorData = error.response.data; - if (errorData) { - const message = errorData.message || 'Something went wrong on the server.'; - alert(`Error: ${message}`); - } else { - alert('Something went wrong on the server.'); - } - } else if (error.request) { - alert('Network error. Please check your internet connection.'); - } else if (error.message) { - alert(error.message); - } else { - alert('An error occurred while setting up the request.'); - } - } - - // Clearing the form fields - setEmail(''); - setPassword(''); + const handleSubmit = async (e) => { + e.preventDefault(); + await login(formData); }; return ( -
-

Sign In

- or use your email & password + +

Sign In

+ or use your email & password + setEmail(e.target.value)} - /> - setPassword(e.target.value)} + className="input input-bordered w-72" + value={formData.email} + onChange={(e) => setFormData({ ...formData, email: e.target.value })} /> + + {/* Password Input with Toggle */} +
+ + setFormData({ ...formData, password: e.target.value }) + } + /> + +
+
); }; -export default Login; \ No newline at end of file +export default Login; diff --git a/frontend/pages/Signup.jsx b/frontend/pages/Signup.jsx index ea97cba..d3f21a1 100644 --- a/frontend/pages/Signup.jsx +++ b/frontend/pages/Signup.jsx @@ -1,102 +1,116 @@ -import React, { useContext, useState } from 'react'; -import { Link,useNavigate } from 'react-router-dom'; -import axios from 'axios'; -import UserContext from '../context/UserContext'; - +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { useAuthStore } from "../src/store/useAuthStore"; // Import Zustand store +import { LuUpload, LuEyeOff, LuEye, LuCheck } from "react-icons/lu"; +import toast from "react-hot-toast"; const Signup = () => { - const[email,setEmail]=useState(''); - const [password,setPassword]=useState(''); - const[name,setName]=useState(''); - const[username,setUsername]=useState(''); + const [showPassword, setShowPassword] = useState(false); + const [formData, setFormData] = useState({ + fullName: "", + username: "", + email: "", + password: "", + avatar: null, + }); + const navigate = useNavigate(); + const { signup, isSigningUp } = useAuthStore(); - const navigate=useNavigate(); + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prev) => ({ ...prev, [name]: value })); + }; - const{user,setUser}=useContext(UserContext); + const handleAvatarChange = (e) => { + const file = e.target.files[0]; + if (file) { + setFormData((prev) => ({ ...prev, avatar: file })); + } + }; const submitHandler = async (e) => { e.preventDefault(); - const newUser = { - fullName: name, - username:username, - email:email, - password:password, - }; + if (!formData.avatar) return toast("Please upload an avatar."); - try{ - const response=await axios.post(`${import.meta.env.VITE_BASE_URL}/register`) - if (response.status === 201) { - const data = response.data; - setUser(data.user); - localStorage.setItem('token',data.token) - navigate('/main-page'); - } - }catch(error){ - // Enhanced error handling - console.error('Error during registration:', error); // Log entire error object - - if (error.response) { - // If error.response exists, we can get details from the server's response - console.error('Error response:', error.response); // Log the entire error response object + const form = new FormData(); + Object.entries(formData).forEach(([key, value]) => { + form.append(key, value); + }); - const errorData = error.response.data; - if (errorData) { - const message = errorData.message || 'Something went wrong on the server.'; - alert(`Error: ${message}`); - } else { - alert('Something went wrong on the server.'); - } - } else if (error.request) { - alert('Network error. Please check your internet connection.'); - } else if (error.message) { - alert(error.message); - } else { - alert('An error occurred while setting up the request.'); + try { + await signup(form); + navigate("/dashboard"); + } catch (error) { + console.error("Signup error:", error); } + }; - setEmail(''); - setName(''); - setPassword(''); - setUsername(''); - - } -}; return ( -
- {/* Sign Up Form */} -

Create Account

- setName(e.target.value)} - /> - setUsername(e.target.value)} - /> - setEmail(e.target.value)} + +

Create Account

+ - setPassword(e.target.value)} - /> - -
+ + + +
+ + +
+ + + + + ); }; -export default Signup; \ No newline at end of file +export default Signup; diff --git a/frontend/pages/styles.css b/frontend/pages/styles.css index 96e03ed..e69de29 100644 --- a/frontend/pages/styles.css +++ b/frontend/pages/styles.css @@ -1,153 +0,0 @@ - - -*{ - margin: 0; - padding: 0; - box-sizing: border-box; - } - body{ - overflow: hidden; - background-color: black; - } - star{ - z-index: 0; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100vh; - background-position-x: center; - background-size: cover; - animation: animateBg 50s linear infinite; - } - @keyframes animateBg { - 0%,100% - { - transform:scale(1); - } - 50% - { - transform:scale(1.2); - } - } - .star span{ - position: absolute; - - width: 4px; - height: 4px; - background: #fff; - border-radius: 50%; - box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.1), 0 0 0 8px rgba(255, 255, 255, 0.1), 0 0 20px rgba(255, 255, 255, 1) ; - animation: animate 3s linear infinite; - } - .star span::before{ - content: ''; - position: absolute; - top: 50%; - transform: translateY(-50%); - width: 300px; - height: 1px; - background: linear-gradient(90deg, #fff, transparent); - } - @keyframes animate { - 0% - { - transform: rotate(270deg) translateX(0); - opacity: 1; - } - 70% - { - opacity: 1; - - } - 100% - { - transform: rotate(270deg) translateX(-1500px); - opacity: 0; - - } - - } -.star span:nth-child(1){ - top: 0; - right: 0; - left:initial; - animation-delay:0 ; - animation-duration: 1s; - } - - .star span:nth-child(2){ - top: 0; - left:0; - left:initial; - animation-delay:2.0s; - animation-duration: 5s; - } - - .star span:nth-child(3){ - top: 80px; - right: 0px; - left:initial; - animation-delay:2.0s ; - animation-duration: 5ss; - } - -.star span:nth-child(4){ - top: 0; - right: 180px; - left:initial; - animation-delay:2s; - animation-duration: 5s; - } - - .star span:nth-child(5){ - top: 0; - right: 400px; - left:initial; - animation-delay:1.4s; - animation-duration: 5s; - } - - .star span:nth-child(6){ - top: 0; - right: 600px; - left:initial; - animation-delay:1.6s ; - animation-duration: 5s; - } - .star span:nth-child(7 ){ - top: 300px; - right: 0px; - left:initial; - animation-delay:2.4s ; - animation-duration: 5s; - } - - .star span:nth-child(8){ - top: 0px; - right: 700px; - left:initial; - animation-delay:1.4s ; - animation-duration: 1.25s; - } - - .star span:nth-child(9){ - top: 0px; - right: 1000px; - left:initial; - animation-delay:0.75s ; - animation-duration: 2.25s; - } - - span:nth-child(10){ - top: 0px; - right: 1000px; - left:initial; - animation-delay:2.75s ; - animation-duration: 2.25s; - } - - - - - \ No newline at end of file diff --git a/frontend/pages/theme.css b/frontend/pages/theme.css new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/App.css b/frontend/src/App.css index b9d355d..e69de29 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 6c07414..de67337 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,20 +1,65 @@ -import React from "react"; -import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; -import { useState } from "react"; +import { useEffect } from "react"; +import { Route, Routes, Navigate } from "react-router-dom"; import "./App.css"; import Home from "../pages/Home"; import Login from "../pages/Login"; import Signup from "../pages/Signup"; import Chat from "../pages/Chat"; -function App() { +import Dashboard from "../pages/Dashboard"; +import Assignments from "../pages/Assignments" +import { useAuthStore } from "./store/useAuthStore"; +import { Toaster } from "react-hot-toast"; + +const App = () => { + const { authUser, checkAuth, isCheckingAuth } = useAuthStore(); + + useEffect(() => { + checkAuth(); + }, [checkAuth]); + + if (isCheckingAuth && !authUser) { + return ( +
+ +

Loading...

+
+ ); + } + return ( - - } /> - } /> - } /> - } /> - + <> + + : } + /> + : } + /> + : } + /> + : } + /> + : } + /> + : } + /> + + + + ); -} +}; export default App; diff --git a/frontend/src/lib/axios.js b/frontend/src/lib/axios.js new file mode 100644 index 0000000..5ac4df7 --- /dev/null +++ b/frontend/src/lib/axios.js @@ -0,0 +1,6 @@ +import axios from "axios"; + +export const axiosInstance = axios.create({ + baseURL: "http://localhost:8000", + withCredentials: true, +}); \ No newline at end of file diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index c4cf566..15c723e 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,19 +1,15 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.jsx' -import ModalProvider from '../context/ModalContext.jsx' -import { UserProvider } from '../context/UserContext.jsx' -import { BrowserRouter } from 'react-router-dom' +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.jsx"; +import ModalProvider from "../context/ModalContext.jsx"; +import { BrowserRouter } from "react-router-dom"; -createRoot(document.getElementById('root')).render( - +createRoot(document.getElementById("root")).render( - - - - - + {/* */} + + + + {/* */} - , -) +); diff --git a/frontend/src/store/useAssignmentStore.js b/frontend/src/store/useAssignmentStore.js new file mode 100644 index 0000000..176addc --- /dev/null +++ b/frontend/src/store/useAssignmentStore.js @@ -0,0 +1,76 @@ +import { create } from "zustand"; +import { axiosInstance } from "../lib/axios"; +import toast from "react-hot-toast"; + +const isValidObjectId = (id) => /^[a-f\d]{24}$/i.test(id); + +export const useAssignmentStore = create((set) => ({ + assignments: [], + isLoading: false, + error: null, + + fetchAssignments: async () => { + set({ isLoading: true, error: null }); + try { + const response = await axiosInstance.get("/assignments/getAssignments"); + set({ assignments: response.data.data, isLoading: false }); + } catch (err) { + const errorMessage = err.response?.data?.message || "Error fetching assignments"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, + + createAssignment: async (formData) => { + set({ isLoading: true, error: null }); + try { + await axiosInstance.post("/assignments", formData); + toast.success("Assignment created successfully"); + await useAssignmentStore.getState().fetchAssignments(); + } catch (err) { + const errorMessage = err.response?.data?.message || "Error creating assignment"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, + + updateAssignment: async (assignmentId, formData) => { + if (!isValidObjectId(assignmentId)) { + const errorMessage = "Invalid Assignment ID"; + set({ error: errorMessage }); + toast.error(errorMessage); + return; + } + + set({ isLoading: true, error: null }); + try { + await axiosInstance.patch(`/assignments/${assignmentId}`, formData); + toast.success("Assignment updated successfully"); + await useAssignmentStore.getState().fetchAssignments(); + } catch (err) { + const errorMessage = err.response?.data?.message || "Error updating assignment"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, + + deleteAssignment: async (assignmentId) => { + if (!isValidObjectId(assignmentId)) { + const errorMessage = "Invalid Assignment ID"; + set({ error: errorMessage }); + toast.error(errorMessage); + return; + } + + set({ isLoading: true, error: null }); + try { + await axiosInstance.delete(`/assignments/${assignmentId}`); + toast.success("Assignment deleted successfully"); + await useAssignmentStore.getState().fetchAssignments(); + } catch (err) { + const errorMessage = err.response?.data?.message || "Error deleting assignment"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, +})); diff --git a/frontend/src/store/useAuthStore.js b/frontend/src/store/useAuthStore.js new file mode 100644 index 0000000..31b2e0c --- /dev/null +++ b/frontend/src/store/useAuthStore.js @@ -0,0 +1,89 @@ +import { create } from "zustand"; +import { io } from "socket.io-client"; +import toast from "react-hot-toast"; +import { axiosInstance } from "../lib/axios.js"; + +// const BASE_URL = +// import.meta.env.MODE === "development" ? "http://localhost:8000" : "/"; + +export const useAuthStore = create((set, get) => ({ + authUser: null, + isSigningUp: false, + isLoggingIn: false, + isUpdatingProfile: false, + isCheckingAuth: true, + onlineUsers: [], + socket: null, + + checkAuth: async () => { + try { + const res = await axiosInstance.get( + "http://localhost:8000/users/current-user" + ); + + set({ authUser: res.data.data }); + get().connectSocket(); + } catch (error) { + console.log("Error in checkAuth:", error); + set({ authUser: null }); + } finally { + set({ isCheckingAuth: false }); + } + }, + + signup: async (data) => { + set({ isSigningUp: true }); + try { + const res = await axiosInstance.post("/users/register", data); + set({ authUser: res.data }); + toast.success("Account created...You're now a User"); + get().connectSocket(); + } catch (error) { + toast.error(error.response.data.message); + } finally { + set({ isSigningUp: false }); + } + }, + + login: async (data) => { + set({ isLoggingIn: true }); + try { + const res = await axiosInstance.post("/users/login", data); + set({ authUser: res.data }); + toast.success("Logged in successfully"); + + get().connectSocket(); + } catch (error) { + toast.error(error.response.data.message); + } finally { + set({ isLoggingIn: false }); + } + }, + + logout: async () => { + try { + await axiosInstance.post("/users/logout"); + set({ authUser: null }); + toast.success("Logged out successfully"); + get().disconnectSocket(); + } catch (error) { + toast.error(error.response.data.message); + } + }, + + connectSocket: () => { + const { authUser, socket } = get(); + if (!authUser || socket?.connected) return; + + const newSocket = io("http://localhost:8000", { + query: { userId: authUser._id }, + }).connect(); + + set({ socket: newSocket }); + + newSocket.on("getOnlineUsers", (ids) => set({ onlineUsers: ids })); + }, + disconnectSocket: () => { + if (get().socket?.connected) get().socket.disconnect(); + }, +})); diff --git a/frontend/src/store/useChatStore.js b/frontend/src/store/useChatStore.js new file mode 100644 index 0000000..2424250 --- /dev/null +++ b/frontend/src/store/useChatStore.js @@ -0,0 +1,75 @@ +import { create } from "zustand"; +import toast from "react-hot-toast"; +import { useAuthStore } from "./useAuthStore"; +import { axiosInstance } from "../lib/axios"; + +// Created a basic zustand store for chats +export const useChatStore = create((set, get) => ({ + messages: [], + users: [], + currentUser: null, // Initially + isUsersLoading: false, + isMessagesLoading: false, + + getUsers: async () => { + set({ isUsersLoading: true }); + try { + const usersFromBackend = await axiosInstance.get("/messages/users"); + set({ users: usersFromBackend.data.data }); + } catch (error) { + toast.error(error.response.data.message); + } finally { + set({ isUsersLoading: false }); + } + }, + + getMessages: async (userId) => { + set({ isMessagesLoading: true }); + try { + const messagesFromBackend = await axiosInstance.get( + `/messages/${userId}` + ); + // console.log("Here are messages: ", messagesFromBackend.data.data); + set({ messages: messagesFromBackend.data.data }); + } catch (error) { + toast.error(error.response.data.message); + } finally { + set({ isMessagesLoading: false }); + } + }, + + sendMessage: async (messageData) => { + const { currentUser, messages } = get(); + // console.log("yoyoyoy", currentUser); + try { + const res = await axiosInstance.post( + `/messages/send/${currentUser._id}`, + messageData + ); + set({ messages: [...messages, res.data.data] }); + } catch (error) { + toast.error(error.response.data.message); + } + }, + + updateOnRealtime: () => { + const { currentUser } = get(); + if (!currentUser) return; + + const socket = useAuthStore.getState().socket; + + socket.on("newMessage", (newMessage) => { + if(newMessage.senderId !== currentUser._id) return; + set((state) => ({ + messages: [...state.messages, newMessage], + })); + }); + }, + + removeUpdateOnRealtime: () => { + const socket = useAuthStore.getState().socket; + socket.off("newMessage"); + }, + + setCurrentUser: (currentUser) => set({ currentUser }), +})); diff --git a/frontend/src/store/useTaskStore.js b/frontend/src/store/useTaskStore.js new file mode 100644 index 0000000..aca4c8a --- /dev/null +++ b/frontend/src/store/useTaskStore.js @@ -0,0 +1,75 @@ +import { create } from "zustand"; +import { axiosInstance } from "../lib/axios"; +import toast from "react-hot-toast"; + +const useTaskStore = create((set) => ({ + tasks: [], + isLoading: false, + error: null, + + fetchTasks: async () => { + set({ isLoading: true, error: null }); + try { + const response = await axiosInstance.get("/tasks/getTasks"); + set({ tasks: response.data.data, isLoading: false }); + } catch (err) { + const errorMessage = + err.response?.data?.message || "Error fetching tasks"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, + + handleCreate: async (taskData) => { + set({ isLoading: true, error: null }); + try { + await axiosInstance.post("/tasks", taskData); + toast.success("Task created successfully"); + await useTaskStore.getState().fetchTasks(); + } catch (err) { + const errorMessage = err.response?.data?.message || "Error creating task"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, + + handleUpdate: async (taskId, taskData) => { + if (!/^[a-f\d]{24}$/i.test(taskId)) { + const errorMessage = "Invalid Task ID"; + set({ error: errorMessage }); + toast.error(errorMessage); + return; + } + set({ isLoading: true, error: null }); + try { + await axiosInstance.patch(`/tasks/${taskId}`, taskData); + toast.success("Task updated successfully"); + await useTaskStore.getState().fetchTasks(); + } catch (err) { + const errorMessage = err.response?.data?.message || "Error updating task"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, + + handleDelete: async (taskId) => { + if (!/^[a-f\d]{24}$/i.test(taskId)) { + const errorMessage = "Invalid Task ID"; + set({ error: errorMessage }); + toast.error(errorMessage); + return; + } + set({ isLoading: true, error: null }); + try { + await axiosInstance.delete(`/tasks/${taskId}`); + toast.success("Task deleted successfully"); + await useTaskStore.getState().fetchTasks(); + } catch (err) { + const errorMessage = err.response?.data?.message || "Error deleting task"; + set({ error: errorMessage, isLoading: false }); + toast.error(errorMessage); + } + }, +})); + +export default useTaskStore; diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index 1e13fd8..c67c4b9 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -9,5 +9,9 @@ export default { theme: { extend: {}, }, - plugins: [daisyui], + plugins: [daisyui], + daisyui: { + themes: true, + darkTheme: "night" + } }; From 4df812b04cc53f3b42df856479fbc82f130f8bd6 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 8 Feb 2025 05:10:37 +0530 Subject: [PATCH 24/26] feat: update route protection to check for authenticated user --- frontend/src/App.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index de67337..0612baf 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -48,12 +48,12 @@ const App = () => { : } + element={authUser ? : } /> : } + element={authUser ? : } /> From f727b7af6c1b628a4d9db754732b179787099b9c Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 8 Feb 2025 15:54:04 +0530 Subject: [PATCH 25/26] . --- frontend/components/DashboardSidebar.jsx | 6 ++ frontend/package-lock.json | 42 +++++++++++++ frontend/package.json | 3 + frontend/pages/Calendar.css | 36 +++++++++++ frontend/pages/Calendar.jsx | 39 ++++++++++++ frontend/pages/Profile.jsx | 78 ++++++++++++++++++++++++ frontend/src/App.jsx | 10 ++- 7 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 frontend/pages/Calendar.css create mode 100644 frontend/pages/Calendar.jsx create mode 100644 frontend/pages/Profile.jsx diff --git a/frontend/components/DashboardSidebar.jsx b/frontend/components/DashboardSidebar.jsx index 54af467..5ceab71 100644 --- a/frontend/components/DashboardSidebar.jsx +++ b/frontend/components/DashboardSidebar.jsx @@ -4,6 +4,7 @@ import { HiOutlineChartBar, HiOutlineChatAlt, HiOutlineLogout, + HiUser, } from "react-icons/hi"; import { Link } from "react-router-dom"; @@ -31,6 +32,11 @@ const DashboardSidebar = () => { Chats +
  • + + Profile + +
  • Logout diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 273705b..c79e271 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,6 +13,9 @@ "@fortawesome/free-brands-svg-icons": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", + "@fullcalendar/core": "^6.1.15", + "@fullcalendar/daygrid": "^6.1.15", + "@fullcalendar/react": "^6.1.15", "axios": "^1.7.9", "motion": "^12.0.6", "react": "^18.3.1", @@ -968,6 +971,35 @@ "react": ">=16.3" } }, + "node_modules/@fullcalendar/core": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.15.tgz", + "integrity": "sha512-BuX7o6ALpLb84cMw1FCB9/cSgF4JbVO894cjJZ6kP74jzbUZNjtwffwRdA+Id8rrLjT30d/7TrkW90k4zbXB5Q==", + "license": "MIT", + "dependencies": { + "preact": "~10.12.1" + } + }, + "node_modules/@fullcalendar/daygrid": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.15.tgz", + "integrity": "sha512-j8tL0HhfiVsdtOCLfzK2J0RtSkiad3BYYemwQKq512cx6btz6ZZ2RNc/hVnIxluuWFyvx5sXZwoeTJsFSFTEFA==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.15" + } + }, + "node_modules/@fullcalendar/react": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-6.1.15.tgz", + "integrity": "sha512-L0b9hybS2J4e7lq6G2CD4nqriyLEqOH1tE8iI6JQjAMTVh5JicOo5Mqw+fhU5bJ7hLfMw2K3fksxX3Ul1ssw5w==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.15", + "react": "^16.7.0 || ^17 || ^18 || ^19", + "react-dom": "^16.7.0 || ^17 || ^18 || ^19" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -4531,6 +4563,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/preact": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", + "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index d0e52ea..88cc3ee 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,6 +15,9 @@ "@fortawesome/free-brands-svg-icons": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", + "@fullcalendar/core": "^6.1.15", + "@fullcalendar/daygrid": "^6.1.15", + "@fullcalendar/react": "^6.1.15", "axios": "^1.7.9", "motion": "^12.0.6", "react": "^18.3.1", diff --git a/frontend/pages/Calendar.css b/frontend/pages/Calendar.css new file mode 100644 index 0000000..3af593c --- /dev/null +++ b/frontend/pages/Calendar.css @@ -0,0 +1,36 @@ +.Calendar { + margin: 20px; + } + + .Calendar-header { + font-size: 50px; + text-align: center; + margin: 0 20px 0 20px; + } + + .event-tooltip { + padding: 10px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + max-height: 150px; /* Limit the height of the tooltip */ + overflow-y: auto; /* Allows vertical scrolling if content overflows */ + word-wrap: break-word; /* Ensures text wraps inside the container */ + } + + .event-time { + font-size: 12px; + color: #555; + } + + .event-title { + font-weight: bold; + margin: 5px 0; + } + + .event-description { + font-size: 14px; + color: #333; + } + \ No newline at end of file diff --git a/frontend/pages/Calendar.jsx b/frontend/pages/Calendar.jsx new file mode 100644 index 0000000..4dd3cb2 --- /dev/null +++ b/frontend/pages/Calendar.jsx @@ -0,0 +1,39 @@ +// import FullCalendar from '@fullcalendar/react'; +// import dayGridPlugin from '@fullcalendar/daygrid'; +// import './Calendar.css'; +// import techEvents from '../data/events'; +// function renderEventContent(eventInfo) { +// const eventDetails = eventInfo.event?._def; +// return ( +//
    +//
    +//
    {eventInfo.timeText}
    +//
    {eventDetails?.title}
    +//
    {eventDetails?.extendedProps.description}
    +//
    +//
    +// ); +// } +// function Calendar() { +// return ( +//
    +// +//
    +// ); +// } +// export default Calendar; \ No newline at end of file diff --git a/frontend/pages/Profile.jsx b/frontend/pages/Profile.jsx new file mode 100644 index 0000000..4753d07 --- /dev/null +++ b/frontend/pages/Profile.jsx @@ -0,0 +1,78 @@ +import { useAuthStore } from "../src/store/useAuthStore"; +import { ThemeProvider } from "../context/ThemeContext"; +import DashHeader from "../components/DashHeader"; +import DashboardSidebar from "../components/DashboardSidebar"; +import { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import toast from "react-hot-toast"; + +const Profile = () => { + const { authUser, logout, checkAuth, isCheckingAuth } = useAuthStore(); + const navigate = useNavigate(); + + useEffect(() => { + checkAuth(); + if (!authUser && !isCheckingAuth) { + toast.error("You need to be logged in to access this page"); + navigate("/login"); + } + }, [authUser, isCheckingAuth, navigate]); + + if (isCheckingAuth) { + return ( +
    + Checking authentication... +
    + ); + } + + return ( + +
    + +
    + +
    +
    +
    +
    + Profile +
    + +
    +

    + Name:{" "} + + {authUser?.fullName || "Unknown"} + +

    +

    + Email: {authUser?.email || "Not provided"} +

    +

    + Username: {authUser?.username || "N/A"} +

    + +
    + +
    +
    +
    +
    +
    +
    + ); +}; + +export default Profile; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 0612baf..a30d31f 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -6,9 +6,11 @@ import Login from "../pages/Login"; import Signup from "../pages/Signup"; import Chat from "../pages/Chat"; import Dashboard from "../pages/Dashboard"; -import Assignments from "../pages/Assignments" +import Assignments from "../pages/Assignments"; +// import Calendar from "../pages/Calendar" import { useAuthStore } from "./store/useAuthStore"; import { Toaster } from "react-hot-toast"; +import Profile from "../pages/Profile"; const App = () => { const { authUser, checkAuth, isCheckingAuth } = useAuthStore(); @@ -55,6 +57,12 @@ const App = () => { // eslint-disable-next-line no-constant-condition element={authUser ? : } /> + {/* } /> */} + : } + /> From 069780d77071fd86048a2e7d4e71aaa561b4aeb5 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:09:52 +0530 Subject: [PATCH 26/26] feat: enhance UI with new font and layout adjustments; update task and assignment reminder messages --- backend/src/app.js | 2 + backend/src/models/assignment.models.js | 2 +- backend/src/models/task.models.js | 2 +- frontend/components/DashHeader.jsx | 46 +++++---- frontend/components/DashboardSidebar.jsx | 6 +- frontend/pages/Calendar.css | 84 ++++++++++------- frontend/pages/Calendar.jsx | 113 +++++++++++++++++------ frontend/pages/Profile.jsx | 36 +++++--- frontend/src/App.jsx | 8 +- frontend/src/index.css | 1 + frontend/tailwind.config.js | 18 ++-- 11 files changed, 211 insertions(+), 107 deletions(-) diff --git a/backend/src/app.js b/backend/src/app.js index 0dc4b90..04fadb4 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -25,11 +25,13 @@ import userRouter from "./routes/user.routes.js"; import assignmentRouter from "./routes/assignment.routes.js"; import taskRouter from "./routes/task.routes.js"; import messageRouter from "./routes/message.routes.js"; +import scheduleRouter from "./routes/schedule.routes.js"; // Routes Declaration app.use("/users", userRouter); app.use("/assignments", assignmentRouter); app.use("/tasks", taskRouter); app.use("/messages", messageRouter); +app.use("/schedules", scheduleRouter); export { app }; diff --git a/backend/src/models/assignment.models.js b/backend/src/models/assignment.models.js index f72e88d..2b4a5bc 100644 --- a/backend/src/models/assignment.models.js +++ b/backend/src/models/assignment.models.js @@ -40,7 +40,7 @@ assignmentSchema.post("save", async function (doc, next) { user: doc.user, reminderDate: doc.due_date, assignmentId: doc._id, - message: `Reminder: Complete the assignment "${doc.title}"`, + message: `Assignment: ${doc.title}"`, }); console.log("Schedule created for Assignment:", doc.title); } catch (error) { diff --git a/backend/src/models/task.models.js b/backend/src/models/task.models.js index 28efefd..6db832e 100644 --- a/backend/src/models/task.models.js +++ b/backend/src/models/task.models.js @@ -41,7 +41,7 @@ taskSchema.post("save", async function (doc, next) { user: doc.user, reminderDate: doc.due_date, taskId: doc._id, - message: `Reminder: Complete the task "${doc.title}"`, + message: `Task: "${doc.title}"`, }); console.log("Schedule created for Task:", doc.title); } catch (error) { diff --git a/frontend/components/DashHeader.jsx b/frontend/components/DashHeader.jsx index 68fb72e..c6e14f8 100644 --- a/frontend/components/DashHeader.jsx +++ b/frontend/components/DashHeader.jsx @@ -1,43 +1,57 @@ import { HiOutlineMenuAlt2 } from "react-icons/hi"; import { HiOutlineBadgeCheck } from "react-icons/hi"; -import ThemeSwitcher from './ThemeSwitcher'; +import ThemeSwitcher from "./ThemeSwitcher"; import { useTheme } from "../context/ThemeContext"; // Import theme context +import { Link } from "react-router-dom"; const DashHeader = () => { const { theme } = useTheme(); // Get the current theme return ( -
  • // ); // } -// function Calendar() { -// return ( -//
    -// -//
    -// ); -// } -// export default Calendar; \ No newline at end of file +function Calendar() { + const [schedules, setSchedules] = useState([]); + + useEffect(() => { + const fetchSchedules = async () => { + try { + const response = await axiosInstance.get("/schedules/getSchedules"); + + const fetchedSchedules = response.data.data.map((schedule) => ({ + id: schedule._id, + title: schedule.message, + start: schedule.reminderDate, + description: schedule.assignmentId + ? schedule.assignmentId.title + : schedule.taskId + ? schedule.taskId.title + : "General Reminder", + allDay: true, + })); + + setSchedules(fetchedSchedules); + } catch (err) { + console.log(err); + } + }; + + fetchSchedules(); + }, []); + + const handleEventClick = async (clickInfo) => { + const confirmDelete = window.confirm( + `Delete schedule: ${clickInfo.event.title}?` + ); + + if (confirmDelete) { + try { + await axiosInstance.delete(`/schedules/${clickInfo.event.id}`); + setSchedules((prevSchedules) => + prevSchedules.filter((event) => event.id !== clickInfo.event.id) + ); + } catch (error) { + console.error("Error deleting schedule:", error); + } + } + }; + + return ( + +
    + +
    + +
    +
    + { + info.el.style.whiteSpace = "nowrap"; + info.el.style.overflow = "scroll"; + info.el.style.textOverflow = "ellipsis"; + info.el.style.fontSize = "12px"; + }} + /> +
    +
    +
    + ); +} +export default Calendar; diff --git a/frontend/pages/Profile.jsx b/frontend/pages/Profile.jsx index 4753d07..bdcf98e 100644 --- a/frontend/pages/Profile.jsx +++ b/frontend/pages/Profile.jsx @@ -5,6 +5,7 @@ import DashboardSidebar from "../components/DashboardSidebar"; import { useEffect } from "react"; import { useNavigate } from "react-router-dom"; import toast from "react-hot-toast"; +import { motion } from "framer-motion"; const Profile = () => { const { authUser, logout, checkAuth, isCheckingAuth } = useAuthStore(); @@ -14,9 +15,9 @@ const Profile = () => { checkAuth(); if (!authUser && !isCheckingAuth) { toast.error("You need to be logged in to access this page"); - navigate("/login"); + navigate("/"); } - }, [authUser, isCheckingAuth, navigate]); + }, [authUser, checkAuth, isCheckingAuth, navigate]); if (isCheckingAuth) { return ( @@ -33,30 +34,39 @@ const Profile = () => {
    -
    -
    -
    +
    +
    + Profile -
    + -
    -

    + +

    Name:{" "} - + {authUser?.fullName || "Unknown"}

    -

    +

    Email: {authUser?.email || "Not provided"}

    -

    +

    Username: {authUser?.username || "N/A"}

    @@ -67,7 +77,7 @@ const Profile = () => { Logout

    -
    +
    diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index a30d31f..87a44c9 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -7,7 +7,7 @@ import Signup from "../pages/Signup"; import Chat from "../pages/Chat"; import Dashboard from "../pages/Dashboard"; import Assignments from "../pages/Assignments"; -// import Calendar from "../pages/Calendar" +import Calendar from "../pages/Calendar"; import { useAuthStore } from "./store/useAuthStore"; import { Toaster } from "react-hot-toast"; import Profile from "../pages/Profile"; @@ -57,10 +57,12 @@ const App = () => { // eslint-disable-next-line no-constant-condition element={authUser ? : } /> - {/* } /> */} + : } + /> : } /> diff --git a/frontend/src/index.css b/frontend/src/index.css index 4c1b0c2..7c18ad7 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,2 +1,3 @@ +@import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300..700&display=swap'); @import "tailwindcss"; @plugin "daisyui"; diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index c67c4b9..41f3a96 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -1,17 +1,17 @@ - -import daisyui from 'daisyui'; - +import daisyui from "daisyui"; export default { - content: [ - "./src/**/*.{html,js,ts,jsx,tsx}", - ], + content: ["./src/**/*.{html,js,ts,jsx,tsx}"], theme: { - extend: {}, + extend: { + fontFamily: { + quicksand: ["Quicksand", "serif"], + }, + }, }, plugins: [daisyui], daisyui: { themes: true, - darkTheme: "night" - } + darkTheme: "night", + }, };

    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 MF8?zBxq;vR0o*@wnE(I) literal 0 HcmV?d00001 diff --git a/backend/src/models/schedules.models.js b/backend/src/models/schedules.models.js new file mode 100644 index 0000000..0dd5f76 --- /dev/null +++ b/backend/src/models/schedules.models.js @@ -0,0 +1,31 @@ +import mongoose, { Schema } from "mongoose"; + +const scheduleSchema = new Schema( + { + user: { + type: Schema.Types.ObjectId, + ref: "User", + }, + reminderDate: { + type: Date, + required: true, + }, + assignmentId: { + type: Schema.Types.ObjectId, + ref: "Assignment", + }, + message: { + type: String, + default: "Complete Your Assignment", + }, + status: { + type: Boolean, + default: false, + }, + }, + { + timestamps: true, + } +); + +export const Task = mongoose.model("Task", taskSchema); diff --git a/backend/src/models/task.models.js b/backend/src/models/task.models.js new file mode 100644 index 0000000..e593a99 --- /dev/null +++ b/backend/src/models/task.models.js @@ -0,0 +1,30 @@ +import mongoose, { Schema } from "mongoose"; + +const taskSchema = new Schema( + { + title: { + type: String, + required: true, + }, + description: { + type: String, + }, + due_date: { + type: Date, + required: true, + }, + isComplete: { + type: Boolean, + default: false, + }, + user: { + type: Schema.Types.ObjectId, + ref: "User", + }, + }, + { + timestamps: true, + } +); + +export const Task = mongoose.model("Task", taskSchema); diff --git a/backend/src/models/user.models.js b/backend/src/models/user.models.js new file mode 100644 index 0000000..0cabd24 --- /dev/null +++ b/backend/src/models/user.models.js @@ -0,0 +1,49 @@ +import mongoose, { Schema } from "mongoose"; + +const userSchema = new Schema( + { + fullName: { + type: String, + required: true, + index: true, + trim: true, + }, + username: { + type: String, + required: true, + unique: true, + lowercase: true, + trim: true, + index: true, + }, + email: { + type: String, + required: true, + unique: true, + lowercase: true, + trim: true, + }, + avatar: { + type: String, + required: true, + }, + password: { + type: String, + required: [true, "Password is required"], + }, + priorityOrder: [ + { + type: Schema.Types.ObjectId, + ref: "Assignment", + }, + ], + refreshToken: { + type: String, + }, + }, + { + timestamps: true, + } +); + +export const User = mongoose.model("User", userSchema); From f974b99eff41992410a259ebf76eaadd28dced20 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 1 Feb 2025 12:06:37 +0530 Subject: [PATCH 02/26] fix/mistyped Schema name --- backend/src/models/schedules.models.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/models/schedules.models.js b/backend/src/models/schedules.models.js index 0dd5f76..0456839 100644 --- a/backend/src/models/schedules.models.js +++ b/backend/src/models/schedules.models.js @@ -28,4 +28,4 @@ const scheduleSchema = new Schema( } ); -export const Task = mongoose.model("Task", taskSchema); +export const Task = mongoose.model("Task", scheduleSchema); From 50eb230921a0a7a27003d9e5805903fb9c03da2f Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 1 Feb 2025 13:17:40 +0530 Subject: [PATCH 03/26] =?UTF-8?q?Basic=20Util=20Files=20=E2=9A=A1=20and=20?= =?UTF-8?q?Password=20Hashing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/models/user.models.js | 15 +++++++++++++++ backend/src/utils/ApiError.js | 30 ++++++++++++++++++++++++++++++ backend/src/utils/ApiResponse.js | 12 ++++++++++++ backend/src/utils/asyncHandler.js | 8 ++++++++ 4 files changed, 65 insertions(+) create mode 100644 backend/src/utils/ApiError.js create mode 100644 backend/src/utils/ApiResponse.js create mode 100644 backend/src/utils/asyncHandler.js diff --git a/backend/src/models/user.models.js b/backend/src/models/user.models.js index 0cabd24..e5c48d0 100644 --- a/backend/src/models/user.models.js +++ b/backend/src/models/user.models.js @@ -1,4 +1,5 @@ import mongoose, { Schema } from "mongoose"; +import bcrypt from "bcrypt"; const userSchema = new Schema( { @@ -46,4 +47,18 @@ const userSchema = new Schema( } ); +// Hashing the password before saving them into database for security +userSchema.pre("save", async function (next) { + if (this.isModified("password")) { + this.password = await bcrypt.hash(this.password, 10); + } + return next(); +}); + +// While we are at it maybe i can also add a custom method to check if the password matches hashed password from our backend +// This just returns a boolean after comparing the two +userSchema.methods.isPasswordCorrect = async function (password) { + return await bcrypt.compare(password, this.password); +}; + export const User = mongoose.model("User", userSchema); diff --git a/backend/src/utils/ApiError.js b/backend/src/utils/ApiError.js new file mode 100644 index 0000000..4667a7e --- /dev/null +++ b/backend/src/utils/ApiError.js @@ -0,0 +1,30 @@ +// Custom Error messages to use throughout the app for consistent logs + +class ApiError extends Error { + // Default Response + constructor( + statusCode, + message = "Something went wrong", + errors = [], + stack = "" + ) { + super(message); + this.statusCode = statusCode; + // No need for error to return data + this.data = null; + this.message = message; + // ofcourse it's not success + this.success = false; + this.errors = errors; + + + // Good practice to also return stack trace for debugging + if (stack) { + this.stack = stack; + } else { + Error.captureStackTrace(this, this.constructor); + } + } +} + +export { ApiError }; diff --git a/backend/src/utils/ApiResponse.js b/backend/src/utils/ApiResponse.js new file mode 100644 index 0000000..d9ab421 --- /dev/null +++ b/backend/src/utils/ApiResponse.js @@ -0,0 +1,12 @@ +// Custom API response for consistent data returns at frontend + +class ApiResponse { + constructor(statusCode, data, message = "Success") { + (this.statusCode = statusCode), + (this.data = data), + (this.message = message), + (this.success = statusCode < 400); + } +} + +export { ApiResponse }; diff --git a/backend/src/utils/asyncHandler.js b/backend/src/utils/asyncHandler.js new file mode 100644 index 0000000..d69892d --- /dev/null +++ b/backend/src/utils/asyncHandler.js @@ -0,0 +1,8 @@ +// Higher Order function to handle asynchronous calls and errors +// This will be used to call functions that require time and need to be called asynchronously + +export const asyncHandler = (requestHandler) => { + return (req, res, next) => { + Promise.resolve(requestHandler(req, res, next)).catch((err) => next(err)); + }; +}; From e17299a4576a20609cee761b328853aa9045dde4 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 1 Feb 2025 16:24:33 +0530 Subject: [PATCH 04/26] feat: Password Verification, JWT Token Gen, implement multer Multer Config --- backend/src/middlewares/multer.middleware.js | 25 +++++++++++++++ backend/src/models/user.models.js | 33 ++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 backend/src/middlewares/multer.middleware.js diff --git a/backend/src/middlewares/multer.middleware.js b/backend/src/middlewares/multer.middleware.js new file mode 100644 index 0000000..756d76c --- /dev/null +++ b/backend/src/middlewares/multer.middleware.js @@ -0,0 +1,25 @@ +import multer from "multer"; + +// We wouldn't want filenames to be same in the backend +// This will generate random filename for a file based on the current timestamp +function getRandomFileName() { + var timestamp = new Date().toISOString().replace(/[-:.]/g, ""); + var random = ("" + Math.random()).substring(2, 8); + var random_number = timestamp + random; + return random_number; +} + +// Basic multer storage configuration +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + console.log(req.body); + // All local cached files will be in temp folder in public directory + cb(null, "./public/temp"); + }, + filename: function (req, file, cb) { + const randomName = getRandomFileName(); + cb(null, randomName); + }, +}); + +export const upload = multer({ storage }); diff --git a/backend/src/models/user.models.js b/backend/src/models/user.models.js index e5c48d0..08bd4a6 100644 --- a/backend/src/models/user.models.js +++ b/backend/src/models/user.models.js @@ -55,10 +55,43 @@ userSchema.pre("save", async function (next) { return next(); }); +// Custom Methods + // While we are at it maybe i can also add a custom method to check if the password matches hashed password from our backend // This just returns a boolean after comparing the two userSchema.methods.isPasswordCorrect = async function (password) { return await bcrypt.compare(password, this.password); }; +// TODO: Add methods to generate Access and Refresh tokens + +// Access Token +userSchema.methods.generateAccessToken = function () { + return jwt.sign( + { + _id: this._id, + email: this.email, + username: this.username, + fullName: this.fullName, + }, + process.env.ACCESS_TOKEN_SECRET, + { + expiresIn: process.env.ACCESS_TOKEN_EXPIRY, + } + ); +}; + +// Refresh Token +userSchema.methods.generateRefreshToken = function () { + return jwt.sign( + { + _id: this._id, + }, + process.env.REFRESH_TOKEN_SECRET, + { + expiresIn: process.env.REFRESH_TOKEN_EXPIRY, + } + ); +}; + export const User = mongoose.model("User", userSchema); From 91e872cda84fdc194046132700ae2f066c8111ed Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 1 Feb 2025 16:48:48 +0530 Subject: [PATCH 05/26] feat: Add cookie parser and static file serving; implement Cloudinary upload helper --- backend/src/app.js | 9 +++++++++ backend/src/utils/cloudinary.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 backend/src/utils/cloudinary.js diff --git a/backend/src/app.js b/backend/src/app.js index 0d68ea0..dcddcc5 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -1,5 +1,6 @@ import express from "express"; import cors from "cors"; +import cookieParser from "cookie-parser"; const app = express(); @@ -13,4 +14,12 @@ app.use( app.use(express.json({ limit: "16kb" })); app.use(express.urlencoded({ extended: true, limit: "16kb" })); +// Configuring express to mark public as static storage folder +app.use(express.static("public")); + +// Cookie Parser configuration for tokens +app.use(cookieParser()); + +// TODO: Routes will go here + export { app }; diff --git a/backend/src/utils/cloudinary.js b/backend/src/utils/cloudinary.js new file mode 100644 index 0000000..1628e90 --- /dev/null +++ b/backend/src/utils/cloudinary.js @@ -0,0 +1,30 @@ +// Had to import since we are using type: module +import { v2 as cloud } from "cloudinary"; + +// Filesystem for filehandling (deletion capabilities) +import fs from "fs"; + +// TODO: will add them to .env later 🥱 +cloud.config({ + cloud_name: "the-secretary", + api_key: "223686945462514", + api_secret: "G8rh3hX5EMDPBLFVGeXLQbpH_O8", +}); + +// Helper function to upload file to cloudinary from local path +const uploadToCloud = async (localPath) => { + try { + if (!localPath) return null; + const res = await cloud.uploader.upload(localPath, { + // TODO: file type error on cloudinary + resource_type: "raw", + }); + console.log("File Uploaded Successfully", res.url); + return res; + } catch (err) { + fs.unlinkSync(localPath); + return null; + } +}; + +export { uploadToCloud }; From 7a20544fb931a4a39dd1d4a1a713e355ed1e9193 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 1 Feb 2025 16:52:47 +0530 Subject: [PATCH 06/26] fix: added cloudinary credentials to .env --- backend/src/utils/cloudinary.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/backend/src/utils/cloudinary.js b/backend/src/utils/cloudinary.js index 1628e90..b92f80c 100644 --- a/backend/src/utils/cloudinary.js +++ b/backend/src/utils/cloudinary.js @@ -4,11 +4,10 @@ import { v2 as cloud } from "cloudinary"; // Filesystem for filehandling (deletion capabilities) import fs from "fs"; -// TODO: will add them to .env later 🥱 cloud.config({ cloud_name: "the-secretary", - api_key: "223686945462514", - api_secret: "G8rh3hX5EMDPBLFVGeXLQbpH_O8", + api_key: process.env.CLOUDINARY_KEY, + api_secret: process.env.CLOUDINARY_SECRET, }); // Helper function to upload file to cloudinary from local path @@ -16,7 +15,7 @@ const uploadToCloud = async (localPath) => { try { if (!localPath) return null; const res = await cloud.uploader.upload(localPath, { - // TODO: file type error on cloudinary + // FIXME: file type error on cloudinary resource_type: "raw", }); console.log("File Uploaded Successfully", res.url); From 736dabb8755cf9b7a6746d13665b84473d05ae87 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:01:08 +0530 Subject: [PATCH 07/26] refactor: file deletion --- backend/src/utils/cloudinary.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/src/utils/cloudinary.js b/backend/src/utils/cloudinary.js index b92f80c..266bd18 100644 --- a/backend/src/utils/cloudinary.js +++ b/backend/src/utils/cloudinary.js @@ -10,18 +10,30 @@ cloud.config({ api_secret: process.env.CLOUDINARY_SECRET, }); +// we can't store everything locally +const deleteLocalFile = (path) => { + try { + fs.unlinkSync(path); + console.log(`Successfully deleted ${path}`); + } catch (err) { + console.error(`Error deleting file ${path}`, err); + } +}; + // Helper function to upload file to cloudinary from local path const uploadToCloud = async (localPath) => { try { if (!localPath) return null; const res = await cloud.uploader.upload(localPath, { - // FIXME: file type error on cloudinary + // FIXME: file type error on cloudinary resource_type: "raw", }); console.log("File Uploaded Successfully", res.url); + deleteLocalFile(localPath); return res; } catch (err) { - fs.unlinkSync(localPath); + console.log(err); + deleteLocalFile(localPath); return null; } }; From b7343ada5db900d0c9dead2557efc6b9ffc095ab Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 00:56:30 +0530 Subject: [PATCH 08/26] feat: Implement user registration and login routes with avatar upload --- backend/src/app.js | 4 ++ backend/src/controllers/user.controllers.js | 56 +++++++++++++++++++++ backend/src/routes/user.routes.js | 10 ++++ 3 files changed, 70 insertions(+) create mode 100644 backend/src/controllers/user.controllers.js create mode 100644 backend/src/routes/user.routes.js diff --git a/backend/src/app.js b/backend/src/app.js index dcddcc5..5291369 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -21,5 +21,9 @@ app.use(express.static("public")); app.use(cookieParser()); // TODO: Routes will go here +import userRouter from "./routes/user.routes.js"; + +// Routes Declaration +app.use("/users", userRouter); export { app }; diff --git a/backend/src/controllers/user.controllers.js b/backend/src/controllers/user.controllers.js new file mode 100644 index 0000000..a7cea73 --- /dev/null +++ b/backend/src/controllers/user.controllers.js @@ -0,0 +1,56 @@ +import { asyncHandler } from "../utils/asyncHandler.js"; +import { ApiError } from "../utils/ApiError.js"; +import { ApiResponse } from "../utils/ApiResponse.js"; +import { User } from "../models/user.models.js"; +import { uploadToCloud } from "../utils/cloudinary.js"; + +const register = asyncHandler(async (req, res) => { + // Get Data from req.body + const { fullName, username, email, password } = req.body; + + if ([fullName, email, username, password].some((field) => !field?.trim())) { + throw new ApiError(400, "Fill all fields"); + } + + // Check if all fields are present + const existedUser = await User.findOne({ + $or: [{ username }, { email }], + }); + + // Return if user is already present + if (existedUser) { + throw new ApiError(409, "User Credentials Already Exists..."); + } + + const localPath = req.file?.path; + if (!localPath) { + throw new ApiError(400, "Avatar File is Required..."); + } + + console.log(localPath); + // Otherwise register the user and save details in database + const avatar = await uploadToCloud(localPath); + if (!avatar) { + throw new ApiError(400, "Avatar Couldn't be Saved..."); + } + + const user = await User.create({ + fullName, + avatar: avatar.url, + email, + password, + username: username.toLowerCase(), + }); + + const userFromDB = await User.findById(user._id).select( + "-password -refresh-token" + ); + + // Returned Created user and message + return res + .status(201) + .json(new ApiResponse(200, userFromDB, "User Ban Gaya 🤩!")); +}); + + +export { register }; diff --git a/backend/src/routes/user.routes.js b/backend/src/routes/user.routes.js new file mode 100644 index 0000000..7076ebd --- /dev/null +++ b/backend/src/routes/user.routes.js @@ -0,0 +1,10 @@ +import { Router } from "express"; +import { register, login } from "../controllers/user.controller.js"; +import { upload } from "../middlewares/multer.middlewares.js"; + +const router = Router(); + +router.route("/register").post(upload.single("avatar"), register); +router.route("/login").post(login); + +export default router; From ffd1f6f3f618cf5c993a76e33d56ca7e4a3784ac Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 02:57:09 +0530 Subject: [PATCH 09/26] =?UTF-8?q?feat:=20Implement=20user=20login=20functi?= =?UTF-8?q?onality=20with=20access=20and=20refresh=20token=20generation?= =?UTF-8?q?=F0=9F=99=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/controllers/user.controllers.js | 85 ++++++++++++++++++++- backend/src/models/user.models.js | 5 +- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/backend/src/controllers/user.controllers.js b/backend/src/controllers/user.controllers.js index a7cea73..854a7b8 100644 --- a/backend/src/controllers/user.controllers.js +++ b/backend/src/controllers/user.controllers.js @@ -4,6 +4,26 @@ import { ApiResponse } from "../utils/ApiResponse.js"; import { User } from "../models/user.models.js"; import { uploadToCloud } from "../utils/cloudinary.js"; +const generateAccessRefreshTokens = async (userId) => { + try { + // Generate Access and Refresh Tokens + const user = await User.findById(userId); + const accessToken = user.generateAccessToken(); + const refreshToken = user.generateRefreshToken(); + + // Save Refresh Token in Database + user.refreshToken = refreshToken; + // Save User + await user.save({ validateBeforeSave: false }); + return { accessToken, refreshToken }; + } catch (err) { + throw new ApiError( + 500, + "Something went wrong while generating refresh and access token" + ); + } +}; + const register = asyncHandler(async (req, res) => { // Get Data from req.body const { fullName, username, email, password } = req.body; @@ -52,5 +72,68 @@ const register = asyncHandler(async (req, res) => { .json(new ApiResponse(200, userFromDB, "User Ban Gaya 🤩!")); }); +const login = asyncHandler(async (req, res) => { + console.log(req.body); + const { email, username, password } = req.body; + + // Validation + if (!username && !email) { + throw new ApiError(400, "username or password is required"); + } + + // find user in database + const user = await User.findOne({ + $or: [ + { + username, + }, + { + email, + }, + ], + }); + + if (!user) { + throw new ApiError(404, "requested User doesn't even exist"); + } + + // Check if password is correct + const valid = await user.isPasswordCorrect(password); + if (!valid) { + throw new ApiError(401, "Invalid user credentials"); + } + + // Generate Access and Refresh Tokens + const { accessToken, refreshToken } = await generateAccessRefreshTokens( + user._id + ); + + // Send Access and Refresh Tokens as Cookies + const loggedUserFromDB = await User.findById(user._id).select( + "-password -refreshToken" + ); + + const cookieOptions = { + httpOnly: true, + secure: true, + }; + + // Return Logged In User and Tokens + return res + .status(200) + .cookie("accessToken", accessToken, cookieOptions) + .cookie("refreshToken", refreshToken, cookieOptions) + .json( + new ApiResponse( + 200, + { + user: loggedUserFromDB, + accessToken, + refreshToken, + }, + "User logged In Successfully" + ) + ); +}); -export { register }; +export { register, login }; diff --git a/backend/src/models/user.models.js b/backend/src/models/user.models.js index 08bd4a6..2610b8e 100644 --- a/backend/src/models/user.models.js +++ b/backend/src/models/user.models.js @@ -1,4 +1,5 @@ import mongoose, { Schema } from "mongoose"; +import jwt from "jsonwebtoken"; import bcrypt from "bcrypt"; const userSchema = new Schema( @@ -25,7 +26,7 @@ const userSchema = new Schema( trim: true, }, avatar: { - type: String, + type: String, // Cloudinary URL required: true, }, password: { @@ -63,8 +64,6 @@ userSchema.methods.isPasswordCorrect = async function (password) { return await bcrypt.compare(password, this.password); }; -// TODO: Add methods to generate Access and Refresh tokens - // Access Token userSchema.methods.generateAccessToken = function () { return jwt.sign( From b8a4144fa17cc7ff4303bd71cea353c85f6c689b Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 09:34:40 +0530 Subject: [PATCH 10/26] feat: Add logout functionality and JWT verification middleware --- backend/src/controllers/user.controllers.js | 27 ++++++++++++++++++++- backend/src/middlewares/auth.middleware.js | 27 +++++++++++++++++++++ backend/src/routes/user.routes.js | 8 ++++-- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 backend/src/middlewares/auth.middleware.js diff --git a/backend/src/controllers/user.controllers.js b/backend/src/controllers/user.controllers.js index 854a7b8..b324654 100644 --- a/backend/src/controllers/user.controllers.js +++ b/backend/src/controllers/user.controllers.js @@ -136,4 +136,29 @@ const login = asyncHandler(async (req, res) => { ); }); -export { register, login }; +const logout = asyncHandler(async (req, res) => { + await User.findByIdAndUpdate( + req.user._id, + { + $unset: { + refreshToken: 1, + }, + }, + { + new: true, + } + ); + + const cookieOptions = { + httpOnly: true, + secure: true, + }; + + return res + .status(200) + .clearCookie("accessToken", cookieOptions) + .clearCookie("refreshToken", cookieOptions) + .json(new ApiResponse(200, {}, "User logged Out successfuly")); +}); + +export { register, login, logout }; diff --git a/backend/src/middlewares/auth.middleware.js b/backend/src/middlewares/auth.middleware.js new file mode 100644 index 0000000..6bba5a3 --- /dev/null +++ b/backend/src/middlewares/auth.middleware.js @@ -0,0 +1,27 @@ +import { ApiError } from "../utils/ApiError.js"; +import { asyncHandler } from "../utils/asyncHandler.js"; +import jwt from "jsonwebtoken"; +import { User } from "../models/user.models.js"; + +export const verifyJWT = asyncHandler(async (req, _, next) => { + try { + // Get the token from the cookies + const token = req.cookies.accessToken; + if (!token) throw new ApiError(401, "Kuch to kaam nahi kar rha hai"); + + // Verify the token + const decoded = jwt.verify(token, process.env.ACCESS_TOKEN_SECRET); + // Find the user with the decoded id + const user = await User.findById(decoded?._id).select( + "-password -refreshToken" + ); + if (!user) { + throw new ApiError(401, "Invalid Access"); + } + // Set the user in the request object + req.user = user; + next(); + } catch (err) { + throw new ApiError(401, "Something went wrong"); + } +}); diff --git a/backend/src/routes/user.routes.js b/backend/src/routes/user.routes.js index 7076ebd..1375529 100644 --- a/backend/src/routes/user.routes.js +++ b/backend/src/routes/user.routes.js @@ -1,10 +1,14 @@ import { Router } from "express"; -import { register, login } from "../controllers/user.controller.js"; -import { upload } from "../middlewares/multer.middlewares.js"; +import { register, logout, login } from "../controllers/user.controllers.js"; +import { upload } from "../middlewares/multer.middleware.js"; +import { verifyJWT } from "../middlewares/auth.middleware.js"; const router = Router(); router.route("/register").post(upload.single("avatar"), register); router.route("/login").post(login); +// Secured routes with Authentication +router.route("/logout").post(verifyJWT, logout); + export default router; From b7c2f852a5e870d59d19d4dcfb28d1c01e472534 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 09:57:28 +0530 Subject: [PATCH 11/26] feat: Add token refresh and current user retrieval functionality --- backend/src/controllers/user.controllers.js | 49 ++++++++++++++++++++- backend/src/routes/user.routes.js | 6 ++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/backend/src/controllers/user.controllers.js b/backend/src/controllers/user.controllers.js index b324654..2f7d786 100644 --- a/backend/src/controllers/user.controllers.js +++ b/backend/src/controllers/user.controllers.js @@ -161,4 +161,51 @@ const logout = asyncHandler(async (req, res) => { .json(new ApiResponse(200, {}, "User logged Out successfuly")); }); -export { register, login, logout }; +const refreshAccessToken = asyncHandler(async (req, res) => { + const incomingToken = req.cookies.refreshToken || req.body.refreshToken; + + if (!incomingToken) { + throw new ApiError(401, "Unauthorised Request"); + } + + const decodedToken = jwt.verify( + incomingToken, + process.env.REFRESH_TOKEN_SECRET + ); + const user = await User.findById(decodedToken._id); + if (!user) { + throw new ApiError(401, "Invalid Token"); + } + + if (incomingToken !== user?.refreshToken) { + throw new ApiError(401, "Refresh Token is expired or used"); + } + const cookieOptions = { + httpOnly: true, + secure: true, + }; + + const { accessToken, newRefreshToken } = await generateAccessRefreshTokens( + user._id + ); + + return res + .status(200) + .cookie("accessToken", accessToken, cookieOptions) + .cookie("refreshToken", newRefreshToken, cookieOptions) + .json( + new ApiResponse( + 200, + { accessToken, refreshToken: newRefreshToken }, + "Token Refreshed" + ) + ); +}); + +const getCurrentUser = asyncHandler(async (req, res) => { + return res + .status(200) + .json(200, req.user, "Current User Fetched successfully"); +}); + +export { register, login, logout, refreshAccessToken, getCurrentUser }; diff --git a/backend/src/routes/user.routes.js b/backend/src/routes/user.routes.js index 1375529..8bbfd20 100644 --- a/backend/src/routes/user.routes.js +++ b/backend/src/routes/user.routes.js @@ -1,5 +1,5 @@ import { Router } from "express"; -import { register, logout, login } from "../controllers/user.controllers.js"; +import { register, logout, login, refreshAccessToken, getCurrentUser } from "../controllers/user.controllers.js"; import { upload } from "../middlewares/multer.middleware.js"; import { verifyJWT } from "../middlewares/auth.middleware.js"; @@ -10,5 +10,9 @@ router.route("/login").post(login); // Secured routes with Authentication router.route("/logout").post(verifyJWT, logout); +router.route("/refresh-token").post(refreshAccessToken); + +// Current User Data +router.route("/current-user").get(verifyJWT, getCurrentUser); export default router; From e65239f04af3112ad4c79165a248f9faaad15820 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 10:53:27 +0530 Subject: [PATCH 12/26] fix: Fixed Cloudinary upload bug --- backend/src/controllers/user.controllers.js | 3 +++ backend/src/middlewares/multer.middleware.js | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/backend/src/controllers/user.controllers.js b/backend/src/controllers/user.controllers.js index 2f7d786..5fce2d6 100644 --- a/backend/src/controllers/user.controllers.js +++ b/backend/src/controllers/user.controllers.js @@ -136,6 +136,7 @@ const login = asyncHandler(async (req, res) => { ); }); +// Logout Functionality const logout = asyncHandler(async (req, res) => { await User.findByIdAndUpdate( req.user._id, @@ -161,6 +162,7 @@ const logout = asyncHandler(async (req, res) => { .json(new ApiResponse(200, {}, "User logged Out successfuly")); }); +// Endpoint that has to be hit to regenerate token const refreshAccessToken = asyncHandler(async (req, res) => { const incomingToken = req.cookies.refreshToken || req.body.refreshToken; @@ -202,6 +204,7 @@ const refreshAccessToken = asyncHandler(async (req, res) => { ); }); +// Get Current user data lol const getCurrentUser = asyncHandler(async (req, res) => { return res .status(200) diff --git a/backend/src/middlewares/multer.middleware.js b/backend/src/middlewares/multer.middleware.js index 756d76c..120cdbd 100644 --- a/backend/src/middlewares/multer.middleware.js +++ b/backend/src/middlewares/multer.middleware.js @@ -2,12 +2,12 @@ import multer from "multer"; // We wouldn't want filenames to be same in the backend // This will generate random filename for a file based on the current timestamp -function getRandomFileName() { - var timestamp = new Date().toISOString().replace(/[-:.]/g, ""); - var random = ("" + Math.random()).substring(2, 8); - var random_number = timestamp + random; - return random_number; -} +// function getRandomFileName() { +// var timestamp = new Date().toISOString().replace(/[-:.]/g, ""); +// var random = ("" + Math.random()).substring(2, 8); +// var random_number = timestamp + random; +// return random_number; +// } // Basic multer storage configuration const storage = multer.diskStorage({ @@ -17,8 +17,12 @@ const storage = multer.diskStorage({ cb(null, "./public/temp"); }, filename: function (req, file, cb) { - const randomName = getRandomFileName(); - cb(null, randomName); + console.log("MIME TYPE", file.mimetype); + // FIXME: This is a bug, the file name should be random + // const randomName = getRandomFileName(); + // const ext = path.extname(file.originalname); + // cb(null, `${randomName}${ext}`); + cb(null, file.originalname); }, }); From 0e508c7bc949fc108b35e6117bf080e071ef2abd Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 11:12:50 +0530 Subject: [PATCH 13/26] feat: create Assignment with file upload support --- .../src/controllers/assignment.controllers.js | 44 +++++++++++++++++++ backend/src/routes/assignment.routes.js | 5 +++ backend/src/utils/cloudinary.js | 6 ++- 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 backend/src/controllers/assignment.controllers.js create mode 100644 backend/src/routes/assignment.routes.js diff --git a/backend/src/controllers/assignment.controllers.js b/backend/src/controllers/assignment.controllers.js new file mode 100644 index 0000000..8394c01 --- /dev/null +++ b/backend/src/controllers/assignment.controllers.js @@ -0,0 +1,44 @@ +import { Assignment } from "../models/assignment.models.js"; +import { ApiError } from "../utils/ApiError.js"; +import { ApiResponse } from "../utils/ApiResponse.js"; +import { asyncHandler } from "../utils/asyncHandler.js"; +import { uploadToCloud } from "../utils/cloudinary.js"; + +export const createAssignment = asyncHandler(async (req, res) => { + const { title, description, due_date } = req.body; + + if ([title, due_date].some((field) => field?.trim() === "")) { + throw new ApiError(400, "Some fields are required fields"); + } + + const docs = req.files + ? req.files.map(async (file) => { + const localPath = file.path; + console.log(localPath); + const doc = await uploadToCloud(localPath); + + return doc.url; + }) + : []; + + const uploadedDocs = await Promise.all(docs); + + const assignment = await Assignment.create({ + title, + description, + docs: uploadedDocs, + due_date, + user: req.user._id, + }); + + const assignmentFromDB = await Assignment.findById(assignment._id); + + if (!assignmentFromDB) { + throw new ApiError(500, "Something went wrong while creating Assignment"); + } + + return res + .status(201) + .json(new ApiResponse(200, assignmentFromDB, "Assignment Ban Gaya 🤩!")); +}); + diff --git a/backend/src/routes/assignment.routes.js b/backend/src/routes/assignment.routes.js new file mode 100644 index 0000000..41250a3 --- /dev/null +++ b/backend/src/routes/assignment.routes.js @@ -0,0 +1,5 @@ +import { Router } from "express"; + +const router = Router(); + +export default router; diff --git a/backend/src/utils/cloudinary.js b/backend/src/utils/cloudinary.js index 266bd18..bd9ab30 100644 --- a/backend/src/utils/cloudinary.js +++ b/backend/src/utils/cloudinary.js @@ -25,8 +25,10 @@ const uploadToCloud = async (localPath) => { try { if (!localPath) return null; const res = await cloud.uploader.upload(localPath, { - // FIXME: file type error on cloudinary - resource_type: "raw", + use_filename: true, + unique_filename: false, + overwrite: true, + resource_type: "auto", }); console.log("File Uploaded Successfully", res.url); deleteLocalFile(localPath); From 2fd5c7549153a9517dbe656b0dea55f701af0b68 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 15:40:53 +0530 Subject: [PATCH 14/26] feat: get userAssignments and protected routes --- .../src/controllers/assignment.controllers.js | 19 ++++++++++++++++++- backend/src/routes/assignment.routes.js | 9 ++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/backend/src/controllers/assignment.controllers.js b/backend/src/controllers/assignment.controllers.js index 8394c01..55d61de 100644 --- a/backend/src/controllers/assignment.controllers.js +++ b/backend/src/controllers/assignment.controllers.js @@ -4,7 +4,7 @@ import { ApiResponse } from "../utils/ApiResponse.js"; import { asyncHandler } from "../utils/asyncHandler.js"; import { uploadToCloud } from "../utils/cloudinary.js"; -export const createAssignment = asyncHandler(async (req, res) => { +const createAssignment = asyncHandler(async (req, res) => { const { title, description, due_date } = req.body; if ([title, due_date].some((field) => field?.trim() === "")) { @@ -42,3 +42,20 @@ export const createAssignment = asyncHandler(async (req, res) => { .json(new ApiResponse(200, assignmentFromDB, "Assignment Ban Gaya 🤩!")); }); +const getUserAssignments = asyncHandler(async (req, res) => { + const userId = req.user.id; + + const assignments = await Assignment.find({ user: userId }).sort({ + createdAt: -1, + }); + + if (!assignments.length) { + throw new ApiError(404, "No assignments found for this user..."); + } + + return res + .status(200) + .json(new ApiResponse(200, assignments, "Assignments Fetched")); +}); + +export { createAssignment, getUserAssignments }; diff --git a/backend/src/routes/assignment.routes.js b/backend/src/routes/assignment.routes.js index 41250a3..7db3e67 100644 --- a/backend/src/routes/assignment.routes.js +++ b/backend/src/routes/assignment.routes.js @@ -1,5 +1,12 @@ import { Router } from "express"; - +import { verifyJWT } from "../middlewares/auth.middleware"; +import { upload } from "../middlewares/multer.middleware.js"; +import { createAssignment, getUserAssignments } from "../controllers/assignment.controllers.js"; const router = Router(); +router.use(verifyJWT); + +router.route("/").post(upload.array("docs", 5), createAssignment); +router.route("/getAssignments").get(getUserAssignments); + export default router; From 979ca01f3b7e95f678e16ed43ae1d45bad9cac47 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Sun, 2 Feb 2025 16:22:37 +0530 Subject: [PATCH 15/26] feat: add update and delete functionality for assignments --- .../src/controllers/assignment.controllers.js | 86 ++++++++++++++++++- backend/src/routes/assignment.routes.js | 12 ++- 2 files changed, 96 insertions(+), 2 deletions(-) diff --git a/backend/src/controllers/assignment.controllers.js b/backend/src/controllers/assignment.controllers.js index 55d61de..de9761f 100644 --- a/backend/src/controllers/assignment.controllers.js +++ b/backend/src/controllers/assignment.controllers.js @@ -58,4 +58,88 @@ const getUserAssignments = asyncHandler(async (req, res) => { .json(new ApiResponse(200, assignments, "Assignments Fetched")); }); -export { createAssignment, getUserAssignments }; +const updateAssignment = asyncHandler(async (req, res) => { + const { assignmentId } = req.params; + const { title, description, due_date } = req.body; + + // Validate ObjectId + if (!isValidObjectId(assignmentId)) { + throw new ApiError(400, "Invalid Assignment ID"); + } + + // const assignment = await Assignment.findById(assignmentId); + // if (!assignment) { + // throw new ApiError(404, "Assignment not found"); + // } + // if (assignment.user.toString() !== req.user._id.toString()) { + // throw new ApiError(403, "Unauthorized to update this assignment"); + // } + + // Better approach (apparently😭) + const assignment = await Assignment.findOne({ + _id: assignmentId, + user: req.user._id, + }); + // Validation Again 💀 + if (!assignment) { + throw new ApiError(404, "Assignment not found or unauthorized access"); + } + + let uploadedDocs = assignment.docs; + if (req.files && req.files.length > 0) { + const docs = req.files.map(async (file) => { + const localPath = file.path; + return await uploadToCloud(localPath).url; + }); + const newDocs = await Promise.all(docs); + uploadedDocs = [...uploadedDocs, ...newDocs]; // Can't afford to loose previously uploaded docs + } + + assignment.docs = uploadedDocs; + + assignment.title = title || assignment.title; + assignment.description = description || assignment.description; + assignment.due_date = due_date || assignment.due_date; + + await assignment.save(); + + return res + .status(200) + .json(new ApiResponse(200, assignment, "Assignment Updates Successfully")); +}); + +const deleteAssignment = asyncHandler(async (req, res) => { + const { assignmentId } = req.params; + + if (!mongoose.Types.ObjectId.isValid(assignmentId)) { + throw new ApiError(400, "Invalid Assignment ID."); + } + + const assignment = await Assignment.findOne({ + _id: assignmentId, + user: req.user._id, + }); + // Validation Again 💀 + if (!assignment) { + throw new ApiError(404, "Assignment not found or unauthorized access"); + } + + // Remove files from Cloudinary + if (assignment.docs.length > 0) { + const deleteFilePromises = assignment.docs.map(async (fileUrl) => { + try { + const publicId = fileUrl.split("/").pop().split(".")[0]; // Extract public ID (got this from stackoverflow) + await cloudinary.uploader.destroy(publicId); + } catch (error) { + console.error(`Failed to delete file: ${fileUrl}`, error); + } + }); + await Promise.all(deleteFilePromises); + } + + await Assignment.findByIdAndDelete(assignmentId); + + return res.status(200).json(new ApiResponse(200, {}, "Khatam tata bye bye")); +}); + +export { createAssignment, getUserAssignments, updateAssignment, deleteAssignment }; diff --git a/backend/src/routes/assignment.routes.js b/backend/src/routes/assignment.routes.js index 7db3e67..03d9da7 100644 --- a/backend/src/routes/assignment.routes.js +++ b/backend/src/routes/assignment.routes.js @@ -1,12 +1,22 @@ import { Router } from "express"; import { verifyJWT } from "../middlewares/auth.middleware"; import { upload } from "../middlewares/multer.middleware.js"; -import { createAssignment, getUserAssignments } from "../controllers/assignment.controllers.js"; +import { + createAssignment, + getUserAssignments, + updateAssignment, + deleteAssignment, +} from "../controllers/assignment.controllers.js"; const router = Router(); router.use(verifyJWT); router.route("/").post(upload.array("docs", 5), createAssignment); + +// Fetch all assignments of current user router.route("/getAssignments").get(getUserAssignments); +// Assignment update and delete routes +router.route("/:assignmentId").patch(updateAssignment).delete(deleteAssignment); + export default router; From e5fad04b75aff7b2e8f8825314f18ae365b50891 Mon Sep 17 00:00:00 2001 From: Venu4i Date: Mon, 3 Feb 2025 01:58:08 +0530 Subject: [PATCH 16/26] fix: landing page --- frontend/pages/Home.jsx | 18 +++++++----------- frontend/pages/Signup.jsx | 4 ++-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/frontend/pages/Home.jsx b/frontend/pages/Home.jsx index f866ef7..5863fa9 100644 --- a/frontend/pages/Home.jsx +++ b/frontend/pages/Home.jsx @@ -57,20 +57,16 @@ const Home = () => { {/* Navigation Menu */}