From 90fb7fbc06865c6a0d69179420428353ddbb3fd2 Mon Sep 17 00:00:00 2001 From: Poovizhi99 Date: Mon, 8 Sep 2025 11:59:16 +0530 Subject: [PATCH] refactor: Clean up DashboardMain, SidePannel, and ProjectSocketRes components by removing unused imports and optimizing code structure --- .../components/Dashboard/DashboardMain.tsx | 424 ++++++++---------- app/src/components/Dashboard/SidePannel.tsx | 46 +- .../Dashboard/socket/projectSocketRes.tsx | 131 +++--- 3 files changed, 275 insertions(+), 326 deletions(-) diff --git a/app/src/components/Dashboard/DashboardMain.tsx b/app/src/components/Dashboard/DashboardMain.tsx index c8f6ea7..d10a18b 100644 --- a/app/src/components/Dashboard/DashboardMain.tsx +++ b/app/src/components/Dashboard/DashboardMain.tsx @@ -15,258 +15,220 @@ import { generateUniqueId } from "../../functions/generateUniqueId"; import ProjectSocketRes from "./socket/projectSocketRes"; interface Project { - _id: string; - projectName: string; - thumbnail: string; - createdBy: { _id: string; userName: string }; - projectUuid?: string; - createdAt?: string; - DeletedAt?: string; + _id: string; + projectName: string; + thumbnail: string; + createdBy: { _id: string; userName: string }; + projectUuid?: string; + createdAt?: string; + DeletedAt?: string; } interface ProjectCollection { - [key: string]: Project[]; + [key: string]: Project[]; } type Folder = "home" | "projects" | "shared" | "trash"; interface DashboardMainProps { - activeFolder: Folder; + activeFolder: Folder; } const DashboardMain: React.FC = ({ activeFolder }) => { - const [activeSubFolder, setActiveSubFolder] = useState("myProjects"); - const [projectsData, setProjectsData] = useState({}); - const [isSearchActive, setIsSearchActive] = useState(false); - const [duplicateData, setDuplicateData] = useState({}); - const [openKebabProjectId, setOpenKebabProjectId] = useState( - null - ); - const [projectsCache, setProjectsCache] = useState<{ - [key: string]: ProjectCollection; - }>({}); + const [activeSubFolder, setActiveSubFolder] = useState("myProjects"); + const [projectsData, setProjectsData] = useState({}); + const [isSearchActive, setIsSearchActive] = useState(false); + const [duplicateData, setDuplicateData] = useState({}); + const [openKebabProjectId, setOpenKebabProjectId] = useState(null); + const [projectsCache, setProjectsCache] = useState<{ + [key: string]: ProjectCollection; + }>({}); - const { userId, organization } = getUserData(); - const { projectSocket } = useSocketStore(); + const { userId, organization } = getUserData(); + const { projectSocket } = useSocketStore(); - // #region API Fetchers - const fetchData = async () => { - const cacheKey = - activeFolder + (activeFolder === "projects" ? `-${activeSubFolder}` : ""); + // #region API Fetchers + const fetchData = async () => { + const cacheKey = activeFolder + (activeFolder === "projects" ? `-${activeSubFolder}` : ""); - if (projectsCache[cacheKey] && !isSearchActive) { - setProjectsData(projectsCache[cacheKey]); - return; - } - - try { - let projects: ProjectCollection = {}; // initialize as empty object - - switch (activeFolder) { - case "home": - projects = await recentlyViewed(organization, userId); - break; - case "projects": - if (activeSubFolder === "myProjects") { - projects = await getAllProjects(userId, organization); - } else { - projects = await sharedWithMeProjects(); - } - break; - case "trash": - projects = await getTrash(organization); - break; - } - - // Only update cache if projects is not empty - if ( - projects && - JSON.stringify(projects) !== JSON.stringify(projectsData) - ) { - setProjectsCache((prev) => ({ ...prev, [cacheKey]: projects })); - setProjectsData(projects); - } - } catch (error) { - console.error(error); - } - }; - - // #region Search Handlers - const handleSearch = async (inputValue: string) => { - if (!inputValue.trim()) { - setIsSearchActive(false); - return; - } - - let results; - if (activeFolder === "trash") { - results = await trashSearchProject(organization, userId, inputValue); - } else { - results = await searchProject(organization, userId, inputValue); - } - - setIsSearchActive(true); - setProjectsData(results?.message ? {} : results); - }; - - // #region Socket Actions - const handleDelete = async (projectId: string): Promise => { - if (projectSocket) { - projectSocket.emit("v1:project:delete", { - projectId, - organization, - userId, - }); - } - updateStateAfterRemove(projectId); - }; - - const handlePermanentDelete = async (projectId: string): Promise => { - if (projectSocket) { - projectSocket.emit("v1:trash:delete", { - projectId, - organization, - userId, - }); - } - updateStateAfterRemove(projectId); - }; - - const handleRestore = async (projectId: string): Promise => { - await restoreTrash(organization, projectId); - updateStateAfterRemove(projectId); - }; - - const handleDuplicate = async ( - projectId: string, - projectName: string, - thumbnail: string - ): Promise => { - if (projectSocket) { - projectSocket.emit("v1:project:Duplicate", { - userId, - thumbnail, - organization, - projectUuid: generateUniqueId(), - refProjectID: projectId, - projectName, - }); - } - }; - - // #region Project Map - const updateStateAfterRemove = (projectId: string) => { - setProjectsData((prev: ProjectCollection) => { - const key = Object.keys(prev)[0]; - const updatedList = prev[key]?.filter((p) => p._id !== projectId) || []; - return { ...prev, [key]: updatedList }; - }); - setIsSearchActive(false); - }; - - const renderProjects = () => { - const key = Object.keys(projectsData)[0]; - const projectList = projectsData[key]; - - if (!projectList?.length) { - return
No projects found
; - } - - return projectList.map((project) => ( - - )); - }; - // #region Use Effects - useEffect(() => { - if (!isSearchActive) fetchData(); - // eslint-disable-next-line - }, [activeFolder, isSearchActive, activeSubFolder]); + try { + let projects: ProjectCollection = {}; // initialize as empty object - return ( -
- + switch (activeFolder) { + case "home": + projects = await recentlyViewed(organization, userId); + break; + case "projects": + if (activeSubFolder === "myProjects") { + projects = await getAllProjects(userId, organization); + } else { + projects = await sharedWithMeProjects(); + } + break; + case "trash": + projects = await getTrash(organization); + break; + } - {activeFolder === "home" && } + // Only update cache if projects is not empty + if (projects && JSON.stringify(projects) !== JSON.stringify(projectsData)) { + setProjectsCache((prev) => ({ ...prev, [cacheKey]: projects })); + setProjectsData(projects); + } + } catch (error) { + console.error(error); + } + }; -
- {activeFolder === "projects" && ( -
- - -
- )} + // #region Search Handlers + const handleSearch = async (inputValue: string) => { + if (!inputValue.trim()) { + setIsSearchActive(false); + return; + } -
{renderProjects()}
+ let results; + if (activeFolder === "trash") { + results = await trashSearchProject(organization, userId, inputValue); + } else { + results = await searchProject(organization, userId, inputValue); + } - {duplicateData && Object.keys(duplicateData).length > 0 && ( - - )} -
-
- ); + setIsSearchActive(true); + setProjectsData(results?.message ? {} : results); + }; + + // #region Socket Actions + const handleDelete = async (projectId: string): Promise => { + if (projectSocket) { + projectSocket.emit("v1:project:delete", { + projectId, + organization, + userId, + }); + } + updateStateAfterRemove(projectId); + }; + + const handlePermanentDelete = async (projectId: string): Promise => { + if (projectSocket) { + projectSocket.emit("v1:trash:delete", { + projectId, + organization, + userId, + }); + } + updateStateAfterRemove(projectId); + }; + + const handleRestore = async (projectId: string): Promise => { + await restoreTrash(organization, projectId); + updateStateAfterRemove(projectId); + }; + + const handleDuplicate = async (projectId: string, projectName: string, thumbnail: string): Promise => { + if (projectSocket) { + projectSocket.emit("v1:project:Duplicate", { + userId, + thumbnail, + organization, + projectUuid: generateUniqueId(), + refProjectID: projectId, + projectName, + }); + } + }; + + // #region Project Map + const updateStateAfterRemove = (projectId: string) => { + setProjectsData((prev: ProjectCollection) => { + const key = Object.keys(prev)[0]; + const updatedList = prev[key]?.filter((p) => p._id !== projectId) || []; + return { ...prev, [key]: updatedList }; + }); + setIsSearchActive(false); + }; + + const renderProjects = () => { + const key = Object.keys(projectsData)[0]; + const projectList = projectsData[key]; + + if (!projectList?.length) { + return
No projects found
; + } + + return projectList.map((project) => ( + + )); + }; + + // #region Use Effects + useEffect(() => { + if (!isSearchActive) fetchData(); + // eslint-disable-next-line + }, [activeFolder, isSearchActive, activeSubFolder]); + + return ( +
+ + + {activeFolder === "home" && } + +
+ {activeFolder === "projects" && ( +
+ + +
+ )} + +
{renderProjects()}
+ + +
+
+ ); }; export default DashboardMain; diff --git a/app/src/components/Dashboard/SidePannel.tsx b/app/src/components/Dashboard/SidePannel.tsx index b612ba6..f384d99 100644 --- a/app/src/components/Dashboard/SidePannel.tsx +++ b/app/src/components/Dashboard/SidePannel.tsx @@ -13,7 +13,7 @@ import darkThemeImage from "../../assets/image/darkThemeProject.png"; import lightThemeImage from "../../assets/image/lightThemeProject.png"; import { SettingsIcon, TrashIcon } from "../icons/ExportCommonIcons"; import { getUserData } from "../../functions/getUserData"; -import { useLoadingProgress, useSocketStore } from "../../store/builder/store"; +import { useSocketStore } from "../../store/builder/store"; // import { createProject } from "../../services/dashboard/createProject"; @@ -25,23 +25,20 @@ interface SidePannelProps { const SidePannel: React.FC = ({ setActiveTab, activeTab }) => { const { email, userName, userId, organization } = getUserData(); const navigate = useNavigate(); - const { setLoadingProgress } = useLoadingProgress(); const { projectSocket, initializeSocket } = useSocketStore(); const savedTheme = localStorage.getItem("theme") ?? "light"; function generateProjectId() { const randomBytes = new Uint8Array(12); crypto.getRandomValues(randomBytes); - return Array.from(randomBytes, (byte) => - byte.toString(16).padStart(2, "0") - ).join(""); + return Array.from(randomBytes, (byte) => byte.toString(16).padStart(2, "0")).join(""); } const handleCreateNewProject = async () => { const token = localStorage.getItem("token"); const refreshToken = localStorage.getItem("refreshToken"); if (!token || !refreshToken) { - console.error('token expired'); + console.error("token expired"); return; } @@ -56,15 +53,8 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => { organization: organization, projectUuid: projectId, }; - const handleResponse = (data: any) => { - if (data.message === "Project created successfully") { - setLoadingProgress(1); - navigate(`/projects/${data.data.projectId}`); - } - projectSocket.off("v1-project:response:add", handleResponse); - }; - projectSocket.on("v1-project:response:add", handleResponse); + console.log('addProject: ', addProject); projectSocket.emit("v1:project:add", addProject); } else { // API @@ -81,11 +71,11 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => {
-
- {userName?.charAt(0).toUpperCase()} -
+
{userName?.charAt(0).toUpperCase()}
- {userName ? userName.charAt(0).toUpperCase() + userName.slice(1).toLowerCase() : "Anonymous"} + {userName + ? userName.charAt(0).toUpperCase() + userName.slice(1).toLowerCase() + : "Anonymous"}
@@ -98,18 +88,14 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => {