2025-05-21 12:16:16 +00:00
|
|
|
import React, { useState, useRef } from "react";
|
2025-05-28 12:11:24 +00:00
|
|
|
import img from "../../assets/image/image.png";
|
2025-05-19 09:20:33 +00:00
|
|
|
import { useNavigate } from "react-router-dom";
|
|
|
|
import { getUserData } from "./functions/getUserData";
|
2025-05-28 12:11:24 +00:00
|
|
|
import { useProjectName } from "../../store/builder/store";
|
|
|
|
import { viewProject } from "../../services/dashboard/viewProject";
|
|
|
|
import OuterClick from "../../utils/outerClick";
|
|
|
|
import { KebabIcon } from "../icons/ExportCommonIcons";
|
2025-05-19 09:20:33 +00:00
|
|
|
|
|
|
|
interface DashBoardCardProps {
|
|
|
|
projectName: string;
|
|
|
|
thumbnail: any;
|
|
|
|
projectId: string;
|
|
|
|
handleDeleteProject?: (projectId: string) => Promise<void>;
|
|
|
|
handleRestoreProject?: (projectId: string) => Promise<void>;
|
2025-05-29 04:25:31 +00:00
|
|
|
active?: string;
|
2025-05-19 09:20:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const DashboardCard: React.FC<DashBoardCardProps> = ({
|
|
|
|
projectName,
|
|
|
|
handleDeleteProject,
|
|
|
|
thumbnail,
|
|
|
|
projectId,
|
|
|
|
handleRestoreProject,
|
2025-05-29 04:25:31 +00:00
|
|
|
active
|
2025-05-19 09:20:33 +00:00
|
|
|
}) => {
|
2025-05-21 12:16:16 +00:00
|
|
|
const navigate = useNavigate();
|
2025-05-19 09:20:33 +00:00
|
|
|
const { setProjectName } = useProjectName();
|
|
|
|
const { userId, organization, userName } = getUserData();
|
2025-05-21 12:16:16 +00:00
|
|
|
const [isKebabOpen, setIsKebabOpen] = useState(false);
|
2025-05-19 09:20:33 +00:00
|
|
|
|
2025-05-21 12:16:16 +00:00
|
|
|
const kebabRef = useRef<HTMLDivElement>(null);
|
2025-05-19 09:20:33 +00:00
|
|
|
|
|
|
|
const navigateToProject = async () => {
|
|
|
|
try {
|
|
|
|
const viewedProject = await viewProject(organization, projectId, userId);
|
2025-05-21 12:16:16 +00:00
|
|
|
console.log("Viewed project:", viewedProject);
|
2025-05-19 09:20:33 +00:00
|
|
|
} catch (error) {
|
2025-05-21 12:16:16 +00:00
|
|
|
console.error("Error opening project:", error);
|
2025-05-19 09:20:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
setProjectName(projectName);
|
|
|
|
navigate(`/${projectId}`);
|
|
|
|
};
|
2025-03-31 13:52:37 +00:00
|
|
|
|
2025-05-21 12:16:16 +00:00
|
|
|
const handleOptionClick = async (option: string) => {
|
|
|
|
switch (option) {
|
|
|
|
case "delete":
|
|
|
|
if (handleDeleteProject) {
|
|
|
|
await handleDeleteProject(projectId);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "restore":
|
|
|
|
if (handleRestoreProject) {
|
|
|
|
await handleRestoreProject(projectId);
|
|
|
|
}
|
|
|
|
break;
|
2025-05-29 04:25:31 +00:00
|
|
|
case "open in new tab":
|
|
|
|
try {
|
|
|
|
await viewProject(organization, projectId, userId);
|
|
|
|
setProjectName(projectName); // optional depending on scope
|
|
|
|
} catch (error) {
|
|
|
|
console.error("Error opening project in new tab:", error);
|
|
|
|
}
|
2025-05-21 12:16:16 +00:00
|
|
|
window.open(`/${projectId}`, "_blank");
|
|
|
|
break;
|
|
|
|
case "rename":
|
|
|
|
// Add rename logic here
|
|
|
|
break;
|
|
|
|
case "duplicate":
|
|
|
|
// Add duplication logic here
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
setIsKebabOpen(false);
|
|
|
|
};
|
|
|
|
|
|
|
|
OuterClick({
|
|
|
|
contextClassName: ["kebab-wrapper", "kebab-options-wrapper"],
|
|
|
|
setMenuVisible: () => setIsKebabOpen(false),
|
|
|
|
});
|
2025-03-31 13:52:37 +00:00
|
|
|
return (
|
2025-05-21 12:16:16 +00:00
|
|
|
<button
|
|
|
|
className="dashboard-card-container"
|
|
|
|
onClick={navigateToProject}
|
|
|
|
title={projectName}
|
|
|
|
>
|
|
|
|
<div className="dashboard-card-wrapper">
|
|
|
|
<div className="preview-container">
|
|
|
|
{thumbnail ? (
|
|
|
|
<img src={thumbnail} alt="" />
|
|
|
|
) : (
|
|
|
|
<img src={img} alt="" />
|
|
|
|
)}
|
2025-03-31 13:52:37 +00:00
|
|
|
</div>
|
2025-05-21 12:16:16 +00:00
|
|
|
<div className="project-details-container">
|
|
|
|
<div className="project-details">
|
|
|
|
<div className="project-name">{projectName}</div>
|
|
|
|
<div className="project-data">24-12-2025</div>
|
2025-05-19 09:20:33 +00:00
|
|
|
</div>
|
2025-05-21 12:16:16 +00:00
|
|
|
<div className="users-list-container" ref={kebabRef}>
|
|
|
|
<div className="user-profile">
|
|
|
|
{userName ? userName.charAt(0).toUpperCase() : "A"}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<button
|
|
|
|
className="kebab-wrapper"
|
|
|
|
onClick={(e) => {
|
|
|
|
e.stopPropagation(); // Prevents click from bubbling up
|
|
|
|
console.log("Kebab menu clicked");
|
|
|
|
setIsKebabOpen((prev) => !prev);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<KebabIcon />
|
|
|
|
</button>
|
2025-05-19 09:20:33 +00:00
|
|
|
</div>
|
2025-03-31 13:52:37 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2025-05-21 12:16:16 +00:00
|
|
|
|
2025-05-29 04:25:31 +00:00
|
|
|
{isKebabOpen && active !== "trash" && (
|
2025-05-21 12:16:16 +00:00
|
|
|
<div className="kebab-options-wrapper">
|
2025-05-29 04:25:31 +00:00
|
|
|
{["rename", "delete", "duplicate", "open in new tab"].map((option) => (
|
2025-05-21 12:16:16 +00:00
|
|
|
<button
|
|
|
|
key={option}
|
|
|
|
className="option"
|
|
|
|
onClick={(e) => {
|
|
|
|
console.log(option);
|
|
|
|
e.stopPropagation();
|
|
|
|
handleOptionClick(option);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{option}
|
|
|
|
</button>
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
)}
|
2025-05-29 04:25:31 +00:00
|
|
|
{isKebabOpen && active && active == "trash" && (
|
|
|
|
< div className="kebab-options-wrapper">
|
|
|
|
{["restore", "delete"].map((option) => (
|
|
|
|
<button
|
|
|
|
key={option}
|
|
|
|
className="option"
|
|
|
|
onClick={(e) => {
|
|
|
|
console.log(option);
|
|
|
|
e.stopPropagation();
|
|
|
|
handleOptionClick(option);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{option}
|
|
|
|
</button>
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
</button >
|
2025-03-31 13:52:37 +00:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2025-05-21 12:16:16 +00:00
|
|
|
export default DashboardCard;
|