161 lines
5.8 KiB
TypeScript
161 lines
5.8 KiB
TypeScript
import React, { useEffect } from "react";
|
|
import { useNavigate, useParams } from "react-router-dom";
|
|
import useModuleStore from "../store/ui/useModuleStore";
|
|
import { useSocketStore } from "../store/socket/useSocketStore";
|
|
import { useSelectedUserStore } from "../store/collaboration/useCollabStore";
|
|
import { useProjectName, useActiveTool } from "../store/builder/store";
|
|
import { handleCanvasCursors } from "../utils/mouseUtils/handleCanvasCursors";
|
|
|
|
import { getUserData } from "../functions/getUserData";
|
|
import { viewProjectApi } from "../services/dashboard/viewProjectApi";
|
|
import { getAllProjectsApi } from "../services/dashboard/getAllProjectsApi";
|
|
import { sharedWithMeProjectsApi } from "../services/dashboard/sharedWithMeProjectApi";
|
|
|
|
import { useLogger } from "../components/ui/log/LoggerContext";
|
|
import { SceneProvider } from "../modules/scene/sceneContext";
|
|
|
|
import FollowPerson from "../components/templates/FollowPerson";
|
|
import RenderOverlay from "../components/templates/Overlay";
|
|
import LogList from "../components/ui/log/LogList";
|
|
import MainScene from "../components/layout/scenes/MainScene";
|
|
import ComparisonScene from "../components/layout/scenes/ComparisonScene";
|
|
|
|
const Project: React.FC = () => {
|
|
let navigate = useNavigate();
|
|
const echo = useLogger();
|
|
const { setActiveModule } = useModuleStore();
|
|
const {
|
|
builderSocket,
|
|
visualizationSocket,
|
|
threadSocket,
|
|
initializeBuilderSocket,
|
|
initializeVisualizationSocket,
|
|
initializeThreadSocket,
|
|
disconnectBuilderSocket,
|
|
disconnectVisualizationSocket,
|
|
disconnectThreadSocket,
|
|
} = useSocketStore();
|
|
const { projectId } = useParams();
|
|
const { setProjectName } = useProjectName();
|
|
const { userId, email } = getUserData();
|
|
const { selectedUser } = useSelectedUserStore();
|
|
const { isLogListVisible } = useLogger();
|
|
const { activeTool } = useActiveTool();
|
|
|
|
useEffect(() => {
|
|
setActiveModule("builder");
|
|
if (!email || !userId) {
|
|
console.error("User data not found in localStorage");
|
|
navigate("/page-not-found");
|
|
return;
|
|
}
|
|
const fetchProjects = async () => {
|
|
try {
|
|
const projects = await getAllProjectsApi();
|
|
const shared = await sharedWithMeProjectsApi();
|
|
|
|
const allProjects = [...(projects?.Projects || []), ...(shared?.Shared || [])];
|
|
|
|
const matchedProject = allProjects.find((val: any) => val.projectUuid === projectId || val._id === projectId);
|
|
if (matchedProject) {
|
|
setProjectName(matchedProject.projectName);
|
|
await viewProjectApi(matchedProject._id);
|
|
} else {
|
|
console.warn("Project not found with given ID:", projectId);
|
|
navigate(`/not_found#project_not_found#${projectId}`);
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching projects:", error);
|
|
}
|
|
};
|
|
|
|
fetchProjects();
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [projectId]);
|
|
|
|
useEffect(() => {
|
|
const token = localStorage.getItem("token");
|
|
const refreshToken = localStorage.getItem("refreshToken");
|
|
|
|
if (token && refreshToken && projectId) {
|
|
echo.warn("Validating token");
|
|
initializeBuilderSocket(token, refreshToken, projectId);
|
|
echo.success("Builder socket initialized");
|
|
} else {
|
|
navigate("/");
|
|
return;
|
|
}
|
|
|
|
return () => {
|
|
if (projectId && builderSocket) {
|
|
disconnectBuilderSocket(projectId);
|
|
}
|
|
};
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [projectId, builderSocket]);
|
|
|
|
useEffect(() => {
|
|
const token = localStorage.getItem("token");
|
|
const refreshToken = localStorage.getItem("refreshToken");
|
|
|
|
if (token && refreshToken && projectId) {
|
|
initializeVisualizationSocket(token, refreshToken, projectId);
|
|
echo.success("Visualization socket initialized");
|
|
} else {
|
|
navigate("/");
|
|
return;
|
|
}
|
|
|
|
return () => {
|
|
if (projectId && visualizationSocket) {
|
|
disconnectVisualizationSocket(projectId);
|
|
}
|
|
};
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [projectId, visualizationSocket]);
|
|
|
|
useEffect(() => {
|
|
const token = localStorage.getItem("token");
|
|
const refreshToken = localStorage.getItem("refreshToken");
|
|
|
|
if (token && refreshToken && projectId) {
|
|
initializeThreadSocket(token, refreshToken, projectId);
|
|
echo.success("Thread socket initialized");
|
|
} else {
|
|
navigate("/");
|
|
return;
|
|
}
|
|
|
|
return () => {
|
|
if (projectId && threadSocket) {
|
|
disconnectThreadSocket(projectId);
|
|
}
|
|
};
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [projectId, threadSocket]);
|
|
|
|
useEffect(() => {
|
|
handleCanvasCursors(activeTool);
|
|
}, [activeTool]);
|
|
|
|
return (
|
|
<div className="project-main">
|
|
<SceneProvider layout="Main Layout">
|
|
<MainScene />
|
|
</SceneProvider>
|
|
<SceneProvider layout="Comparison Layout">
|
|
<ComparisonScene />
|
|
</SceneProvider>
|
|
{selectedUser && <FollowPerson />}
|
|
{isLogListVisible && (
|
|
<RenderOverlay>
|
|
<LogList />
|
|
</RenderOverlay>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Project;
|