Files
Dwinzo_Demo/app/src/components/Dashboard/DashboardHome.tsx

168 lines
4.8 KiB
TypeScript
Raw Normal View History

2025-06-10 15:28:23 +05:30
import React, { useEffect, useState } from "react";
import DashboardCard from "./DashboardCard";
import DashboardNavBar from "./DashboardNavBar";
import MarketPlaceBanner from "./MarketPlaceBanner";
2025-06-23 09:37:53 +05:30
import { getUserData } from "../../functions/getUserData";
2025-06-10 15:28:23 +05:30
import { useSocketStore } from "../../store/builder/store";
import { recentlyViewed } from "../../services/dashboard/recentlyViewed";
import { searchProject } from "../../services/dashboard/searchProjects";
import { deleteProject } from "../../services/dashboard/deleteProject";
import ProjectSocketRes from "./socket/projectSocketRes.dev";
2025-08-05 11:31:26 +05:30
import { generateUniqueId } from "../../functions/generateUniqueId";
2025-06-10 15:28:23 +05:30
interface Project {
_id: string;
projectName: string;
thumbnail: string;
2025-08-02 18:23:42 +05:30
createdBy: { _id: string; userName: string };
2025-06-10 15:28:23 +05:30
projectUuid?: string;
createdAt: string;
2025-08-02 18:23:42 +05:30
isViewed?: string;
2025-06-10 15:28:23 +05:30
}
interface RecentProjectsData {
[key: string]: Project[];
}
const DashboardHome: React.FC = () => {
const [recentProjects, setRecentProjects] = useState<RecentProjectsData>({});
2025-08-02 18:23:42 +05:30
2025-06-10 15:28:23 +05:30
const [isSearchActive, setIsSearchActive] = useState<boolean>(false);
const { userId, organization } = getUserData();
const { projectSocket } = useSocketStore();
const [recentDuplicateData, setRecentDuplicateData] = useState<Object>({});
const fetchRecentProjects = async () => {
try {
const projects = await recentlyViewed(organization, userId);
2025-06-10 15:28:23 +05:30
if (JSON.stringify(projects) !== JSON.stringify(recentProjects)) {
setRecentProjects(projects);
}
2025-09-01 17:36:40 +05:30
} catch (error) { }
2025-06-10 15:28:23 +05:30
};
const handleRecentProjectSearch = async (inputValue: string) => {
if (!inputValue.trim()) {
setIsSearchActive(false);
return;
}
const filterRecentProcess = await searchProject(
organization,
userId,
inputValue
);
setIsSearchActive(true);
setRecentProjects(filterRecentProcess.message ? {} : filterRecentProcess);
};
const handleDeleteProject = async (projectId: any) => {
try {
//API for delete project
// const deletedProject = await deleteProject(
// projectId,
// userId,
// organization
// );
2025-08-02 18:23:42 +05:30
//
2025-06-10 15:28:23 +05:30
2025-09-01 17:36:40 +05:30
// SOCKET for delete Project
2025-06-10 15:28:23 +05:30
const deleteProject = {
projectId,
organization,
userId,
};
if (projectSocket) {
projectSocket.emit("v1:project:delete", deleteProject);
}
setRecentProjects((prevDiscardedProjects: RecentProjectsData) => {
if (!Array.isArray(prevDiscardedProjects?.RecentlyViewed)) {
return prevDiscardedProjects;
}
const updatedProjectDatas = prevDiscardedProjects.RecentlyViewed.filter(
(project) => project._id !== projectId
);
return {
...prevDiscardedProjects,
RecentlyViewed: updatedProjectDatas,
};
});
setIsSearchActive(false);
2025-09-01 17:36:40 +05:30
} catch (error) { }
2025-06-10 15:28:23 +05:30
};
const handleDuplicateRecentProject = async (
projectId: string,
projectName: string,
thumbnail: string
) => {
2025-09-01 17:36:40 +05:30
if (projectSocket) {
const duplicateRecentProjectData = {
userId,
thumbnail,
organization,
projectUuid: generateUniqueId(),
refProjectID: projectId,
projectName,
};
projectSocket.emit("v1:project:Duplicate", duplicateRecentProjectData);
}
2025-06-10 15:28:23 +05:30
};
const renderProjects = () => {
const projectList = recentProjects[Object.keys(recentProjects)[0]];
if (!projectList?.length) {
return <div className="empty-state">No recent projects found</div>;
}
return (
projectList &&
projectList.map((project) => (
<DashboardCard
key={project._id}
projectName={project.projectName}
thumbnail={project.thumbnail}
projectId={project._id}
createdBy={project.createdBy}
createdAt={project.createdAt}
2025-06-10 15:28:23 +05:30
handleDeleteProject={handleDeleteProject}
handleDuplicateRecentProject={handleDuplicateRecentProject}
setRecentDuplicateData={setRecentDuplicateData}
/>
))
);
};
useEffect(() => {
if (!isSearchActive) {
fetchRecentProjects();
}
}, [isSearchActive]);
return (
<div className="dashboard-home-container">
<DashboardNavBar
page="home"
handleRecentProjectSearch={handleRecentProjectSearch}
/>
<MarketPlaceBanner />
2025-06-23 09:37:53 +05:30
<div className="dashboard-container">
2025-06-10 15:28:23 +05:30
<h2 className="section-header">Recents</h2>
<div className="cards-container">{renderProjects()}</div>
</div>
{recentDuplicateData && Object.keys(recentDuplicateData).length > 0 && (
<ProjectSocketRes
setIsSearchActive={setIsSearchActive}
setRecentProjects={setRecentProjects}
/>
)}
</div>
);
};
2025-08-02 18:23:42 +05:30
export default DashboardHome;