From 6fa856e966dc8568bb990fb0bc8c060ad3806560 Mon Sep 17 00:00:00 2001 From: Aman Singh Date: Tue, 25 Feb 2025 23:48:06 +0530 Subject: [PATCH 01/15] FEAT: adjust delete speed in RetroBoard and add tooltip to mood buttons in RetroMood --- client/src/pages/retro/RetroBoard.jsx | 2 +- client/src/pages/retro/RetroMood.jsx | 28 ++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/client/src/pages/retro/RetroBoard.jsx b/client/src/pages/retro/RetroBoard.jsx index 3ceacf5..a32dc43 100755 --- a/client/src/pages/retro/RetroBoard.jsx +++ b/client/src/pages/retro/RetroBoard.jsx @@ -97,7 +97,7 @@ export default function RetroBoard() { ], autoStart: true, loop: true, - deleteSpeed: 50, + deleteSpeed: 30, }} /> diff --git a/client/src/pages/retro/RetroMood.jsx b/client/src/pages/retro/RetroMood.jsx index d5eede1..046468a 100755 --- a/client/src/pages/retro/RetroMood.jsx +++ b/client/src/pages/retro/RetroMood.jsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import Grid from '@mui/material/Grid2'; -import { Button } from '@mui/material'; +import { Button, Tooltip } from '@mui/material'; import { styled } from '@mui/material/styles'; import Badge, { badgeClasses } from '@mui/material/Badge'; @@ -42,18 +42,20 @@ export default function RetroMood({ moods, updateMood }) { {moods.map((data) => ( - + + + ))} From 88273bce95ac3d6778964561fd198f0298c5c750 Mon Sep 17 00:00:00 2001 From: Aman Singh Date: Fri, 28 Feb 2025 23:49:18 +0530 Subject: [PATCH 02/15] FEAT: enhance group addition functionality with email validation and loading state management --- client/src/components/group/GroupAdd.jsx | 45 +++++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/client/src/components/group/GroupAdd.jsx b/client/src/components/group/GroupAdd.jsx index 39486e8..a9fb7d4 100644 --- a/client/src/components/group/GroupAdd.jsx +++ b/client/src/components/group/GroupAdd.jsx @@ -1,9 +1,45 @@ -import PropTypes from 'prop-types'; import { Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, Button } from '@mui/material'; +import PropTypes from 'prop-types'; +import { toast } from 'react-toastify'; + +import { useAuth } from '../../hooks/useAuth'; +import { useLoading } from '../../hooks/useLoading'; + + +export default function GroupAdd({ openAdd, setOpenAdd }) { + + const { http } = useAuth(); + const { setLoading } = useLoading(); + + const handleGroupAdd = async (data) => { + const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; + + const members = data.members + .split(',') + .map(email => email.trim().replace(/^["']|["']$/g, '')) + .filter(email => emailRegex.test(email)); + + if (members.length === 0 || data.members.trim() === "" || members.some(email => email === "")) { + toast.info("Invalid email(s) entered. Please check and try again."); + return; + } -export default function GroupAdd({ openAdd, setOpenAdd, handleAdd }) { + try { + setLoading(true); + const response = await http.post('/group/add', { name: data.name, members }); + toast.success("Group added successfully!"); + openAdd(false); + if (response.data?.memberNotFound?.length > 0) + toast.info(`The following members were not found: ${response.data.memberNotFound.join(', ')}`); + } catch (error) { + toast.error(error.response?.data?.message || "An error occurred. Please try again later."); + console.error(error); + } finally { + setLoading(false); + } + }; return ( Date: Sat, 1 Mar 2025 22:41:13 +0530 Subject: [PATCH 03/15] FEAT: remove console logs from socket event handlers in useRetroSocket hook --- client/src/hooks/useRetroSocket.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/src/hooks/useRetroSocket.js b/client/src/hooks/useRetroSocket.js index 132d102..d732514 100755 --- a/client/src/hooks/useRetroSocket.js +++ b/client/src/hooks/useRetroSocket.js @@ -60,19 +60,16 @@ export const useRetroSocket = (retroId) => { // update mood const updateMood = (emoji) => { - console.log("UPDATING EMOJI", { emoji, email: userData?.email }); socket?.emit("updateMood", { emoji, email: userData?.email }); }; // add review const addReview = (column, comment) => { - console.log("ADDING REVIEW", { column, comment, email: userData?.email }); socket?.emit("addReview", { column, comment, email: userData?.email }); }; // update review const updateReview = (column, comment, index) => { - console.log("UPDATING REVIEW", { column, comment, index, email: userData?.email }); socket?.emit("updateReview", { column, comment, index, email: userData?.email }); }; From 0ad8dbbaa58a96863a1353057ccf13653abf054e Mon Sep 17 00:00:00 2001 From: Aman Singh Date: Sun, 2 Mar 2025 01:20:06 +0530 Subject: [PATCH 04/15] FEAT: add slide transition to ToastContainer in App component --- client/src/App.jsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/src/App.jsx b/client/src/App.jsx index ac6fda2..71ee91b 100755 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -1,5 +1,5 @@ -import { ToastContainer } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; +import { ToastContainer, Slide } from 'react-toastify'; import Router from "./Router"; import Loading from './components/Loading'; @@ -17,7 +17,13 @@ export default function App() { - + ) } From e5a6f6d5ca231b9a729704e11d68c0ed1de244aa Mon Sep 17 00:00:00 2001 From: Aman Singh Date: Sun, 2 Mar 2025 01:20:30 +0530 Subject: [PATCH 05/15] FEAT: enhance PrivateRoutes component to include HTTP authorization check and improve loading state handling --- client/src/middleware/PrivateRoutes.jsx | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/client/src/middleware/PrivateRoutes.jsx b/client/src/middleware/PrivateRoutes.jsx index dfbf605..6962e9e 100755 --- a/client/src/middleware/PrivateRoutes.jsx +++ b/client/src/middleware/PrivateRoutes.jsx @@ -10,14 +10,12 @@ import { useAuth } from '../hooks/useAuth'; // PrivateRoutes component to protect routes export default function PrivateRoutes() { - const { isAuthLoading, isAuthenticated, logout } = useAuth(); + const { isAuthLoading, isAuthenticated, http, logout } = useAuth(); useEffect(() => { - if (isAuthLoading) return; - + if (isAuthLoading || !http.defaults.headers.common.Authorization) return; if (!isAuthenticated) logout(); - - }, [isAuthLoading, isAuthenticated, logout]); + }, [isAuthLoading, isAuthenticated, http, logout]); if (!isAuthenticated) { return null; @@ -32,10 +30,16 @@ export default function PrivateRoutes() { //