diff --git a/app/src/components/layout/scenes/MainScene.tsx b/app/src/components/layout/scenes/MainScene.tsx index 81dfb5b..9eab176 100644 --- a/app/src/components/layout/scenes/MainScene.tsx +++ b/app/src/components/layout/scenes/MainScene.tsx @@ -26,7 +26,7 @@ import RegularDropDown from "../../ui/inputs/RegularDropDown"; import RenameTooltip from "../../ui/features/RenameTooltip"; import VersionSaved from "../sidebarRight/versionHisory/VersionSaved"; import Footer from "../../footer/Footer"; -import ThreadChat from "../../ui/collaboration/ThreadChat"; +import ThreadChat from "../../ui/collaboration/threads/ThreadChat"; import Scene from "../../../modules/scene/scene"; import { getUserData } from "../../../functions/getUserData"; @@ -179,7 +179,9 @@ function MainScene() { {isPlaying && activeModule === "simulation" && loadingProgress === 0 && } {isPlaying && activeModule !== "simulation" && } - {isRenameMode && (selectedFloorAsset?.userData.modelName || selectedAssets.length === 1) && } + {isRenameMode && (selectedFloorAsset?.userData.modelName || selectedAssets.length === 1) && ( + + )} {/* remove this later */} {activeModule === "builder" && !toggleThreeD && } diff --git a/app/src/components/ui/collaboration/CommentThreads.tsx b/app/src/components/ui/collaboration/CommentThreads.tsx deleted file mode 100644 index c06248c..0000000 --- a/app/src/components/ui/collaboration/CommentThreads.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { getAvatarColor } from "../../../modules/collaboration/functions/getAvatarColor"; -import { getUserData } from "../../../functions/getUserData"; -import { getAllThreads } from "../../../services/factoryBuilder/comments/getAllThreads"; -import { useParams } from "react-router-dom"; -import { useCommentStore } from "../../../store/collaboration/useCommentStore"; -import { getRelativeTime } from "./function/getRelativeTime"; -import { useSelectedComment } from "../../../store/builder/store"; - -interface CommentThreadsProps { - commentClicked: () => void; - comment?: CommentSchema -} - -const CommentThreads: React.FC = ({ commentClicked, comment }) => { - const [expand, setExpand] = useState(false); - const commentsedUsers = [{ creatorId: "1" }]; - const { userName } = getUserData(); - - const CommentDetails = { - state: "active", - commentId: "c-1", - creatorId: "12", - createdAt: "2 hours ago", - comment: "Thread check", - lastUpdatedAt: "string", - comments: [ - { - replyId: "string", - creatorId: "string", - createdAt: "string", - lastUpdatedAt: "string", - comment: "string", - }, - { - replyId: "string", - creatorId: "string", - createdAt: "string", - lastUpdatedAt: "string", - comment: "string", - }, - ], - }; - - function getUsername(userId: string) { - const UserName = userName?.charAt(0).toUpperCase() || "user"; - return UserName; - } - - function getDetails(type?: "clicked") { - if (type === "clicked") { - setExpand(true); - commentClicked(); - } else { - setExpand((prev) => !prev); - } - } - - - return ( -
- -
- - ); -}; - -export default CommentThreads; diff --git a/app/src/components/ui/collaboration/threads/CommentThreads.tsx b/app/src/components/ui/collaboration/threads/CommentThreads.tsx new file mode 100644 index 0000000..eb7822f --- /dev/null +++ b/app/src/components/ui/collaboration/threads/CommentThreads.tsx @@ -0,0 +1,68 @@ +import React, { useState } from "react"; +import { getAvatarColor } from "../../../../modules/collaboration/functions/getAvatarColor"; +import { getUserData } from "../../../../functions/getUserData"; +import { getRelativeTime } from "../function/getRelativeTime"; + +interface CommentThreadsProps { + commentClicked: () => void; + comment?: CommentSchema; +} + +const CommentThreads: React.FC = ({ commentClicked, comment }) => { + const [expand, setExpand] = useState(false); + const commentsedUsers = [{ creatorId: "1" }]; + const { userName } = getUserData(); + + function getUsername(userId: string) { + const UserName = userName?.charAt(0).toUpperCase() || "user"; + return UserName; + } + + function getDetails(type?: "clicked") { + if (type === "clicked") { + setExpand(true); + commentClicked(); + } else { + setExpand((prev) => !prev); + } + } + + return ( +
+ +
+ ); +}; + +export default CommentThreads; diff --git a/app/src/components/ui/collaboration/Messages.tsx b/app/src/components/ui/collaboration/threads/Messages.tsx similarity index 62% rename from app/src/components/ui/collaboration/Messages.tsx rename to app/src/components/ui/collaboration/threads/Messages.tsx index 063189a..9f3f8e0 100644 --- a/app/src/components/ui/collaboration/Messages.tsx +++ b/app/src/components/ui/collaboration/threads/Messages.tsx @@ -1,254 +1,259 @@ -import React, { useEffect, useRef, useState } from "react"; -import { getAvatarColor } from "../../../modules/collaboration/functions/getAvatarColor"; -import { KebabIcon } from "../../icons/ExportCommonIcons"; -import { adjustHeight } from "./function/textAreaHeightAdjust"; -import { getUserData } from "../../../functions/getUserData"; -import { useParams } from "react-router-dom"; -import { useCommentStore } from "../../../store/collaboration/useCommentStore"; -import { useSelectedComment, useSocketStore } from "../../../store/builder/store"; -import { getRelativeTime } from "./function/getRelativeTime"; -import { editThreadTitleApi } from "../../../services/factoryBuilder/comments/editThreadTitleApi"; -import { useSceneContext } from "../../../modules/scene/sceneContext"; - -// import { deleteCommentApi } from "../../../services/factoryBuilder/comments/deleteCommentApi"; -// import { addCommentsApi } from "../../../services/factoryBuilder/comments/addCommentsApi"; - -interface MessageProps { - val: Reply | CommentSchema; - i: number; - setMessages?: React.Dispatch>; - setIsEditable?: React.Dispatch>; - setEditedThread?: React.Dispatch>; - setMode?: React.Dispatch>; - isEditable?: boolean; - isEditableThread?: boolean; - editedThread?: boolean; - mode?: "create" | "edit" | null; -} - -const Messages: React.FC = ({ val, i, setMessages, mode, setIsEditable, setEditedThread, editedThread, isEditableThread, setMode }) => { - const { updateComment, removeReply, updateReply } = useCommentStore(); - const [openOptions, setOpenOptions] = useState(false); - const { projectId } = useParams(); - const { threadSocket } = useSocketStore(); - const { userName, userId, organization } = getUserData(); - const [isEditComment, setIsEditComment] = useState(false); - const { selectedComment, setCommentPositionState } = useSelectedComment(); - const { versionStore } = useSceneContext(); - const { selectedVersion } = versionStore(); - - const [value, setValue] = useState("comment" in val ? val.comment : val.threadTitle); - - const textareaRef = useRef(null); - - useEffect(() => { - if (textareaRef.current) adjustHeight(textareaRef.current); - }, [value]); - - function handleCancelAction() { - setCommentPositionState(null); - if (setIsEditable) setIsEditable(true); - setIsEditComment(false); - } - - const handleSaveAction = async () => { - if (!projectId || !selectedVersion) return; - - if (isEditableThread && editedThread) { - try { - if (!threadSocket?.active) { - const editThreadTitle = await editThreadTitleApi(projectId, (val as CommentSchema).threadId, value, selectedVersion?.versionId || ""); - if (editThreadTitle.message == "ThreadTitle updated Successfully") { - const editedThread: CommentSchema = { - state: "active", - threadId: editThreadTitle.data.replyId, - creatorId: userId, - createdAt: getRelativeTime(editThreadTitle.data.createdAt), - threadTitle: value, - lastUpdatedAt: new Date().toISOString(), - position: editThreadTitle.data.position, - rotation: [0, 0, 0], - comments: [], - }; - updateComment((val as CommentSchema).threadId, editedThread); - } - } else { - const threadEdit = { - projectId, - userId, - threadTitle: value, - organization, - threadId: (val as CommentSchema).threadId || selectedComment.threadId, - versionId: selectedVersion?.versionId || "", - }; - - threadSocket.emit("v1:thread:updateTitle", threadEdit); - } - } catch {} - } else { - if (mode === "edit") { - try { - // const editComments = await addCommentsApi(projectId, value, selectedComment?.threadId, (val as Reply).replyId, selectedVersion?.versionId || "") - // - // const commentData = { - // replyId: `${editComments.data?.replyId}`, - // creatorId: `${userId}`, - // createdAt: getRelativeTime(editComments.data?.createdAt), - // lastUpdatedAt: "2 hrs ago", - // comment: value, - // } - - // updateReply((val as CommentSchema).threadId, (val as Reply)?.replyId, commentData); - - if (threadSocket) { - // projectId, userId, comment, organization, threadId - const editComment = { - projectId, - userId, - comment: value, - organization, - threadId: selectedComment?.threadId, - commentId: (val as Reply).replyId ?? "", - versionId: selectedVersion?.versionId || "", - }; - - threadSocket.emit("v1-Comment:add", editComment); - setIsEditable && setIsEditable(true); - setEditedThread && setEditedThread(false); - } - } catch {} - } - } - // setValue(""); - setIsEditComment(false); - }; - - const handleDeleteAction = async (replyID: any) => { - if (!projectId || !selectedVersion) return; - setOpenOptions(false); - try { - // const deletedComment = await deleteCommentApi(projectId, selectedComment?.threadId, (val as Reply).replyId , selectedVersion?.versionId || "") - // - // if (deletedComment === "'Thread comment deleted Successfully'") { - // setMessages && setMessages(prev => prev.filter(message => message.replyId !== replyID)); - // removeReply(val.creatorId, replyID) - // } - if (threadSocket && setMessages) { - // projectId, userId, commentId, organization, threadId - const deleteComment = { - projectId, - userId, - commentId: (val as Reply).replyId, - organization, - threadId: selectedComment?.threadId, - versionId: selectedVersion?.versionId || "", - }; - setMessages((prev) => { - // 👈 logs the current state - return prev.filter((message) => message.replyId !== (val as Reply).replyId); - }); - removeReply(selectedComment?.threadId, (val as Reply).replyId); // Remove listener after response - - threadSocket.emit("v1-Comment:delete", deleteComment); - } - } catch {} - }; - - const handleFocus = (e: React.FocusEvent) => { - requestAnimationFrame(() => { - if (textareaRef.current) { - const length = textareaRef.current.value.length; - textareaRef.current.setSelectionRange(length, length); - } - }); - }; - - return ( - <> - {isEditComment ? ( -
-
-