From f9311ee2968a86a43e55650222fab116fb8a8a57 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Mon, 15 Sep 2025 14:25:12 +0530 Subject: [PATCH] added response handlers --- .../ui/collaboration/threads/ThreadChat.tsx | 2 +- .../useAssetResponseHandler.ts | 36 ++++ app/src/modules/builder/builder.tsx | 7 +- .../modules/collaboration/collaboration.tsx | 4 +- .../collaboration/socket/builderResponses.tsx | 170 ++++++++++++++++++ .../socket/socketResponses.dev.tsx | 25 --- .../collaboration/socket/socketResponses.tsx | 12 ++ .../collaboration/socket/userResponses.tsx | 29 +++ .../selection3D/transformControls3D.tsx | 14 +- app/src/store/builder/store.ts | 57 +++--- app/src/styles/scene/_scene.scss | 1 + 11 files changed, 298 insertions(+), 59 deletions(-) create mode 100644 app/src/modules/builder/asset/responseHandler/useAssetResponseHandler.ts create mode 100644 app/src/modules/collaboration/socket/builderResponses.tsx delete mode 100644 app/src/modules/collaboration/socket/socketResponses.dev.tsx create mode 100644 app/src/modules/collaboration/socket/socketResponses.tsx create mode 100644 app/src/modules/collaboration/socket/userResponses.tsx diff --git a/app/src/components/ui/collaboration/threads/ThreadChat.tsx b/app/src/components/ui/collaboration/threads/ThreadChat.tsx index 90283ef..116e368 100644 --- a/app/src/components/ui/collaboration/threads/ThreadChat.tsx +++ b/app/src/components/ui/collaboration/threads/ThreadChat.tsx @@ -153,7 +153,7 @@ const ThreadChat: React.FC = () => { addReply(selectedComment?.threadId, commentData); } }); - } else if (mode === "create") { + } else if (threadSocket?.connected && mode === "create") { // SOCKET const addComment = { diff --git a/app/src/modules/builder/asset/responseHandler/useAssetResponseHandler.ts b/app/src/modules/builder/asset/responseHandler/useAssetResponseHandler.ts new file mode 100644 index 0000000..2926e1e --- /dev/null +++ b/app/src/modules/builder/asset/responseHandler/useAssetResponseHandler.ts @@ -0,0 +1,36 @@ +import { useCallback } from "react"; + +function useAssetResponseHandler() { + const addAssetToScene = useCallback((asset: Asset, callback?: () => void) => { + console.log("Adding asset:", asset); + + if (callback) callback(); + }, []); + + const removeAssetFromScene = useCallback((assetId: string, callback?: () => void) => { + console.log("Removing asset with id:", assetId); + + if (callback) callback(); + }, []); + + const duplicateAssetInScene = useCallback((assetId: string, callback?: () => void) => { + console.log("Duplicating asset with id:", assetId); + + if (callback) callback(); + }, []); + + const pasteAssetToScene = useCallback((asset: Asset, callback?: () => void) => { + console.log("Pasting asset:", asset); + + if (callback) callback(); + }, []); + + return { + addAssetToScene, + removeAssetFromScene, + duplicateAssetInScene, + pasteAssetToScene, + }; +} + +export default useAssetResponseHandler; diff --git a/app/src/modules/builder/builder.tsx b/app/src/modules/builder/builder.tsx index 5aa0921..24a277c 100644 --- a/app/src/modules/builder/builder.tsx +++ b/app/src/modules/builder/builder.tsx @@ -13,7 +13,6 @@ import { useToggleView, useWallVisibility, useRoofVisibility, useShadows, useToo import * as Types from "../../types/world/worldTypes"; -import SocketResponses from "../collaboration/socket/socketResponses.dev"; import Ground from "../scene/environment/ground"; import MeasurementTool from "../scene/tools/measurementTool"; import NavMesh from "../simulation/vehicle/navMesh/navMesh"; @@ -44,7 +43,7 @@ export default function Builder() { const { setRenderDistance } = useRenderDistance(); const { setLimitDistance } = useLimitDistance(); const { projectId } = useParams(); - const { setHoveredPoint, setHoveredLine, selectedWallAsset } = useBuilderStore(); + const { setHoveredPoint, setHoveredLine } = useBuilderStore(); useEffect(() => { if (!toggleView) { @@ -68,7 +67,7 @@ export default function Builder() { }, [projectId]); useFrame(() => { - if (csgRef.current && selectedWallAsset) { + if (csgRef.current) { csgRef.current.update(); } }); @@ -77,8 +76,6 @@ export default function Builder() { <> - - diff --git a/app/src/modules/collaboration/collaboration.tsx b/app/src/modules/collaboration/collaboration.tsx index 92d23cc..828e242 100644 --- a/app/src/modules/collaboration/collaboration.tsx +++ b/app/src/modules/collaboration/collaboration.tsx @@ -1,16 +1,16 @@ import React from "react"; import CamModelsGroup from "./camera/collabCams"; import ThreadsGroup from "./threads/threadsGroup"; +import SocketResponses from "./socket/socketResponses"; const Collaboration: React.FC = () => { - return ( <> - + ); }; diff --git a/app/src/modules/collaboration/socket/builderResponses.tsx b/app/src/modules/collaboration/socket/builderResponses.tsx new file mode 100644 index 0000000..31de19f --- /dev/null +++ b/app/src/modules/collaboration/socket/builderResponses.tsx @@ -0,0 +1,170 @@ +import { useEffect } from "react"; +import { useSocketStore } from "../../../store/builder/store"; +import useAssetResponseHandler from "../../builder/asset/responseHandler/useAssetResponseHandler"; + +function BuilderResponses() { + const { socket } = useSocketStore(); + const { addAssetToScene, removeAssetFromScene } = useAssetResponseHandler(); + + //#region Asset + useEffect(() => { + if (!socket) return; + + socket.on("v1:model-asset:response:add", (data: any) => { + if (!data.message) return; + if (data.message === "Model created successfully") { + } else if (data.message === "Updated successfully") { + } + }); + + socket.on("v1:model-asset:response:delete", (data: any) => { + if (!data.message) return; + if (data.message === "Model deleted successfully") { + } + }); + + return () => { + if (socket) { + socket.off("v1:model-asset:response:add"); + socket.off("v1:model-asset:response:delete"); + } + }; + }, [socket]); + //#endregion + + //#region WallAsset + useEffect(() => { + if (!socket) return; + + socket.on("v1:wall-asset:response:add", (data: any) => { + if (!data.message) return; + if (data.message === "WallAsset Created Successfully") { + } else if (data.message === "WallAsset Updated Successfully") { + } + }); + + socket.on("v1:wall-asset:response:delete", (data: any) => { + if (!data.message) return; + if (data.message === "WallAsset Created Successfully") { + } + }); + + return () => { + if (socket) { + socket.off("v1:wall-asset:response:add"); + socket.off("v1:wall-asset:response:delete"); + } + }; + }, [socket]); + //#endregion + + //#region Wall + useEffect(() => { + if (!socket) return; + + socket.on("v1:model-Wall:response:add", (data: any) => { + if (!data.message) return; + if (data.message === "Wall Created Successfully") { + } else if (data.message === "Wall Updated Successfully") { + } + }); + + socket.on("v1:model-Wall:response:delete", (data: any) => { + if (!data.message) return; + if (data.message === "Wall Deleted Successfully") { + } + }); + + return () => { + if (socket) { + socket.off("v1:model-Wall:response:add"); + socket.off("v1:model-Wall:response:delete"); + } + }; + }, [socket]); + //#endregion + + //#region Floor + useEffect(() => { + if (!socket) return; + + socket.on("v1:model-Floor:response:add", (data: any) => { + if (!data.message) return; + if (data.message === "Floor Created Successfully") { + } else if (data.message === "Floor Updated Successfully") { + } + }); + + socket.on("v1:model-Floor:response:delete", (data: any) => { + if (!data.message) return; + if (data.message === "Floor Deleted Successfully") { + } + }); + + return () => { + if (socket) { + socket.off("v1:model-Floor:response:add"); + socket.off("v1:model-Floor:response:delete"); + } + }; + }, [socket]); + //#endregion + + //#region Aisle + useEffect(() => { + if (!socket) return; + + socket.on("v1:model-aisle:response:add", (data: any) => { + if (!data.message) return; + if (data.message === "Aisle Created Successfully") { + } else if (data.message === "Aisle Updated Successfully") { + } + }); + + socket.on("v1:model-aisle:response:delete", (data: any) => { + if (!data.message) return; + if (data.message === "Aisle Deleted Successfully") { + } + }); + + return () => { + if (socket) { + socket.off("v1:model-aisle:response:add"); + socket.off("v1:model-aisle:response:delete"); + } + }; + }, [socket]); + //#endregion + + //#region Zone + useEffect(() => { + if (!socket) return; + + socket.on("v1:zone:response:updates", (data: any) => { + console.log("data: ", data); + if (!data.message) return; + if (data.message === "zone created successfully") { + } else if (data.message === "zone updated") { + } + }); + + socket.on("v1:zone:response:delete", (data: any) => { + console.log("data: ", data); + if (!data.message) return; + if (data.message === "zone deleted created successfully") { + } + }); + + return () => { + if (socket) { + socket.off("v1:zone:response:updates"); + socket.off("v1:zone:response:delete"); + } + }; + }, [socket]); + //#endregion + + return null; +} + +export default BuilderResponses; diff --git a/app/src/modules/collaboration/socket/socketResponses.dev.tsx b/app/src/modules/collaboration/socket/socketResponses.dev.tsx deleted file mode 100644 index 5ac1e79..0000000 --- a/app/src/modules/collaboration/socket/socketResponses.dev.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useEffect } from 'react'; -import { useSocketStore } from '../../../store/builder/store'; - -export default function SocketResponses() { - const { socket } = useSocketStore(); - - useEffect(() => { - if (socket) { - socket.on("v1:model-asset:response:add", (data: any) => { - // console.log('data: ', data); - }); - } - - return () => { - if (socket) { - socket.off("v1:model-asset:response:add"); - } - } - }, [socket]) - - return ( - <> - - ); -} diff --git a/app/src/modules/collaboration/socket/socketResponses.tsx b/app/src/modules/collaboration/socket/socketResponses.tsx new file mode 100644 index 0000000..e47f186 --- /dev/null +++ b/app/src/modules/collaboration/socket/socketResponses.tsx @@ -0,0 +1,12 @@ +import UserResponses from "./userResponses"; +import BuilderResponses from "./builderResponses"; + +export default function SocketResponses() { + return ( + <> + + + + + ); +} diff --git a/app/src/modules/collaboration/socket/userResponses.tsx b/app/src/modules/collaboration/socket/userResponses.tsx new file mode 100644 index 0000000..ec08755 --- /dev/null +++ b/app/src/modules/collaboration/socket/userResponses.tsx @@ -0,0 +1,29 @@ +import { useEffect } from "react"; +import { useSocketStore } from "../../../store/builder/store"; + +function UserResponses() { + const { socket } = useSocketStore(); + + //#region Camera + useEffect(() => { + if (!socket) return; + + socket.on("v1:camera:Response:update", (data: any) => { + if (!data.message) return; + if (data.message === "Model created successfully") { + } else if (data.message === "Updated successfully") { + } + }); + + return () => { + if (socket) { + socket.off("v1:camera:Response:update"); + } + }; + }, [socket]); + //#endregion + + return null; +} + +export default UserResponses; diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx index fbca87e..6b29879 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx @@ -186,6 +186,7 @@ function TransformControls3D() { useEffect(() => { const controls = transformControlsRef.current; if (!controls || !visible) return; + controls.setSize(0.6); controls.attach(tempObjectRef.current); controls.setMode(toolMode === "Move-Asset" ? "translate" : "rotate"); @@ -340,7 +341,18 @@ function TransformControls3D() { return null; } - return ; + return ( + + ); } export default TransformControls3D; diff --git a/app/src/store/builder/store.ts b/app/src/store/builder/store.ts index da0a2ae..bb50b43 100644 --- a/app/src/store/builder/store.ts +++ b/app/src/store/builder/store.ts @@ -1,39 +1,39 @@ import { create } from "zustand"; -import { io } from "socket.io-client"; +import { io, Socket } from "socket.io-client"; import * as CONSTANTS from "../../types/world/worldConstants"; -export const useSocketStore = create((set: any, get: any) => ({ +interface SocketStore { + socket: Socket | null; + visualizationSocket: Socket | null; + dashBoardSocket: Socket | null; + projectSocket: Socket | null; + threadSocket: Socket | null; + initializeSocket: (email?: string, organization?: string, token?: string, refreshToken?: string) => void; + disconnectSocket: () => void; +} + +export const useSocketStore = create((set, get) => ({ socket: null, - initializeSocket: (email?: string, organization?: string, token?: string, refreshToken?: string) => { + visualizationSocket: null, + dashBoardSocket: null, + projectSocket: null, + threadSocket: null, + + initializeSocket: (email, organization, token, refreshToken) => { const existingSocket = get().socket; if (existingSocket) { return; } - const socket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/Builder_v1`, { - reconnection: true, - auth: { token, refreshToken }, - }); + const socket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/Builder_v1`, { reconnection: true, auth: { token, refreshToken } }); - const visualizationSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/Visualization_v1`, { - reconnection: true, - auth: { token, refreshToken }, - }); + const visualizationSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/Visualization_v1`, { reconnection: true, auth: { token, refreshToken } }); - const dashBoardSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/dashboard`, { - reconnection: true, - auth: { token, refreshToken }, - }); + const dashBoardSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/dashboard`, { reconnection: true, auth: { token, refreshToken } }); - const projectSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/project`, { - reconnection: true, - auth: { token, refreshToken }, - }); + const projectSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/project`, { reconnection: true, auth: { token, refreshToken } }); - const threadSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/thread`, { - reconnection: true, - auth: { token, refreshToken }, - }); + const threadSocket = io(`http://${process.env.REACT_APP_SERVER_SOCKET_API_BASE_URL}/thread`, { reconnection: true, auth: { token, refreshToken } }); set({ socket, @@ -43,14 +43,21 @@ export const useSocketStore = create((set: any, get: any) => ({ threadSocket, }); }, + disconnectSocket: () => { - set((state: any) => { + set((state) => { state.socket?.disconnect(); state.visualizationSocket?.disconnect(); state.dashBoardSocket?.disconnect(); state.projectSocket?.disconnect(); state.threadSocket?.disconnect(); - return { socket: null }; + return { + socket: null, + visualizationSocket: null, + dashBoardSocket: null, + projectSocket: null, + threadSocket: null, + }; }); }, })); diff --git a/app/src/styles/scene/_scene.scss b/app/src/styles/scene/_scene.scss index dee2536..a683e61 100644 --- a/app/src/styles/scene/_scene.scss +++ b/app/src/styles/scene/_scene.scss @@ -127,6 +127,7 @@ left: 12px !important; border-radius: 6px; backdrop-filter: blur(4px); + height: fit-content; svg { display: none; }