From b3b0831a7f232ffb632a72a3af08de891324f81c Mon Sep 17 00:00:00 2001 From: Poovizhi99 Date: Thu, 26 Jun 2025 09:25:02 +0530 Subject: [PATCH] Enhance dashboard components with user collaboration features and project management improvements --- .../components/Dashboard/DashboardCard.tsx | 85 ++++--- .../components/Dashboard/DashboardHome.tsx | 8 +- .../Dashboard/DashboardProjects.tsx | 222 +++++++++++++++--- .../Dashboard/socket/projectSocketRes.dev.tsx | 16 +- .../templates/CollaborationPopup.tsx | 22 +- app/src/components/templates/LoadingPage.tsx | 55 ++++- .../components/ui/inputs/MultiEmailInvite.tsx | 18 +- app/src/modules/scene/scene.tsx | 4 +- app/src/pages/Project.tsx | 34 ++- .../services/dashboard/sharedWithMeProject.ts | 30 +++ 10 files changed, 380 insertions(+), 114 deletions(-) create mode 100644 app/src/services/dashboard/sharedWithMeProject.ts diff --git a/app/src/components/Dashboard/DashboardCard.tsx b/app/src/components/Dashboard/DashboardCard.tsx index 47fa261..68d91e7 100644 --- a/app/src/components/Dashboard/DashboardCard.tsx +++ b/app/src/components/Dashboard/DashboardCard.tsx @@ -1,4 +1,4 @@ -import React, { useState, useRef, useEffect } from "react"; +import React, { useState, useRef, useEffect, act } from "react"; import img from "../../assets/image/image.png"; import { useNavigate } from "react-router-dom"; import { getUserData } from "../../functions/getUserData"; @@ -14,13 +14,15 @@ interface DashBoardCardProps { projectId: string; createdAt?: string; isViewed?: string; + createdBy?: { _id: string, userName: string }; handleDeleteProject?: (projectId: string) => Promise; handleTrashDeleteProject?: (projectId: string) => Promise; handleRestoreProject?: (projectId: string) => Promise; handleDuplicateWorkspaceProject?: ( projectId: string, projectName: string, - thumbnail: string + thumbnail: string, + userId?: string ) => Promise; handleDuplicateRecentProject?: ( projectId: string, @@ -31,6 +33,7 @@ interface DashBoardCardProps { setIsSearchActive?: React.Dispatch>; setRecentDuplicateData?: React.Dispatch>; setProjectDuplicateData?: React.Dispatch>; + setActiveFolder?: React.Dispatch>; } type RelativeTimeFormatUnit = any; @@ -45,8 +48,10 @@ const DashboardCard: React.FC = ({ handleDuplicateWorkspaceProject, handleDuplicateRecentProject, createdAt, + createdBy, setRecentDuplicateData, setProjectDuplicateData, + setActiveFolder }) => { const navigate = useNavigate(); const { setProjectName } = useProjectName(); @@ -59,10 +64,18 @@ const DashboardCard: React.FC = ({ const kebabRef = useRef(null); const navigateToProject = async (e: any) => { + console.log('active: ', active); if (active && active == "trash") return; - setLoadingProgress(1) - setProjectName(projectName); - navigate(`/${projectId}`); + try { + const viewProjects = await viewProject(organization, projectId, userId) + console.log('viewProjects: ', viewProjects); + console.log('projectName: ', projectName); + setLoadingProgress(1) + setProjectName(projectName); + navigate(`/${projectId}`); + } catch { + + } }; const handleOptionClick = async (option: string) => { @@ -81,11 +94,18 @@ const DashboardCard: React.FC = ({ break; case "open in new tab": try { - await viewProject(organization, projectId, userId); - setProjectName(projectName); - setIsKebabOpen(false); + if (active === "shared" && createdBy) { + console.log("ihreq"); + const newTab = await viewProject(organization, projectId, createdBy?._id); + console.log('newTab: ', newTab); + } else { + const newTab = await viewProject(organization, projectId, userId); + console.log('newTab: ', newTab); + setProjectName(projectName); + setIsKebabOpen(false); + } } catch (error) { - console.error("Error opening project in new tab:", error); + } window.open(`/${projectId}`, "_blank"); break; @@ -100,13 +120,17 @@ const DashboardCard: React.FC = ({ projectName, thumbnail, }); - await handleDuplicateWorkspaceProject(projectId, projectName, thumbnail); + await handleDuplicateWorkspaceProject(projectId, projectName, thumbnail, userId); + if (active === "shared" && setActiveFolder) { + setActiveFolder("myProjects") + } } else if (handleDuplicateRecentProject) { setRecentDuplicateData && setRecentDuplicateData({ projectId, projectName, thumbnail, + userId }); await handleDuplicateRecentProject(projectId, projectName, thumbnail); } @@ -128,7 +152,6 @@ const DashboardCard: React.FC = ({ try { const projects = await getAllProjects(userId, organization); if (!projects || !projects.Projects) return; - // console.log("projects: ", projects); let projectUuid = projects.Projects.find( (val: any) => val.projectUuid === projectId || val._id === projectId ); @@ -173,6 +196,19 @@ const DashboardCard: React.FC = ({ return "just now"; } + const kebabOptionsMap: Record = { + default: ["rename", "delete", "duplicate", "open in new tab"], + trash: ["restore", "delete"], + shared: ["duplicate", "open in new tab"], + }; + + const getOptions = () => { + if (active === "trash") return kebabOptionsMap.trash; + if (active === "shared") return kebabOptionsMap.shared; + if (createdBy && createdBy?._id !== userId) return kebabOptionsMap.shared; + return kebabOptionsMap.default; + }; + return ( - ) - )} - - )} - {isKebabOpen && active && active == "trash" && ( -
- {["restore", "delete"].map((option) => ( + {getOptions().map((option) => (