From f0fdad9dff7a3132b254b545a6879a52b9a0f00a Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Wed, 10 Sep 2025 11:44:15 +0530 Subject: [PATCH] api's and threads refactor --- .../templates/CollaborationPopup.tsx | 4 +- .../collaboration/threads/CommentThreads.tsx | 12 ++-- .../ui/collaboration/threads/Messages.tsx | 34 +++++----- .../ui/collaboration/threads/ThreadChat.tsx | 18 ++--- .../components/ui/inputs/MultiEmailInvite.tsx | 4 +- .../collaboration/camera/collabCams.tsx | 2 +- .../modules/collaboration/collaboration.tsx | 4 +- .../socket/threadSocketResponses.dev.tsx | 24 ++----- .../threadInstance/threadInstance.tsx} | 26 +++---- .../threadInstances/threadInstances.tsx} | 22 +++--- .../threadsGroup.tsx} | 8 +-- app/src/modules/scene/sceneContext.tsx | 14 ++-- .../{ => collab}/comments/addCommentApi.ts | 0 .../{ => collab}/comments/createThreadApi.ts | 0 .../{ => collab}/comments/deleteCommentApi.ts | 0 .../{ => collab}/comments/deleteThreadApi.ts | 0 .../{ => collab}/comments/editCommentApi.ts | 0 .../comments/editThreadTitleApi.ts | 0 .../{ => collab}/comments/getAllThreads.ts | 0 .../{ => project}/getProjectSharedList.ts | 0 .../collab/{ => project}/getSearchUsers.ts | 0 .../collab/{ => project}/giveCollabAccess.ts | 68 +++++++++---------- .../collab/{ => project}/shareAccess.ts | 0 .../collab/{ => project}/shareProject.ts | 0 .../collab/{ => users}/getActiveUsers.ts | 62 ++++++++--------- .../collab/{ => users}/getUsersApi.ts | 62 ++++++++--------- .../store/collaboration/useCommentStore.ts | 62 ++++++++--------- app/src/types/collaborationTypes.d.ts | 4 +- 28 files changed, 209 insertions(+), 221 deletions(-) rename app/src/modules/collaboration/{comments/instances/commentInstance/commentInstance.tsx => threads/threadInstances/threadInstance/threadInstance.tsx} (86%) rename app/src/modules/collaboration/{comments/instances/commentInstances.tsx => threads/threadInstances/threadInstances.tsx} (78%) rename app/src/modules/collaboration/{comments/commentsGroup.tsx => threads/threadsGroup.tsx} (97%) rename app/src/services/factoryBuilder/{ => collab}/comments/addCommentApi.ts (100%) rename app/src/services/factoryBuilder/{ => collab}/comments/createThreadApi.ts (100%) rename app/src/services/factoryBuilder/{ => collab}/comments/deleteCommentApi.ts (100%) rename app/src/services/factoryBuilder/{ => collab}/comments/deleteThreadApi.ts (100%) rename app/src/services/factoryBuilder/{ => collab}/comments/editCommentApi.ts (100%) rename app/src/services/factoryBuilder/{ => collab}/comments/editThreadTitleApi.ts (100%) rename app/src/services/factoryBuilder/{ => collab}/comments/getAllThreads.ts (100%) rename app/src/services/factoryBuilder/collab/{ => project}/getProjectSharedList.ts (100%) rename app/src/services/factoryBuilder/collab/{ => project}/getSearchUsers.ts (100%) rename app/src/services/factoryBuilder/collab/{ => project}/giveCollabAccess.ts (96%) rename app/src/services/factoryBuilder/collab/{ => project}/shareAccess.ts (100%) rename app/src/services/factoryBuilder/collab/{ => project}/shareProject.ts (100%) rename app/src/services/factoryBuilder/collab/{ => users}/getActiveUsers.ts (97%) rename app/src/services/factoryBuilder/collab/{ => users}/getUsersApi.ts (97%) diff --git a/app/src/components/templates/CollaborationPopup.tsx b/app/src/components/templates/CollaborationPopup.tsx index 2219bc7..cd246fc 100644 --- a/app/src/components/templates/CollaborationPopup.tsx +++ b/app/src/components/templates/CollaborationPopup.tsx @@ -7,9 +7,9 @@ import { access } from "fs"; import MultiEmailInvite from "../ui/inputs/MultiEmailInvite"; import { useActiveUsers } from "../../store/builder/store"; import { getUserData } from "../../functions/getUserData"; -import { getProjectSharedList } from "../../services/factoryBuilder/collab/getProjectSharedList"; +import { getProjectSharedList } from "../../services/factoryBuilder/collab/project/getProjectSharedList"; import { useParams } from "react-router-dom"; -import { shareAccess } from "../../services/factoryBuilder/collab/shareAccess"; +import { shareAccess } from "../../services/factoryBuilder/collab/project/shareAccess"; import { getAvatarColor } from "../../modules/collaboration/functions/getAvatarColor"; interface UserListTemplateProps { diff --git a/app/src/components/ui/collaboration/threads/CommentThreads.tsx b/app/src/components/ui/collaboration/threads/CommentThreads.tsx index eb7822f..6426d53 100644 --- a/app/src/components/ui/collaboration/threads/CommentThreads.tsx +++ b/app/src/components/ui/collaboration/threads/CommentThreads.tsx @@ -5,10 +5,10 @@ import { getRelativeTime } from "../function/getRelativeTime"; interface CommentThreadsProps { commentClicked: () => void; - comment?: CommentSchema; + thread?: ThreadSchema; } -const CommentThreads: React.FC = ({ commentClicked, comment }) => { +const CommentThreads: React.FC = ({ commentClicked, thread }) => { const [expand, setExpand] = useState(false); const commentsedUsers = [{ creatorId: "1" }]; const { userName } = getUserData(); @@ -51,12 +51,12 @@ const CommentThreads: React.FC = ({ commentClicked, comment
{userName}
-
{comment?.createdAt && getRelativeTime(comment.createdAt)}
+
{thread?.createdAt && getRelativeTime(thread.createdAt)}
-
{comment?.threadTitle}
- {comment && comment?.comments.length > 0 && ( +
{thread?.threadTitle}
+ {thread && thread?.comments.length > 0 && (
- {comment?.comments.length} {comment?.comments.length === 1 ? "comment" : "replies"} + {thread?.comments.length} {thread?.comments.length === 1 ? "comment" : "replies"}
)}
diff --git a/app/src/components/ui/collaboration/threads/Messages.tsx b/app/src/components/ui/collaboration/threads/Messages.tsx index 9f3f8e0..f5d3910 100644 --- a/app/src/components/ui/collaboration/threads/Messages.tsx +++ b/app/src/components/ui/collaboration/threads/Messages.tsx @@ -6,15 +6,14 @@ import { getUserData } from "../../../../functions/getUserData"; import { useParams } from "react-router-dom"; import { useSelectedComment, useSocketStore } from "../../../../store/builder/store"; import { getRelativeTime } from "../function/getRelativeTime"; -import { editThreadTitleApi } from "../../../../services/factoryBuilder/comments/editThreadTitleApi"; +import { editThreadTitleApi } from "../../../../services/factoryBuilder/collab/comments/editThreadTitleApi"; import { useSceneContext } from "../../../../modules/scene/sceneContext"; -import { deleteCommentApi } from "../../../../services/factoryBuilder/comments/deleteCommentApi"; -import { addCommentsApi } from "../../../../services/factoryBuilder/comments/addCommentApi"; -import { editCommentsApi } from "../../../../services/factoryBuilder/comments/editCommentApi"; +import { deleteCommentApi } from "../../../../services/factoryBuilder/collab/comments/deleteCommentApi"; +import { editCommentsApi } from "../../../../services/factoryBuilder/collab/comments/editCommentApi"; interface MessageProps { - val: Reply | CommentSchema; + val: Reply | ThreadSchema; i: number; setMessages?: React.Dispatch>; setIsEditable?: React.Dispatch>; @@ -33,8 +32,8 @@ const Messages: React.FC = ({ val, i, setMessages, mode, setIsEdit const { userName, userId, organization } = getUserData(); const [isEditComment, setIsEditComment] = useState(false); const { selectedComment, setCommentPositionState } = useSelectedComment(); - const { versionStore, commentStore } = useSceneContext(); - const { updateComment, removeReply, updateReply } = commentStore(); + const { versionStore, threadStore } = useSceneContext(); + const { updateComment, removeReply, updateReply } = threadStore(); const { selectedVersion } = versionStore(); const [value, setValue] = useState("comment" in val ? val.comment : val.threadTitle); @@ -52,15 +51,15 @@ const Messages: React.FC = ({ val, i, setMessages, mode, setIsEdit } const handleSaveAction = async () => { - if (!projectId || !selectedVersion || !setIsEditable || !setEditedThread) return; + if (!projectId || !selectedVersion) return; if (isEditableThread && editedThread) { if (!threadSocket?.active) { // API - editThreadTitleApi(projectId, (val as CommentSchema).threadId, value, selectedVersion?.versionId || "").then((editThreadTitle) => { + editThreadTitleApi(projectId, (val as ThreadSchema).threadId, value, selectedVersion?.versionId || "").then((editThreadTitle) => { if (editThreadTitle.message == "ThreadTitle updated Successfully") { - const editedThread: CommentSchema = { + const editedThread: ThreadSchema = { state: "active", threadId: editThreadTitle.data.replyId, creatorId: userId, @@ -71,7 +70,7 @@ const Messages: React.FC = ({ val, i, setMessages, mode, setIsEdit rotation: [0, 0, 0], comments: [], }; - updateComment((val as CommentSchema).threadId, editedThread); + updateComment((val as ThreadSchema).threadId, editedThread); } }); } else { @@ -82,7 +81,7 @@ const Messages: React.FC = ({ val, i, setMessages, mode, setIsEdit userId, threadTitle: value, organization, - threadId: (val as CommentSchema).threadId || selectedComment.threadId, + threadId: (val as ThreadSchema).threadId || selectedComment.threadId, versionId: selectedVersion?.versionId || "", }; @@ -101,9 +100,10 @@ const Messages: React.FC = ({ val, i, setMessages, mode, setIsEdit comment: value, }; - updateReply((val as CommentSchema).threadId, (val as Reply)?.replyId, commentData); - setIsEditable(true); - setEditedThread(false); + updateReply((val as ThreadSchema).threadId, (val as Reply)?.replyId, commentData); + + if (setIsEditable) setIsEditable(true); + if (setEditedThread) setEditedThread(false); }); } else { // SOCKET @@ -119,8 +119,8 @@ const Messages: React.FC = ({ val, i, setMessages, mode, setIsEdit }; threadSocket.emit("v1-Comment:add", editComment); - setIsEditable(true); - setEditedThread(false); + if (setIsEditable) setIsEditable(true); + if (setEditedThread) setEditedThread(false); } } setIsEditComment(false); diff --git a/app/src/components/ui/collaboration/threads/ThreadChat.tsx b/app/src/components/ui/collaboration/threads/ThreadChat.tsx index 0bb5cf6..90283ef 100644 --- a/app/src/components/ui/collaboration/threads/ThreadChat.tsx +++ b/app/src/components/ui/collaboration/threads/ThreadChat.tsx @@ -9,9 +9,9 @@ import { getUserData } from "../../../../functions/getUserData"; import ThreadSocketResponsesDev from "../../../../modules/collaboration/socket/threadSocketResponses.dev"; import { useSceneContext } from "../../../../modules/scene/sceneContext"; -import { addCommentsApi } from "../../../../services/factoryBuilder/comments/addCommentApi"; -import { deleteThreadApi } from "../../../../services/factoryBuilder/comments/deleteThreadApi"; -import { createThreadApi } from "../../../../services/factoryBuilder/comments/createThreadApi"; +import { addCommentsApi } from "../../../../services/factoryBuilder/collab/comments/addCommentApi"; +import { deleteThreadApi } from "../../../../services/factoryBuilder/collab/comments/deleteThreadApi"; +import { createThreadApi } from "../../../../services/factoryBuilder/collab/comments/createThreadApi"; import { getRelativeTime } from "../function/getRelativeTime"; const ThreadChat: React.FC = () => { @@ -33,17 +33,17 @@ const ThreadChat: React.FC = () => { const { threadSocket } = useSocketStore(); const modeRef = useRef<"create" | "edit" | null>(null); const messagesRef = useRef(null); - const { versionStore, commentStore } = useSceneContext(); + const { versionStore, threadStore } = useSceneContext(); const { selectedVersion } = versionStore(); - const { addComment, removeComment, addReply, comments } = commentStore(); + const { addComment, removeComment, addReply, threads } = threadStore(); useEffect(() => { modeRef.current = mode; }, [mode]); useEffect(() => { - if (comments.length > 0 && selectedComment) { - const allMessages = comments + if (threads.length > 0 && selectedComment) { + const allMessages = threads .flatMap((val: any) => (val?.threadId === selectedComment?.threadId ? val.comments : [])) .map((c) => { return { @@ -58,7 +58,7 @@ const ThreadChat: React.FC = () => { setMessages(allMessages); } - }, []); + }, [selectedComment]); useEffect(() => { if (textareaRef.current) adjustHeight(textareaRef.current); @@ -207,7 +207,7 @@ const ThreadChat: React.FC = () => { createThreadApi(projectId, "active", commentPositionState.position, [0, 0, 0], value, selectedVersion?.versionId || "").then((thread) => { if (thread.message === "Thread created Successfully" && thread?.threadData) { - const comment: CommentSchema = { + const comment: ThreadSchema = { state: "active", threadId: thread?.threadData?._id, creatorId: userId, diff --git a/app/src/components/ui/inputs/MultiEmailInvite.tsx b/app/src/components/ui/inputs/MultiEmailInvite.tsx index 9fe160c..1e4b426 100644 --- a/app/src/components/ui/inputs/MultiEmailInvite.tsx +++ b/app/src/components/ui/inputs/MultiEmailInvite.tsx @@ -1,8 +1,8 @@ import React, { useState } from "react"; import { useParams } from "react-router-dom"; -import { getSearchUsers } from "../../../services/factoryBuilder/collab/getSearchUsers"; -import { shareProject } from "../../../services/factoryBuilder/collab/shareProject"; +import { getSearchUsers } from "../../../services/factoryBuilder/collab/project/getSearchUsers"; +import { shareProject } from "../../../services/factoryBuilder/collab/project/shareProject"; import { getUserData } from "../../../functions/getUserData"; interface UserData { diff --git a/app/src/modules/collaboration/camera/collabCams.tsx b/app/src/modules/collaboration/camera/collabCams.tsx index 2e4c536..cb8f780 100644 --- a/app/src/modules/collaboration/camera/collabCams.tsx +++ b/app/src/modules/collaboration/camera/collabCams.tsx @@ -3,7 +3,7 @@ import { useEffect, useRef, useState } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import camModel from "../../../assets/gltf-glb/camera face 2.gltf"; -import getActiveUsersData from "../../../services/factoryBuilder/collab/getActiveUsers"; +import getActiveUsersData from "../../../services/factoryBuilder/collab/users/getActiveUsers"; import { useActiveUsers, useCamMode, useSocketStore } from "../../../store/builder/store"; import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader"; import { useNavigate } from "react-router-dom"; diff --git a/app/src/modules/collaboration/collaboration.tsx b/app/src/modules/collaboration/collaboration.tsx index d3486a5..92d23cc 100644 --- a/app/src/modules/collaboration/collaboration.tsx +++ b/app/src/modules/collaboration/collaboration.tsx @@ -1,6 +1,6 @@ import React from "react"; import CamModelsGroup from "./camera/collabCams"; -import CommentsGroup from "./comments/commentsGroup"; +import ThreadsGroup from "./threads/threadsGroup"; const Collaboration: React.FC = () => { @@ -9,7 +9,7 @@ const Collaboration: React.FC = () => { - + ); diff --git a/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx b/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx index 689b1a2..2604c67 100644 --- a/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx +++ b/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx @@ -14,8 +14,8 @@ interface ThreadSocketProps { const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSocketProps) => { const { threadSocket } = useSocketStore(); const { selectedComment, setSelectedComment, setCommentPositionState, commentPositionState } = useSelectedComment(); - const { commentStore } = useSceneContext(); - const { comments, removeReply, addComment, addReply, updateComment, updateReply } = commentStore(); + const { threadStore } = useSceneContext(); + const { threads, removeReply, addComment, addReply, updateComment, updateReply } = threadStore(); const { userId } = getUserData(); useEffect(() => { @@ -85,7 +85,7 @@ const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSock // --- Create Thread Handler --- const handleCreateThread = (data: any) => { - const comment: CommentSchema = { + const comment: ThreadSchema = { state: "active", threadId: data.data?._id, creatorId: userId || data.data?.userId, @@ -114,7 +114,7 @@ const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSock threadSocket.on("v1-thread:response:delete", handleDeleteThread); const handleEditThread = (data: any) => { - const editedThread: CommentSchema = { + const editedThread: ThreadSchema = { state: "active", threadId: data.data?._id, creatorId: userId, @@ -142,21 +142,7 @@ const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSock threadSocket.off("v1-thread:response:delete", handleDeleteThread); threadSocket.off("v1-thread:response:updateTitle", handleEditThread); }; - }, [ - threadSocket, - selectedComment, - commentPositionState, - userId, - setMessages, - addReply, - addComment, - setSelectedComment, - setCommentPositionState, - updateComment, - comments, - modeRef.current, - messages, - ]); + }, [threadSocket, selectedComment, commentPositionState, userId, setSelectedComment, setCommentPositionState, threads, modeRef.current, messages]); return null; }; diff --git a/app/src/modules/collaboration/comments/instances/commentInstance/commentInstance.tsx b/app/src/modules/collaboration/threads/threadInstances/threadInstance/threadInstance.tsx similarity index 86% rename from app/src/modules/collaboration/comments/instances/commentInstance/commentInstance.tsx rename to app/src/modules/collaboration/threads/threadInstances/threadInstance/threadInstance.tsx index e530a19..ed2ddf6 100644 --- a/app/src/modules/collaboration/comments/instances/commentInstance/commentInstance.tsx +++ b/app/src/modules/collaboration/threads/threadInstances/threadInstance/threadInstance.tsx @@ -1,13 +1,14 @@ -import { Html, TransformControls } from "@react-three/drei"; import { useEffect, useRef, useState } from "react"; -import { usePlayButtonStore } from "../../../../../store/ui/usePlayButtonStore"; -import CommentThreads from "../../../../../components/ui/collaboration/threads/CommentThreads"; -import { useSelectedComment } from "../../../../../store/builder/store"; -import { Group, Object3D, Vector3 } from "three"; import { useThree } from "@react-three/fiber"; +import { Html, TransformControls } from "@react-three/drei"; +import { Group, Object3D, Vector3 } from "three"; +import { usePlayButtonStore } from "../../../../../store/ui/usePlayButtonStore"; +import { useSelectedComment } from "../../../../../store/builder/store"; +import CommentThreads from "../../../../../components/ui/collaboration/threads/CommentThreads"; + import { detectModifierKeys } from "../../../../../utils/shortcutkeys/detectModifierKeys"; -function ThreadInstance({ comment }: { readonly comment: CommentSchema }) { +function ThreadInstance({ thread }: { readonly thread: ThreadSchema }) { const { isPlaying } = usePlayButtonStore(); const CommentRef = useRef(null); const [selectedObject, setSelectedObject] = useState(null); @@ -33,8 +34,8 @@ function ThreadInstance({ comment }: { readonly comment: CommentSchema }) { // }, [selectedComment]); const commentClicked = () => { - setSelectedComment(comment); - const position = new Vector3(comment.position[0], comment.position[1], comment.position[2]); + setSelectedComment(thread); + const position = new Vector3(thread.position[0], thread.position[1], thread.position[2]); position.project(camera); const x = (position.x * 0.5 + 0.5) * size.width; @@ -47,15 +48,16 @@ function ThreadInstance({ comment }: { readonly comment: CommentSchema }) { }; useEffect(() => { - if (!selectedComment || selectedComment.threadId !== comment.threadId) { + if (!selectedComment || selectedComment.threadId !== thread.threadId) { setSelectedObject(null); } }, [selectedComment]); - if (comment.state === "inactive" || isPlaying) return null; + if (thread.state === "inactive" || isPlaying) return null; + return ( <> - + - + {/* {selectedObject && transformMode && ( diff --git a/app/src/modules/collaboration/comments/instances/commentInstances.tsx b/app/src/modules/collaboration/threads/threadInstances/threadInstances.tsx similarity index 78% rename from app/src/modules/collaboration/comments/instances/commentInstances.tsx rename to app/src/modules/collaboration/threads/threadInstances/threadInstances.tsx index 81ff700..92771dc 100644 --- a/app/src/modules/collaboration/comments/instances/commentInstances.tsx +++ b/app/src/modules/collaboration/threads/threadInstances/threadInstances.tsx @@ -1,21 +1,21 @@ import React, { useEffect } from "react"; -import CommentInstance from "./commentInstance/commentInstance"; -import { getAllThreads } from "../../../../services/factoryBuilder/comments/getAllThreads"; +import ThreadInstance from "./threadInstance/threadInstance"; +import { getAllThreads } from "../../../../services/factoryBuilder/collab/comments/getAllThreads"; import { useParams } from "react-router-dom"; import { getUserData } from "../../../../functions/getUserData"; import { getRelativeTime } from "../../../../components/ui/collaboration/function/getRelativeTime"; import { useSceneContext } from "../../../scene/sceneContext"; -function CommentInstances() { +function ThreadInstances() { const { projectId } = useParams(); const { userId } = getUserData(); - const { versionStore, commentStore } = useSceneContext(); - const { comments, setComments } = commentStore(); + const { versionStore, threadStore } = useSceneContext(); + const { threads, setComments } = threadStore(); const { selectedVersion } = versionStore(); useEffect(() => { - // console.log("comments", comments); - }, [comments]); + // console.log("threads", threads); + }, [threads]); useEffect(() => { if (!projectId || !selectedVersion) return; @@ -45,13 +45,13 @@ function CommentInstances() { return ( <> - {comments?.map((comment: CommentSchema) => ( - - + {threads?.map((thread: ThreadSchema) => ( + + ))} ); } -export default CommentInstances; +export default ThreadInstances; diff --git a/app/src/modules/collaboration/comments/commentsGroup.tsx b/app/src/modules/collaboration/threads/threadsGroup.tsx similarity index 97% rename from app/src/modules/collaboration/comments/commentsGroup.tsx rename to app/src/modules/collaboration/threads/threadsGroup.tsx index 71eeb70..5b66193 100644 --- a/app/src/modules/collaboration/comments/commentsGroup.tsx +++ b/app/src/modules/collaboration/threads/threadsGroup.tsx @@ -1,11 +1,11 @@ import { useEffect, useState } from "react"; import { useThree } from "@react-three/fiber"; import { Vector3 } from "three"; -import CommentInstances from "./instances/commentInstances"; +import ThreadInstances from "./threadInstances/threadInstances"; import { Sphere } from "@react-three/drei"; import { useActiveTool, useSelectedComment } from "../../../store/builder/store"; -function CommentsGroup() { +function ThreadsGroup() { const { gl, raycaster, camera, scene, pointer, size } = useThree(); const { activeTool } = useActiveTool(); const [hoverPos, setHoverPos] = useState(null); @@ -112,7 +112,7 @@ function CommentsGroup() { return ( <> - + {hoverPos && ( @@ -122,4 +122,4 @@ function CommentsGroup() { ); } -export default CommentsGroup; +export default ThreadsGroup; diff --git a/app/src/modules/scene/sceneContext.tsx b/app/src/modules/scene/sceneContext.tsx index 39afb60..dd2b6fe 100644 --- a/app/src/modules/scene/sceneContext.tsx +++ b/app/src/modules/scene/sceneContext.tsx @@ -24,7 +24,7 @@ import { createStorageUnitStore, StorageUnitStoreType } from "../../store/simula import { createHumanStore, HumanStoreType } from "../../store/simulation/useHumanStore"; import { createCraneStore, CraneStoreType } from "../../store/simulation/useCraneStore"; -import { createCommentsStore, CommentStoreType } from "../../store/collaboration/useCommentStore"; +import { createThreadsStore, ThreadStoreType } from "../../store/collaboration/useCommentStore"; type SceneContextValue = { versionStore: VersionStoreType; @@ -51,7 +51,7 @@ type SceneContextValue = { humanStore: HumanStoreType; craneStore: CraneStoreType; - commentStore: CommentStoreType; + threadStore: ThreadStoreType; humanEventManagerRef: React.RefObject; craneEventManagerRef: React.RefObject; @@ -88,7 +88,7 @@ export function SceneProvider({ children, layout }: { readonly children: React.R const humanStore = useMemo(() => createHumanStore(), []); const craneStore = useMemo(() => createCraneStore(), []); - const commentStore = useMemo(() => createCommentsStore(), []); + const threadStore = useMemo(() => createThreadsStore(), []); const humanEventManagerRef = useRef({ humanStates: [] }); const craneEventManagerRef = useRef({ craneStates: [] }); @@ -114,7 +114,7 @@ export function SceneProvider({ children, layout }: { readonly children: React.R storageUnitStore.getState().clearStorageUnits(); humanStore.getState().clearHumans(); craneStore.getState().clearCranes(); - commentStore.getState().clearComments(); + threadStore.getState().clearComments(); humanEventManagerRef.current.humanStates = []; craneEventManagerRef.current.craneStates = []; }, @@ -138,7 +138,7 @@ export function SceneProvider({ children, layout }: { readonly children: React.R storageUnitStore, humanStore, craneStore, - commentStore, + threadStore, ] ); @@ -163,7 +163,7 @@ export function SceneProvider({ children, layout }: { readonly children: React.R storageUnitStore, humanStore, craneStore, - commentStore, + threadStore, humanEventManagerRef, craneEventManagerRef, clearStores, @@ -189,7 +189,7 @@ export function SceneProvider({ children, layout }: { readonly children: React.R storageUnitStore, humanStore, craneStore, - commentStore, + threadStore, clearStores, layout, ] diff --git a/app/src/services/factoryBuilder/comments/addCommentApi.ts b/app/src/services/factoryBuilder/collab/comments/addCommentApi.ts similarity index 100% rename from app/src/services/factoryBuilder/comments/addCommentApi.ts rename to app/src/services/factoryBuilder/collab/comments/addCommentApi.ts diff --git a/app/src/services/factoryBuilder/comments/createThreadApi.ts b/app/src/services/factoryBuilder/collab/comments/createThreadApi.ts similarity index 100% rename from app/src/services/factoryBuilder/comments/createThreadApi.ts rename to app/src/services/factoryBuilder/collab/comments/createThreadApi.ts diff --git a/app/src/services/factoryBuilder/comments/deleteCommentApi.ts b/app/src/services/factoryBuilder/collab/comments/deleteCommentApi.ts similarity index 100% rename from app/src/services/factoryBuilder/comments/deleteCommentApi.ts rename to app/src/services/factoryBuilder/collab/comments/deleteCommentApi.ts diff --git a/app/src/services/factoryBuilder/comments/deleteThreadApi.ts b/app/src/services/factoryBuilder/collab/comments/deleteThreadApi.ts similarity index 100% rename from app/src/services/factoryBuilder/comments/deleteThreadApi.ts rename to app/src/services/factoryBuilder/collab/comments/deleteThreadApi.ts diff --git a/app/src/services/factoryBuilder/comments/editCommentApi.ts b/app/src/services/factoryBuilder/collab/comments/editCommentApi.ts similarity index 100% rename from app/src/services/factoryBuilder/comments/editCommentApi.ts rename to app/src/services/factoryBuilder/collab/comments/editCommentApi.ts diff --git a/app/src/services/factoryBuilder/comments/editThreadTitleApi.ts b/app/src/services/factoryBuilder/collab/comments/editThreadTitleApi.ts similarity index 100% rename from app/src/services/factoryBuilder/comments/editThreadTitleApi.ts rename to app/src/services/factoryBuilder/collab/comments/editThreadTitleApi.ts diff --git a/app/src/services/factoryBuilder/comments/getAllThreads.ts b/app/src/services/factoryBuilder/collab/comments/getAllThreads.ts similarity index 100% rename from app/src/services/factoryBuilder/comments/getAllThreads.ts rename to app/src/services/factoryBuilder/collab/comments/getAllThreads.ts diff --git a/app/src/services/factoryBuilder/collab/getProjectSharedList.ts b/app/src/services/factoryBuilder/collab/project/getProjectSharedList.ts similarity index 100% rename from app/src/services/factoryBuilder/collab/getProjectSharedList.ts rename to app/src/services/factoryBuilder/collab/project/getProjectSharedList.ts diff --git a/app/src/services/factoryBuilder/collab/getSearchUsers.ts b/app/src/services/factoryBuilder/collab/project/getSearchUsers.ts similarity index 100% rename from app/src/services/factoryBuilder/collab/getSearchUsers.ts rename to app/src/services/factoryBuilder/collab/project/getSearchUsers.ts diff --git a/app/src/services/factoryBuilder/collab/giveCollabAccess.ts b/app/src/services/factoryBuilder/collab/project/giveCollabAccess.ts similarity index 96% rename from app/src/services/factoryBuilder/collab/giveCollabAccess.ts rename to app/src/services/factoryBuilder/collab/project/giveCollabAccess.ts index f620639..5e2ce9b 100644 --- a/app/src/services/factoryBuilder/collab/giveCollabAccess.ts +++ b/app/src/services/factoryBuilder/collab/project/giveCollabAccess.ts @@ -1,34 +1,34 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export default async function giveCollabAccess( - email: string, - isShare: boolean, - organization: string -) { - - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/shareUser`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ email, isShare, organization }), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - localStorage.setItem("token", newAccessToken); - } - - if (!response.ok) { - echo.error("Failed to give collab access"); - } - - const result = await response.json(); - return result; - } catch { - echo.error("Failed to give collab access"); - } -} +let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; + +export default async function giveCollabAccess( + email: string, + isShare: boolean, + organization: string +) { + + try { + const response = await fetch(`${url_Backend_dwinzo}/api/v1/shareUser`, { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ email, isShare, organization }), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + echo.error("Failed to give collab access"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to give collab access"); + } +} diff --git a/app/src/services/factoryBuilder/collab/shareAccess.ts b/app/src/services/factoryBuilder/collab/project/shareAccess.ts similarity index 100% rename from app/src/services/factoryBuilder/collab/shareAccess.ts rename to app/src/services/factoryBuilder/collab/project/shareAccess.ts diff --git a/app/src/services/factoryBuilder/collab/shareProject.ts b/app/src/services/factoryBuilder/collab/project/shareProject.ts similarity index 100% rename from app/src/services/factoryBuilder/collab/shareProject.ts rename to app/src/services/factoryBuilder/collab/project/shareProject.ts diff --git a/app/src/services/factoryBuilder/collab/getActiveUsers.ts b/app/src/services/factoryBuilder/collab/users/getActiveUsers.ts similarity index 97% rename from app/src/services/factoryBuilder/collab/getActiveUsers.ts rename to app/src/services/factoryBuilder/collab/users/getActiveUsers.ts index 91eae88..d0d423b 100644 --- a/app/src/services/factoryBuilder/collab/getActiveUsers.ts +++ b/app/src/services/factoryBuilder/collab/users/getActiveUsers.ts @@ -1,31 +1,31 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export default async function getActiveUsersData(organization: string) { - const apiUrl = `${url_Backend_dwinzo}/api/v1/activeCameras/${organization}`; - - try { - const response = await fetch(apiUrl, { - method: "GET", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - }); - - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - localStorage.setItem("token", newAccessToken); - } - - if (!response.ok) { - echo.error("Failed to get active users"); - } - - const result = await response.json(); - return result; - } catch { - echo.error("Failed to get active users"); - } -} +let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; + +export default async function getActiveUsersData(organization: string) { + const apiUrl = `${url_Backend_dwinzo}/api/v1/activeCameras/${organization}`; + + try { + const response = await fetch(apiUrl, { + method: "GET", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + }); + + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + echo.error("Failed to get active users"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to get active users"); + } +} diff --git a/app/src/services/factoryBuilder/collab/getUsersApi.ts b/app/src/services/factoryBuilder/collab/users/getUsersApi.ts similarity index 97% rename from app/src/services/factoryBuilder/collab/getUsersApi.ts rename to app/src/services/factoryBuilder/collab/users/getUsersApi.ts index d1803df..6b5a239 100644 --- a/app/src/services/factoryBuilder/collab/getUsersApi.ts +++ b/app/src/services/factoryBuilder/collab/users/getUsersApi.ts @@ -1,31 +1,31 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export default async function fetchShareUsers(organization: string) { - const apiUrl = `${url_Backend_dwinzo}/api/v1/findshareUsers?organization=${organization}`; - - try { - const response = await fetch(apiUrl, { - method: "GET", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - }); - - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - localStorage.setItem("token", newAccessToken); - } - - if (!response.ok) { - console.error("Failed to get shared users"); - } - - const result = await response.json(); - return result; - } catch { - echo.error("Failed to get shared users"); - } -} +let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; + +export default async function fetchShareUsers(organization: string) { + const apiUrl = `${url_Backend_dwinzo}/api/v1/findshareUsers?organization=${organization}`; + + try { + const response = await fetch(apiUrl, { + method: "GET", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + }); + + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + console.error("Failed to get shared users"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to get shared users"); + } +} diff --git a/app/src/store/collaboration/useCommentStore.ts b/app/src/store/collaboration/useCommentStore.ts index 3039a92..a8c068a 100644 --- a/app/src/store/collaboration/useCommentStore.ts +++ b/app/src/store/collaboration/useCommentStore.ts @@ -1,12 +1,12 @@ import { create } from "zustand"; import { immer } from "zustand/middleware/immer"; -interface CommentStore { - comments: CommentsSchema; +interface ThreadStore { + threads: ThreadsSchema; - addComment: (comment: CommentSchema) => void; - setComments: (comments: CommentsSchema) => void; - updateComment: (threadId: string, updates: Partial) => void; + addComment: (thread: ThreadSchema) => void; + setComments: (threads: ThreadsSchema) => void; + updateComment: (threadId: string, updates: Partial) => void; removeComment: (threadId: string) => void; clearComments: () => void; @@ -14,65 +14,65 @@ interface CommentStore { updateReply: (threadId: string, replyId: string, updates: Partial) => void; removeReply: (threadId: string, _id: string) => void; - getCommentById: (threadId: string) => CommentSchema | undefined; + getCommentById: (threadId: string) => ThreadSchema | undefined; } -export const createCommentsStore = () => { - return create()( +export const createThreadsStore = () => { + return create()( immer((set, get) => ({ - comments: [], + threads: [], - addComment: (comment) => { + addComment: (thread) => { set((state) => { - if (!state.comments.find((c) => c.threadId === comment.threadId)) { - state.comments.push(JSON.parse(JSON.stringify(comment))); + if (!state.threads.find((c) => c.threadId === thread.threadId)) { + state.threads.push(JSON.parse(JSON.stringify(thread))); } }); }, - setComments: (comments) => { + setComments: (threads) => { set((state) => { - state.comments = comments; + state.threads = threads; }); }, updateComment: (threadId, updates) => { set((state) => { - const comment = state.comments.find((c) => c.threadId === threadId); - if (comment) { - Object.assign(comment, updates); + const thread = state.threads.find((c) => c.threadId === threadId); + if (thread) { + Object.assign(thread, updates); } }); }, removeComment: (threadId) => { set((state) => { - state.comments = state.comments.filter((c) => c.threadId !== threadId); + state.threads = state.threads.filter((c) => c.threadId !== threadId); }); }, clearComments: () => { set((state) => { - state.comments = []; + state.threads = []; }); }, - addReply: (threadId, comment) => { + addReply: (threadId, thread) => { set((state) => { - const reply = state.comments.find((c) => c.threadId === threadId); + const reply = state.threads.find((c) => c.threadId === threadId); if (reply) { - reply.comments.push(comment); + reply.comments.push(thread); } }); }, updateReply: (threadId, replyId, updates) => { set((state) => { - const reply = state.comments.find((c) => c.threadId === threadId); + const reply = state.threads.find((c) => c.threadId === threadId); if (reply) { - const comment = reply.comments.find((r) => r.replyId === replyId); - if (comment) { - Object.assign(comment, updates); + const thread = reply.comments.find((r) => r.replyId === replyId); + if (thread) { + Object.assign(thread, updates); } } }); @@ -80,18 +80,18 @@ export const createCommentsStore = () => { removeReply: (threadId, _id) => { set((state) => { - const comment = state.comments.find((c) => c.threadId === threadId); - if (comment) { - comment.comments = comment.comments.filter((r) => r.replyId !== _id); + const thread = state.threads.find((c) => c.threadId === threadId); + if (thread) { + thread.comments = thread.comments.filter((r) => r.replyId !== _id); } }); }, getCommentById: (threadId) => { - return get().comments.find((c) => c.threadId === threadId); + return get().threads.find((c) => c.threadId === threadId); }, })) ); }; -export type CommentStoreType = ReturnType; +export type ThreadStoreType = ReturnType; diff --git a/app/src/types/collaborationTypes.d.ts b/app/src/types/collaborationTypes.d.ts index aadb0f6..8de989d 100644 --- a/app/src/types/collaborationTypes.d.ts +++ b/app/src/types/collaborationTypes.d.ts @@ -1,4 +1,4 @@ -interface CommentSchema { +interface ThreadSchema { state: "active" | "inactive"; threadId: string; creatorId: string; @@ -18,4 +18,4 @@ interface Reply { comment: string; } -type CommentsSchema = CommentSchema[]; +type ThreadsSchema = ThreadSchema[];