Add versioning support to collaboration features and API calls
- Adjust logic in socket responses to handle versioning for comments and threads.
This commit is contained in:
@@ -3,6 +3,7 @@ import {
|
|||||||
useLoadingProgress,
|
useLoadingProgress,
|
||||||
useRenameModeStore,
|
useRenameModeStore,
|
||||||
useSaveVersion,
|
useSaveVersion,
|
||||||
|
useSelectedComment,
|
||||||
useSelectedFloorItem,
|
useSelectedFloorItem,
|
||||||
useSocketStore,
|
useSocketStore,
|
||||||
useWidgetSubOption,
|
useWidgetSubOption,
|
||||||
@@ -39,6 +40,7 @@ import { useVersionHistoryStore } from "../../../store/builder/useVersionHistory
|
|||||||
import { useVersionContext } from "../../../modules/builder/version/versionContext";
|
import { useVersionContext } from "../../../modules/builder/version/versionContext";
|
||||||
import VersionSaved from "../sidebarRight/versionHisory/VersionSaved";
|
import VersionSaved from "../sidebarRight/versionHisory/VersionSaved";
|
||||||
import Footer from "../../footer/Footer";
|
import Footer from "../../footer/Footer";
|
||||||
|
import ThreadChat from "../../ui/collaboration/ThreadChat";
|
||||||
|
|
||||||
function MainScene() {
|
function MainScene() {
|
||||||
const { setMainProduct } = useMainProduct();
|
const { setMainProduct } = useMainProduct();
|
||||||
@@ -64,6 +66,7 @@ function MainScene() {
|
|||||||
const { versionHistory } = useVersionHistoryStore();
|
const { versionHistory } = useVersionHistoryStore();
|
||||||
const { selectedVersionStore } = useVersionContext();
|
const { selectedVersionStore } = useVersionContext();
|
||||||
const { selectedVersion, setSelectedVersion } = selectedVersionStore();
|
const { selectedVersion, setSelectedVersion } = selectedVersionStore();
|
||||||
|
const { selectedComment, commentPositionState } = useSelectedComment();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (activeModule !== 'simulation') {
|
if (activeModule !== 'simulation') {
|
||||||
@@ -185,6 +188,7 @@ function MainScene() {
|
|||||||
{activeModule !== "market" && !selectedUser && <Footer />}
|
{activeModule !== "market" && !selectedUser && <Footer />}
|
||||||
|
|
||||||
<VersionSaved />
|
<VersionSaved />
|
||||||
|
{(commentPositionState !== null || selectedComment !== null) && <ThreadChat/>}
|
||||||
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { useCommentStore } from "../../../store/collaboration/useCommentStore";
|
|||||||
import { useSelectedComment, useSocketStore } from "../../../store/builder/store";
|
import { useSelectedComment, useSocketStore } from "../../../store/builder/store";
|
||||||
import { getRelativeTime } from "./function/getRelativeTime";
|
import { getRelativeTime } from "./function/getRelativeTime";
|
||||||
import { editThreadTitleApi } from "../../../services/factoryBuilder/comments/editThreadTitleApi";
|
import { editThreadTitleApi } from "../../../services/factoryBuilder/comments/editThreadTitleApi";
|
||||||
|
import { useVersionContext } from "../../../modules/builder/version/versionContext";
|
||||||
|
|
||||||
|
|
||||||
interface MessageProps {
|
interface MessageProps {
|
||||||
@@ -34,8 +35,9 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
const { threadSocket } = useSocketStore();
|
const { threadSocket } = useSocketStore();
|
||||||
const { userName, userId, organization } = getUserData();
|
const { userName, userId, organization } = getUserData();
|
||||||
const [isEditComment, setIsEditComment] = useState(false)
|
const [isEditComment, setIsEditComment] = useState(false)
|
||||||
|
|
||||||
const { selectedComment, setCommentPositionState } = useSelectedComment();
|
const { selectedComment, setCommentPositionState } = useSelectedComment();
|
||||||
|
const { selectedVersionStore } = useVersionContext();
|
||||||
|
const { selectedVersion } = selectedVersionStore();
|
||||||
|
|
||||||
// input
|
// input
|
||||||
const [value, setValue] = useState<string>(
|
const [value, setValue] = useState<string>(
|
||||||
@@ -59,11 +61,11 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
|
|
||||||
const handleSaveAction = async () => {
|
const handleSaveAction = async () => {
|
||||||
|
|
||||||
if (!projectId) return
|
if (!projectId || !selectedVersion) return
|
||||||
|
|
||||||
if (isEditableThread && editedThread) {
|
if (isEditableThread && editedThread) {
|
||||||
try {
|
try {
|
||||||
// const editThreadTitle = await editThreadTitleApi(projectId, (val as CommentSchema).threadId, value)
|
// const editThreadTitle = await editThreadTitleApi(projectId, (val as CommentSchema).threadId, value, selectedVersion?.versionId || "")
|
||||||
// if (editThreadTitle.message == "ThreadTitle updated Successfully") {
|
// if (editThreadTitle.message == "ThreadTitle updated Successfully") {
|
||||||
// const editedThread: CommentSchema = {
|
// const editedThread: CommentSchema = {
|
||||||
// state: 'active',
|
// state: 'active',
|
||||||
@@ -74,7 +76,8 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
// lastUpdatedAt: new Date().toISOString(),
|
// lastUpdatedAt: new Date().toISOString(),
|
||||||
// position: editThreadTitle.data.position,
|
// position: editThreadTitle.data.position,
|
||||||
// rotation: [0, 0, 0],
|
// rotation: [0, 0, 0],
|
||||||
// comments: []
|
// comments: [],
|
||||||
|
// versionId: selectedVersion?.versionId || ""
|
||||||
// }
|
// }
|
||||||
// updateComment((val as CommentSchema).threadId, editedThread)
|
// updateComment((val as CommentSchema).threadId, editedThread)
|
||||||
// }
|
// }
|
||||||
@@ -84,17 +87,17 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
userId,
|
userId,
|
||||||
threadTitle: value,
|
threadTitle: value,
|
||||||
organization,
|
organization,
|
||||||
threadId: (val as CommentSchema).threadId
|
threadId: (val as CommentSchema).threadId || selectedComment.threadId,
|
||||||
|
versionId: selectedVersion?.versionId || ""
|
||||||
}
|
}
|
||||||
|
|
||||||
threadSocket.emit('v1:thread:updateTitle', threadEdit)
|
threadSocket.emit('v1:thread:updateTitle', threadEdit)
|
||||||
} catch {
|
} catch {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (mode === "edit") {
|
if (mode === "edit") {
|
||||||
try {
|
try {
|
||||||
// const editComments = await addCommentsApi(projectId, value, selectedComment?.threadId, (val as Reply).replyId)
|
// const editComments = await addCommentsApi(projectId, value, selectedComment?.threadId, (val as Reply).replyId, selectedVersion?.versionId || "")
|
||||||
//
|
//
|
||||||
// const commentData = {
|
// const commentData = {
|
||||||
// replyId: `${editComments.data?.replyId}`,
|
// replyId: `${editComments.data?.replyId}`,
|
||||||
@@ -102,6 +105,7 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
// createdAt: getRelativeTime(editComments.data?.createdAt),
|
// createdAt: getRelativeTime(editComments.data?.createdAt),
|
||||||
// lastUpdatedAt: "2 hrs ago",
|
// lastUpdatedAt: "2 hrs ago",
|
||||||
// comment: value,
|
// comment: value,
|
||||||
|
// versionId: selectedVersion?.versionId || ""
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// updateReply((val as CommentSchema).threadId, (val as Reply)?.replyId, commentData);
|
// updateReply((val as CommentSchema).threadId, (val as Reply)?.replyId, commentData);
|
||||||
@@ -114,7 +118,8 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
comment: value,
|
comment: value,
|
||||||
organization,
|
organization,
|
||||||
threadId: selectedComment?.threadId,
|
threadId: selectedComment?.threadId,
|
||||||
commentId: (val as Reply).replyId ?? ""
|
commentId: (val as Reply).replyId ?? "",
|
||||||
|
versionId: selectedVersion?.versionId || ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -133,10 +138,10 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleDeleteAction = async (replyID: any) => {
|
const handleDeleteAction = async (replyID: any) => {
|
||||||
if (!projectId) return
|
if (!projectId || !selectedVersion) return
|
||||||
setOpenOptions(false);
|
setOpenOptions(false);
|
||||||
try {
|
try {
|
||||||
// const deletedComment = await deleteCommentApi(projectId, selectedComment?.threadId, (val as Reply).replyId)
|
// const deletedComment = await deleteCommentApi(projectId, selectedComment?.threadId, (val as Reply).replyId , selectedVersion?.versionId || "")
|
||||||
//
|
//
|
||||||
// if (deletedComment === "'Thread comment deleted Successfully'") {
|
// if (deletedComment === "'Thread comment deleted Successfully'") {
|
||||||
// setMessages && setMessages(prev => prev.filter(message => message.replyId !== replyID));
|
// setMessages && setMessages(prev => prev.filter(message => message.replyId !== replyID));
|
||||||
@@ -151,13 +156,16 @@ const Messages: React.FC<MessageProps> = ({ val, i, setMessages, mode, setIsEdit
|
|||||||
userId,
|
userId,
|
||||||
commentId: (val as Reply).replyId,
|
commentId: (val as Reply).replyId,
|
||||||
organization,
|
organization,
|
||||||
threadId: selectedComment?.threadId
|
threadId: selectedComment?.threadId,
|
||||||
|
versionId: selectedVersion?.versionId || ""
|
||||||
}
|
}
|
||||||
|
setMessages(prev => {
|
||||||
|
console.log("Previous messages:", prev.map((val) => val)); // 👈 logs the current state
|
||||||
setMessages(prev => prev.filter(message => message.replyId !== (val as Reply).replyId))
|
return prev.filter(message => message.replyId !== (val as Reply).replyId);
|
||||||
|
});
|
||||||
removeReply(selectedComment?.threadId, (val as Reply).replyId); // Remove listener after response
|
removeReply(selectedComment?.threadId, (val as Reply).replyId); // Remove listener after response
|
||||||
|
console.log('(val as Reply).replyId: ', (val as Reply).replyId);
|
||||||
|
|
||||||
threadSocket.emit("v1-Comment:delete", deleteComment);
|
threadSocket.emit("v1-Comment:delete", deleteComment);
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { addCommentsApi } from "../../../services/factoryBuilder/comments/addCom
|
|||||||
import { deleteThreadApi } from "../../../services/factoryBuilder/comments/deleteThreadApi";
|
import { deleteThreadApi } from "../../../services/factoryBuilder/comments/deleteThreadApi";
|
||||||
import { createThreadApi } from "../../../services/factoryBuilder/comments/createThreadApi";
|
import { createThreadApi } from "../../../services/factoryBuilder/comments/createThreadApi";
|
||||||
import { getRelativeTime } from "./function/getRelativeTime";
|
import { getRelativeTime } from "./function/getRelativeTime";
|
||||||
|
import { useVersionContext } from "../../../modules/builder/version/versionContext";
|
||||||
|
|
||||||
const ThreadChat: React.FC = () => {
|
const ThreadChat: React.FC = () => {
|
||||||
const { userId, organization } = getUserData();
|
const { userId, organization } = getUserData();
|
||||||
@@ -34,6 +35,8 @@ const ThreadChat: React.FC = () => {
|
|||||||
const { threadSocket } = useSocketStore();
|
const { threadSocket } = useSocketStore();
|
||||||
const modeRef = useRef<'create' | 'edit' | null>(null);
|
const modeRef = useRef<'create' | 'edit' | null>(null);
|
||||||
const messagesRef = useRef<HTMLDivElement>(null);
|
const messagesRef = useRef<HTMLDivElement>(null);
|
||||||
|
const { selectedVersionStore } = useVersionContext();
|
||||||
|
const { selectedVersion } = selectedVersionStore();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
modeRef.current = mode;
|
modeRef.current = mode;
|
||||||
@@ -48,12 +51,12 @@ const ThreadChat: React.FC = () => {
|
|||||||
)
|
)
|
||||||
.map((c) => {
|
.map((c) => {
|
||||||
return {
|
return {
|
||||||
replyId: c._id ?? "",
|
replyId: c._id ?? c.replyId,
|
||||||
creatorId: c.creatorId || c.userId,
|
creatorId: c.creatorId || c.userId,
|
||||||
createdAt: c.createdAt,
|
createdAt: c.createdAt,
|
||||||
lastUpdatedAt: "1 hr ago",
|
lastUpdatedAt: "1 hr ago",
|
||||||
comment: c.comment,
|
comment: c.comment,
|
||||||
_id: c._id ?? "",
|
_id: c._id ?? c.replyId,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -61,7 +64,7 @@ const ThreadChat: React.FC = () => {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}, [selectedComment])
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (textareaRef.current) adjustHeight(textareaRef.current);
|
if (textareaRef.current) adjustHeight(textareaRef.current);
|
||||||
@@ -143,7 +146,7 @@ const ThreadChat: React.FC = () => {
|
|||||||
const handleCreateComments = async (e: any) => {
|
const handleCreateComments = async (e: any) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
try {
|
try {
|
||||||
// const createComments = await addCommentsApi(projectId, value, selectedComment?.threadId)/
|
// const createComments = await addCommentsApi(projectId, value, selectedComment?.threadId, selectedVersion?.versionId || "")/
|
||||||
// if (createComments.message === 'Thread comments add Successfully' && createComments.data) {
|
// if (createComments.message === 'Thread comments add Successfully' && createComments.data) {
|
||||||
// const commentData = {
|
// const commentData = {
|
||||||
// replyId: `${createComments.data?._id}`,
|
// replyId: `${createComments.data?._id}`,
|
||||||
@@ -151,6 +154,7 @@ const ThreadChat: React.FC = () => {
|
|||||||
// createdAt: "2 hrs ago",
|
// createdAt: "2 hrs ago",
|
||||||
// lastUpdatedAt: "2 hrs ago",
|
// lastUpdatedAt: "2 hrs ago",
|
||||||
// comment: value,
|
// comment: value,
|
||||||
|
// versionId: selectedVersion?.versionId || ""
|
||||||
// }
|
// }
|
||||||
// setMessages((prevMessages) => [
|
// setMessages((prevMessages) => [
|
||||||
// ...prevMessages,
|
// ...prevMessages,
|
||||||
@@ -162,11 +166,13 @@ const ThreadChat: React.FC = () => {
|
|||||||
|
|
||||||
if (threadSocket && mode === "create") {
|
if (threadSocket && mode === "create") {
|
||||||
const addComment = {
|
const addComment = {
|
||||||
|
versionId: selectedVersion?.versionId || "",
|
||||||
projectId,
|
projectId,
|
||||||
userId,
|
userId,
|
||||||
comment: value,
|
comment: value,
|
||||||
organization,
|
organization,
|
||||||
threadId: selectedComment?.threadId
|
threadId: selectedComment?.threadId,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
threadSocket.emit("v1-Comment:add", addComment);
|
threadSocket.emit("v1-Comment:add", addComment);
|
||||||
@@ -179,19 +185,21 @@ const ThreadChat: React.FC = () => {
|
|||||||
const handleDeleteThread = async () => {
|
const handleDeleteThread = async () => {
|
||||||
if (!projectId) return;
|
if (!projectId) return;
|
||||||
try {
|
try {
|
||||||
// const deleteThread = await deleteThreadApi(projectId, selectedComment?.threadId)
|
// const deleteThread = await deleteThreadApi(projectId, selectedComment?.threadId, selectedVersion?.versionId || "")
|
||||||
//
|
//
|
||||||
// if (deleteThread.message === "Thread deleted Successfully") {
|
// if (deleteThread.message === "Thread deleted Successfully") {
|
||||||
// removeComment(selectedComment?.threadId)
|
// removeComment(selectedComment?.threadId)
|
||||||
// setSelectedComment([])
|
// setSelectedComment([])
|
||||||
// }
|
// }
|
||||||
|
console.log('threadSocket:threadChat ', threadSocket);
|
||||||
if (threadSocket) {
|
if (threadSocket) {
|
||||||
// projectId, userId, organization, threadId
|
// projectId, userId, organization, threadId
|
||||||
const deleteThread = {
|
const deleteThread = {
|
||||||
projectId,
|
projectId,
|
||||||
userId,
|
userId,
|
||||||
organization,
|
organization,
|
||||||
threadId: selectedComment?.threadId
|
threadId: selectedComment?.threadId,
|
||||||
|
versionId: selectedVersion?.versionId || ""
|
||||||
}
|
}
|
||||||
|
|
||||||
setSelectedComment(null)
|
setSelectedComment(null)
|
||||||
@@ -211,11 +219,12 @@ const ThreadChat: React.FC = () => {
|
|||||||
try {
|
try {
|
||||||
// try {
|
// try {
|
||||||
// const thread = await createThreadApi(
|
// const thread = await createThreadApi(
|
||||||
// projectId,
|
// projectId,
|
||||||
// "active",
|
// "active",
|
||||||
// commentPositionState[0].position,
|
// commentPositionState[0].position,
|
||||||
// [0, 0, 0],
|
// [0, 0, 0],
|
||||||
// value
|
// value,
|
||||||
|
// selectedVersion?.versionId || ""
|
||||||
// );
|
// );
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@@ -241,15 +250,17 @@ const ThreadChat: React.FC = () => {
|
|||||||
|
|
||||||
const createThread = {
|
const createThread = {
|
||||||
projectId,
|
projectId,
|
||||||
|
versionId: selectedVersion?.versionId || "",
|
||||||
userId,
|
userId,
|
||||||
organization,
|
organization,
|
||||||
state: "active",
|
state: "active",
|
||||||
position: commentPositionState.position,
|
position: commentPositionState.position,
|
||||||
rotation: [0, 0, 0],
|
rotation: [0, 0, 0],
|
||||||
threadTitle: value
|
threadTitle: value,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (threadSocket) {
|
if (threadSocket) {
|
||||||
|
console.log('createThread: ', createThread);
|
||||||
|
|
||||||
setInputActive(false);
|
setInputActive(false);
|
||||||
threadSocket.emit("v1:thread:create", createThread);
|
threadSocket.emit("v1:thread:create", createThread);
|
||||||
|
|||||||
@@ -5,16 +5,19 @@ import { getAllThreads } from '../../../../services/factoryBuilder/comments/getA
|
|||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
import { getUserData } from '../../../../functions/getUserData';
|
import { getUserData } from '../../../../functions/getUserData';
|
||||||
import { getRelativeTime } from '../../../../components/ui/collaboration/function/getRelativeTime';
|
import { getRelativeTime } from '../../../../components/ui/collaboration/function/getRelativeTime';
|
||||||
|
import { useVersionContext } from '../../../builder/version/versionContext';
|
||||||
|
|
||||||
function CommentInstances() {
|
function CommentInstances() {
|
||||||
const { comments, setComments } = useCommentStore();
|
const { comments, setComments } = useCommentStore();
|
||||||
const { projectId } = useParams();
|
const { projectId } = useParams();
|
||||||
const { userId } = getUserData()
|
const { userId } = getUserData();
|
||||||
|
const { selectedVersionStore } = useVersionContext();
|
||||||
|
const { selectedVersion } = selectedVersionStore();
|
||||||
|
|
||||||
const getThreads = async () => {
|
const getThreads = async () => {
|
||||||
if (!projectId) return;
|
if (!projectId || !selectedVersion) return;
|
||||||
try {
|
try {
|
||||||
const getComments = await getAllThreads(projectId);
|
const getComments = await getAllThreads(projectId, selectedVersion?.versionId);
|
||||||
|
|
||||||
const formattedThreads = Array.isArray(getComments.data)
|
const formattedThreads = Array.isArray(getComments.data)
|
||||||
? getComments.data.map((thread: any) => ({
|
? getComments.data.map((thread: any) => ({
|
||||||
|
|||||||
@@ -14,12 +14,13 @@ interface ThreadSocketProps {
|
|||||||
const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSocketProps) => {
|
const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSocketProps) => {
|
||||||
const { threadSocket } = useSocketStore();
|
const { threadSocket } = useSocketStore();
|
||||||
const { selectedComment, setSelectedComment, setCommentPositionState, commentPositionState } = useSelectedComment();
|
const { selectedComment, setSelectedComment, setCommentPositionState, commentPositionState } = useSelectedComment();
|
||||||
const { comments, addComment, addReply, updateComment, updateReply } = useCommentStore();
|
const { comments, removeReply, addComment, addReply, updateComment, updateReply } = useCommentStore();
|
||||||
const { userId } = getUserData();
|
const { userId } = getUserData();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!threadSocket) return;
|
if (!threadSocket) return;
|
||||||
|
|
||||||
|
|
||||||
// --- Add Comment Handler ---
|
// --- Add Comment Handler ---
|
||||||
// const handleAddComment = (data: any) => {
|
// const handleAddComment = (data: any) => {
|
||||||
//
|
//
|
||||||
@@ -55,52 +56,56 @@ const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSock
|
|||||||
// };
|
// };
|
||||||
// threadSocket.on('v1-Comment:response:add', handleAddComment);
|
// threadSocket.on('v1-Comment:response:add', handleAddComment);
|
||||||
const handleAddComment = (data: any) => {
|
const handleAddComment = (data: any) => {
|
||||||
// console.log('Add: ', data);
|
|
||||||
|
|
||||||
|
|
||||||
const commentData = {
|
const commentData = {
|
||||||
replyId: data.data?._id,
|
replyId: data.data?._id,
|
||||||
creatorId: data.data?.userId,
|
creatorId: data.data?.userId,
|
||||||
createdAt: getRelativeTime(data.data?.createdAt),
|
createdAt: getRelativeTime(data.data?.createdAt),
|
||||||
lastUpdatedAt: "2 hrs ago",
|
lastUpdatedAt: "2 hrs ago",
|
||||||
comment: data.data.comment,
|
comment: data.data?.comment,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (modeRef.current === "create") {
|
if (modeRef.current === "create") {
|
||||||
|
|
||||||
|
|
||||||
addReply(selectedComment?.threadId, commentData);
|
addReply(selectedComment?.threadId, commentData);
|
||||||
setMessages((prevMessages) => [...prevMessages, commentData]);
|
setMessages((prevMessages) => [...prevMessages, commentData]);
|
||||||
} else if (modeRef.current === "edit") {
|
} else if (modeRef.current === "edit") {
|
||||||
|
|
||||||
updateReply(selectedComment?.threadId, data.data?._id, commentData);
|
updateReply(selectedComment?.threadId, data.data?._id, commentData);
|
||||||
setMessages((prev) =>
|
setMessages((prev) =>
|
||||||
prev.map((message) => {
|
prev.map((message) => {
|
||||||
// 👈 log each message
|
// 👈 log each message
|
||||||
|
|
||||||
|
|
||||||
return message.replyId === data.data?._id
|
return message.replyId === data.data?._id
|
||||||
? { ...message, comment: data.data?.comment }
|
? { ...message, comment: data.data?.comment }
|
||||||
: message;
|
: message;
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
// console.log('data.data?.comment: ', data.data?.comment);
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
threadSocket.off("v1-Comment:response:add", handleAddComment);
|
|
||||||
};
|
};
|
||||||
threadSocket.on('v1-Comment:response:add', handleAddComment);
|
threadSocket.on('v1-Comment:response:add', handleAddComment);
|
||||||
// --- Delete Comment Handler ---
|
// --- Delete Comment Handler ---
|
||||||
|
|
||||||
const handleDeleteComment = (data: any) => {
|
const handleDeleteComment = (data: any) => {
|
||||||
// console.log('delete: ', data);
|
|
||||||
|
|
||||||
threadSocket.off('v1-Comment:response:delete', handleDeleteComment);
|
// setMessages(prev => {
|
||||||
|
// // 👈 logs the current state
|
||||||
|
// return prev.filter(message => message.replyId !== data.data._id);
|
||||||
|
// });
|
||||||
|
|
||||||
|
// removeReply(selectedComment?.threadId, data.data._id);
|
||||||
|
//
|
||||||
};
|
};
|
||||||
threadSocket.on('v1-Comment:response:delete', handleDeleteComment);
|
threadSocket.on('v1-Comment:response:delete', handleDeleteComment);
|
||||||
|
|
||||||
// --- Create Thread Handler ---
|
// --- Create Thread Handler ---
|
||||||
const handleCreateThread = (data: any) => {
|
const handleCreateThread = (data: any) => {
|
||||||
// console.log('createThread: ', data);
|
|
||||||
|
|
||||||
const comment: CommentSchema = {
|
const comment: CommentSchema = {
|
||||||
state: 'active',
|
state: 'active',
|
||||||
@@ -117,20 +122,28 @@ const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSock
|
|||||||
addComment(comment);
|
addComment(comment);
|
||||||
setCommentPositionState(null);
|
setCommentPositionState(null);
|
||||||
// setSelectedComment(null);
|
// setSelectedComment(null);
|
||||||
threadSocket.off('v1-thread:response:create', handleCreateThread);
|
|
||||||
};
|
};
|
||||||
threadSocket.on('v1-thread:response:create', handleCreateThread);
|
threadSocket.on('v1-thread:response:create', handleCreateThread);
|
||||||
|
|
||||||
// --- Delete Thread Handler ---
|
// --- Delete Thread Handler ---
|
||||||
|
// const handleDeleteThread = (data: any) => {
|
||||||
|
//
|
||||||
|
|
||||||
|
// };
|
||||||
|
// threadSocket.on("v1-thread:response:delete", handleDeleteThread);
|
||||||
|
console.log(
|
||||||
|
"del"
|
||||||
|
);
|
||||||
const handleDeleteThread = (data: any) => {
|
const handleDeleteThread = (data: any) => {
|
||||||
|
|
||||||
threadSocket.off('v1-thread:response:delete', handleDeleteThread);
|
|
||||||
};
|
};
|
||||||
threadSocket.on('v1-thread:response:delete', handleDeleteThread);
|
threadSocket.on("v1-thread:response:delete", handleDeleteThread);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const handleEditThread = (data: any) => {
|
const handleEditThread = (data: any) => {
|
||||||
|
|
||||||
|
|
||||||
const editedThread: CommentSchema = {
|
const editedThread: CommentSchema = {
|
||||||
state: 'active',
|
state: 'active',
|
||||||
threadId: data.data?._id,
|
threadId: data.data?._id,
|
||||||
@@ -138,17 +151,16 @@ const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSock
|
|||||||
createdAt: data.data?.createdAt,
|
createdAt: data.data?.createdAt,
|
||||||
threadTitle: data.data?.threadTitle,
|
threadTitle: data.data?.threadTitle,
|
||||||
lastUpdatedAt: new Date().toISOString(),
|
lastUpdatedAt: new Date().toISOString(),
|
||||||
position: data.data.position,
|
position: data.data?.position,
|
||||||
rotation: [0, 0, 0],
|
rotation: [0, 0, 0],
|
||||||
comments: data.data.comments,
|
comments: data.data?.comments,
|
||||||
};
|
};
|
||||||
|
|
||||||
// console.log('data.data?._id: ', data.data?._id);
|
//
|
||||||
updateComment(data.data?._id, editedThread);
|
updateComment(data.data?._id, editedThread);
|
||||||
setSelectedComment(editedThread)
|
setSelectedComment(editedThread)
|
||||||
|
|
||||||
// setSelectedComment(null);
|
// setSelectedComment(null);
|
||||||
|
|
||||||
};
|
};
|
||||||
threadSocket.on('v1-thread:response:updateTitle', handleEditThread);
|
threadSocket.on('v1-thread:response:updateTitle', handleEditThread);
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import { SceneProvider } from "../modules/scene/sceneContext";
|
|||||||
import { getVersionHistoryApi } from "../services/factoryBuilder/versionControl/getVersionHistoryApi";
|
import { getVersionHistoryApi } from "../services/factoryBuilder/versionControl/getVersionHistoryApi";
|
||||||
import { useVersionHistoryStore } from "../store/builder/useVersionHistoryStore";
|
import { useVersionHistoryStore } from "../store/builder/useVersionHistoryStore";
|
||||||
import { VersionProvider } from "../modules/builder/version/versionContext";
|
import { VersionProvider } from "../modules/builder/version/versionContext";
|
||||||
import ThreadChat from "../components/ui/collaboration/ThreadChat";
|
|
||||||
|
|
||||||
const Project: React.FC = () => {
|
const Project: React.FC = () => {
|
||||||
let navigate = useNavigate();
|
let navigate = useNavigate();
|
||||||
@@ -47,7 +46,7 @@ const Project: React.FC = () => {
|
|||||||
const { selectedUser } = useSelectedUserStore();
|
const { selectedUser } = useSelectedUserStore();
|
||||||
const { isLogListVisible } = useLogger();
|
const { isLogListVisible } = useLogger();
|
||||||
const { setVersions } = useVersionHistoryStore();
|
const { setVersions } = useVersionHistoryStore();
|
||||||
const { selectedComment, commentPositionState } = useSelectedComment();
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!email || !userId) {
|
if (!email || !userId) {
|
||||||
@@ -132,7 +131,7 @@ const Project: React.FC = () => {
|
|||||||
<LogList />
|
<LogList />
|
||||||
</RenderOverlay>
|
</RenderOverlay>
|
||||||
)}
|
)}
|
||||||
{(commentPositionState !== null || selectedComment !== null) && <ThreadChat />}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
|
let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
|
||||||
// let url_Backend_dwinzo = `http://192.168.0.102:5000`;
|
// let url_Backend_dwinzo = `http://192.168.0.102:5000`;
|
||||||
|
|
||||||
export const deleteThreadApi = async (projectId: string, threadId: string) => {
|
export const deleteThreadApi = async (
|
||||||
|
projectId: string,
|
||||||
|
threadId: string,
|
||||||
|
versionId: string
|
||||||
|
) => {
|
||||||
const body: any = {
|
const body: any = {
|
||||||
projectId,
|
projectId,
|
||||||
threadId,
|
threadId,
|
||||||
|
versionId,
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
|
let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
|
||||||
|
|
||||||
export const getAllThreads = async (projectId: string) => {
|
export const getAllThreads = async (projectId: string, versionId: string) => {
|
||||||
|
console.log("projectId: ", projectId, versionId);
|
||||||
try {
|
try {
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
`${url_Backend_dwinzo}/api/v1/Threads/${projectId}`,
|
`${url_Backend_dwinzo}/api/v1/Threads/${projectId}/${versionId}`,
|
||||||
{
|
{
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: {
|
headers: {
|
||||||
@@ -21,7 +22,6 @@ export const getAllThreads = async (projectId: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const result = await response.json();
|
const result = await response.json();
|
||||||
console.log('result: ', result);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user