From 8e7c5a1aa06feeec46b42c15e85b68c5246e11be Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Mon, 1 Sep 2025 17:36:40 +0530 Subject: [PATCH 01/17] added api fallback for sockets --- .../components/Dashboard/DashboardHome.tsx | 27 +- .../Dashboard/DashboardProjects.tsx | 29 +- app/src/components/Dashboard/SidePannel.tsx | 12 +- .../layout/sidebarLeft/assetList/Assets.tsx | 2 +- .../properties/AisleProperties.tsx | 4 +- .../properties/SelectedAisleProperties.tsx | 33 +- .../properties/SelectedDecalProperties.tsx | 54 +- .../properties/SelectedFloorProperties.tsx | 108 ++-- .../properties/SelectedWallProperties.tsx | 83 +-- .../components/ui/collaboration/Messages.tsx | 54 +- app/src/components/ui/inputs/Search.tsx | 33 +- .../Decal/decalCreator/decalCreator.tsx | 56 +- .../eventHandler/useDecalEventHandlers.ts | 106 ++-- .../aisle/aisleCreator/aisleCreator.tsx | 479 +++--------------- .../builder/asset/functions/addAssetModel.ts | 69 ++- .../model/eventHandlers/useEventHandlers.ts | 65 +-- app/src/modules/builder/dfx/LoadBlueprint.tsx | 33 +- .../floor/floorCreator/floorCreator.tsx | 80 +-- app/src/modules/builder/line/line.tsx | 270 +++++----- app/src/modules/builder/point/point.tsx | 325 ++++++------ .../builder/wall/wallCreator/wallCreator.tsx | 203 ++++---- .../Instances/Instance/wallAssetInstance.tsx | 58 ++- .../builder/wallAsset/wallAssetCreator.tsx | 28 +- .../builder/zone/zoneCreator/zoneCreator.tsx | 81 +-- .../socket/socketResponses.dev.tsx | 12 +- app/src/modules/scene/controls/controls.tsx | 4 +- .../selection2D/moveControls2D.tsx | 130 ++--- .../selection2D/selectionControls2D.tsx | 192 +++---- .../selection3D/copyPasteControls3D.tsx | 49 +- .../selection3D/duplicationControls3D.tsx | 48 +- .../selection3D/moveControls3D.tsx | 25 +- .../selection3D/rotateControls3D.tsx | 25 +- .../selection3D/selectionControls3D.tsx | 40 +- .../selection3D/transformControls3D.tsx | 61 ++- .../transformControls/transformControls.tsx | 61 ++- .../handlers/use2DRedoHandler.ts | 316 +++++++----- .../handlers/use2DUndoHandler.ts | 316 +++++++----- .../handlers/use3DRedoHandler.ts | 133 +++-- .../handlers/use3DUndoHandler.ts | 153 +++--- app/src/modules/scene/scene.tsx | 4 +- app/src/pages/Dashboard.tsx | 2 +- app/src/pages/Project.tsx | 2 +- app/src/store/builder/store.ts | 32 +- 43 files changed, 2034 insertions(+), 1863 deletions(-) diff --git a/app/src/components/Dashboard/DashboardHome.tsx b/app/src/components/Dashboard/DashboardHome.tsx index 0569c08..cc94530 100644 --- a/app/src/components/Dashboard/DashboardHome.tsx +++ b/app/src/components/Dashboard/DashboardHome.tsx @@ -39,7 +39,7 @@ const DashboardHome: React.FC = () => { if (JSON.stringify(projects) !== JSON.stringify(recentProjects)) { setRecentProjects(projects); } - } catch (error) {} + } catch (error) { } }; const handleRecentProjectSearch = async (inputValue: string) => { @@ -66,7 +66,7 @@ const DashboardHome: React.FC = () => { // ); // - //socket for delete Project + // SOCKET for delete Project const deleteProject = { projectId, organization, @@ -90,7 +90,7 @@ const DashboardHome: React.FC = () => { }; }); setIsSearchActive(false); - } catch (error) {} + } catch (error) { } }; const handleDuplicateRecentProject = async ( @@ -98,15 +98,18 @@ const DashboardHome: React.FC = () => { projectName: string, thumbnail: string ) => { - const duplicateRecentProjectData = { - userId, - thumbnail, - organization, - projectUuid: generateUniqueId(), - refProjectID: projectId, - projectName, - }; - projectSocket.emit("v1:project:Duplicate", duplicateRecentProjectData); + if (projectSocket) { + + const duplicateRecentProjectData = { + userId, + thumbnail, + organization, + projectUuid: generateUniqueId(), + refProjectID: projectId, + projectName, + }; + projectSocket.emit("v1:project:Duplicate", duplicateRecentProjectData); + } }; const renderProjects = () => { diff --git a/app/src/components/Dashboard/DashboardProjects.tsx b/app/src/components/Dashboard/DashboardProjects.tsx index ba2db7b..536dd24 100644 --- a/app/src/components/Dashboard/DashboardProjects.tsx +++ b/app/src/components/Dashboard/DashboardProjects.tsx @@ -60,7 +60,7 @@ const DashboardProjects: React.FC = () => { if (JSON.stringify(projects) !== JSON.stringify(workspaceProjects)) { setWorkspaceProjects(projects); } - } catch (error) {} + } catch (error) { } }; const handleDeleteProject = async (projectId: any) => { @@ -77,7 +77,7 @@ const DashboardProjects: React.FC = () => { userId, }; - //socket for deleting the project + // SOCKET for deleting the project if (projectSocket) { projectSocket.emit("v1:project:delete", deleteProjects); } else { @@ -95,7 +95,7 @@ const DashboardProjects: React.FC = () => { }; }); setIsSearchActive(false); - } catch (error) {} + } catch (error) { } }; const handleDuplicateWorkspaceProject = async ( @@ -110,16 +110,17 @@ const DashboardProjects: React.FC = () => { // projectName // ); // console.log("duplicatedProject: ", duplicatedProject); - - const duplicateProjectData = { - userId, - thumbnail, - organization, - projectUuid: generateUniqueId(), - refProjectID: projectId, - projectName, - }; - projectSocket.emit("v1:project:Duplicate", duplicateProjectData); + if (projectSocket) { + const duplicateProjectData = { + userId, + thumbnail, + organization, + projectUuid: generateUniqueId(), + refProjectID: projectId, + projectName, + }; + projectSocket.emit("v1:project:Duplicate", duplicateProjectData); + } }; const renderProjects = () => { @@ -166,7 +167,7 @@ const DashboardProjects: React.FC = () => { try { const sharedWithMe = await sharedWithMeProjects(); setSharedWithMeProjects(sharedWithMe); - } catch {} + } catch { } }; useEffect(() => { diff --git a/app/src/components/Dashboard/SidePannel.tsx b/app/src/components/Dashboard/SidePannel.tsx index 2c0ad64..15e704c 100644 --- a/app/src/components/Dashboard/SidePannel.tsx +++ b/app/src/components/Dashboard/SidePannel.tsx @@ -38,12 +38,13 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => { const handleCreateNewProject = async () => { const token = localStorage.getItem("token"); const refreshToken = localStorage.getItem("refreshToken"); - console.log("refreshToken: ", refreshToken); + if (!token || !refreshToken) { + console.error('token expired'); + return; + } try { const projectId = generateProjectId(); - useSocketStore - .getState() - .initializeSocket(email, organization, token, refreshToken); + useSocketStore.getState().initializeSocket(email, organization, token, refreshToken); //API for creating new Project // const project = await createProject( @@ -60,7 +61,6 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => { projectUuid: projectId, }; - console.log("projectSocket: ", projectSocket); if (projectSocket) { const handleResponse = (data: any) => { if (data.message === "Project created successfully") { @@ -90,7 +90,7 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => {
{userName ? userName.charAt(0).toUpperCase() + - userName.slice(1).toLowerCase() + userName.slice(1).toLowerCase() : "Anonymous"}
diff --git a/app/src/components/layout/sidebarLeft/assetList/Assets.tsx b/app/src/components/layout/sidebarLeft/assetList/Assets.tsx index 5294be5..ce41971 100644 --- a/app/src/components/layout/sidebarLeft/assetList/Assets.tsx +++ b/app/src/components/layout/sidebarLeft/assetList/Assets.tsx @@ -75,7 +75,7 @@ const Assets: React.FC = () => { return (
- +
{isLoading ? ( diff --git a/app/src/components/layout/sidebarRight/properties/AisleProperties.tsx b/app/src/components/layout/sidebarRight/properties/AisleProperties.tsx index ca2317d..9bb1b84 100644 --- a/app/src/components/layout/sidebarRight/properties/AisleProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/AisleProperties.tsx @@ -282,11 +282,11 @@ const AisleProperties: React.FC = () => {
)} diff --git a/app/src/components/ui/inputs/Search.tsx b/app/src/components/ui/inputs/Search.tsx index 73db02a..8310b26 100644 --- a/app/src/components/ui/inputs/Search.tsx +++ b/app/src/components/ui/inputs/Search.tsx @@ -5,12 +5,14 @@ interface SearchProps { value?: string | null; // The current value of the search input placeholder?: string; // Placeholder text for the input onChange: (value: string) => void; // Callback function to handle input changes + debounced?: boolean; // New prop: whether to debounce onChange } const Search: React.FC = ({ value = "", placeholder = "Search", onChange, + debounced = false, // Default false }) => { // State to track the input value and focus status const [inputValue, setInputValue] = useState(value); @@ -19,7 +21,10 @@ const Search: React.FC = ({ const handleInputChange = (event: ChangeEvent) => { const newValue = event.target.value; setInputValue(newValue); - onChange(newValue); // Call the onChange prop with the new value + + if (!debounced) { + onChange(newValue); // Immediate call if not debounced + } }; useEffect(() => { @@ -29,26 +34,36 @@ const Search: React.FC = ({ } }, [value]); + // Handle debounced effect + useEffect(() => { + if (!debounced) return; + + const timer = setTimeout(() => { + onChange(inputValue ?? ""); + }, 500); + + return () => clearTimeout(timer); + }, [inputValue, debounced, onChange]); + const handleClear = () => { - echo.warn("Search field cleared."); + console.warn("Search field cleared."); setInputValue(""); - onChange(""); // Clear the input value + onChange(""); // Clear immediately }; const handleFocus = () => { - setIsFocused(true); // Set focus state to true + setIsFocused(true); }; const handleBlur = () => { - setIsFocused(false); // Set focus state to false + setIsFocused(false); }; return (
@@ -76,4 +91,4 @@ const Search: React.FC = ({ ); }; -export default Search; +export default Search; \ No newline at end of file diff --git a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx index 16721d3..705463b 100644 --- a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx +++ b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx @@ -9,8 +9,8 @@ import { useVersionContext } from '../../version/versionContext'; import { getUserData } from '../../../../functions/getUserData'; -// import { upsertWallApi } from '../../../../services/factoryBuilder/wall/upsertWallApi'; -// import { upsertFloorApi } from '../../../../services/factoryBuilder/floor/upsertFloorApi'; +import { upsertWallApi } from '../../../../services/factoryBuilder/wall/upsertWallApi'; +import { upsertFloorApi } from '../../../../services/factoryBuilder/floor/upsertFloorApi'; function DecalCreator() { const { wallStore, floorStore } = useSceneContext(); @@ -63,22 +63,25 @@ function DecalCreator() { setTimeout(() => { const updatedWall = getWallById(wallIntersect.object.userData.wallUuid); if (updatedWall) { - if (projectId && updatedWall) { - // API + if (projectId) { + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + } else { - // SOCKET + // SOCKET - const data = { - wallData: updatedWall, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: updatedWall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); } } }, 0) @@ -107,21 +110,24 @@ function DecalCreator() { setTimeout(() => { const updatedFloor = getFloorById(floorIntersect.object.userData.floorUuid); if (projectId && updatedFloor) { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: updatedFloor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: updatedFloor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }, 0) } diff --git a/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts b/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts index fc7e75d..93eed53 100644 --- a/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts +++ b/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts @@ -13,8 +13,8 @@ import { useSceneContext } from '../../../scene/sceneContext'; import { detectModifierKeys } from '../../../../utils/shortcutkeys/detectModifierKeys'; import handleDecalPositionSnap from '../functions/handleDecalPositionSnap'; -// import { upsertWallApi } from '../../../../services/factoryBuilder/wall/upsertWallApi'; -// import { upsertFloorApi } from '../../../../services/factoryBuilder/floor/upsertFloorApi'; +import { upsertWallApi } from '../../../../services/factoryBuilder/wall/upsertWallApi'; +import { upsertFloorApi } from '../../../../services/factoryBuilder/floor/upsertFloorApi'; export function useDecalEventHandlers({ parent, @@ -147,22 +147,25 @@ export function useDecalEventHandlers({ setTimeout(() => { const updatedWall = getWallById(parent.wallUuid); if (updatedWall) { - if (projectId && updatedWall) { - // API + if (projectId) { + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + } else { - // SOCKET + // SOCKET - const data = { - wallData: updatedWall, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: updatedWall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); } } }, 0) @@ -171,21 +174,24 @@ export function useDecalEventHandlers({ const updatedFloor = parent; if (projectId && updatedFloor) { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: updatedFloor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: updatedFloor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }, 0) } @@ -197,41 +203,47 @@ export function useDecalEventHandlers({ const updatedWall = removeDecalInWall(decalUuid); if (projectId && updatedWall) { - // API + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + } else { - // SOCKET + // SOCKET - const data = { - wallData: updatedWall, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: updatedWall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); } } else if ('floorUuid' in parent) { const updatedFloor = removeDecalInFloor(decalUuid); if (projectId && updatedFloor) { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: updatedFloor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: updatedFloor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } } } diff --git a/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx b/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx index aea7cd2..d7a8d8a 100644 --- a/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx +++ b/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx @@ -10,7 +10,7 @@ import ReferenceAisle from './referenceAisle'; import ReferencePoint from '../../point/reference/referencePoint'; import { getUserData } from '../../../../functions/getUserData'; -// import { upsertAisleApi } from '../../../../services/factoryBuilder/aisle/upsertAisleApi'; +import { upsertAisleApi } from '../../../../services/factoryBuilder/aisle/upsertAisleApi'; function AisleCreator() { const { scene, camera, raycaster, gl, pointer } = useThree(); @@ -93,431 +93,70 @@ function AisleCreator() { } } - if (aisleType === 'solid-aisle') { + const aisleConfigs: Record any> = { + "solid-aisle": (color) => ({ aisleType: "solid-aisle", aisleColor: color, aisleWidth }), + "dashed-aisle": (color) => ({ aisleType: "dashed-aisle", aisleColor: color, aisleWidth, dashLength, gapLength }), + "dotted-aisle": (color) => ({ aisleType: "dotted-aisle", aisleColor: color, dotRadius, gapLength }), + "arrow-aisle": (color) => ({ aisleType: "arrow-aisle", aisleColor: color, aisleWidth }), + "arrows-aisle": (color) => ({ aisleType: "arrows-aisle", aisleColor: color, aisleWidth, aisleLength, gapLength }), + "arc-aisle": (color) => ({ aisleType: "arc-aisle", aisleColor: color, aisleWidth, isFlipped }), + "circle-aisle": (color) => ({ aisleType: "circle-aisle", aisleColor: color, aisleWidth }), + "junction-aisle": (color) => ({ aisleType: "junction-aisle", aisleColor: color, aisleWidth, isFlipped }) + }; + + if (!aisleType || !(aisleType in aisleConfigs)) return; + + if (tempPoints.length === 0) { + setTempPoints([newPoint]); + setIsCreating(true); + return; + } + + const aisle: Aisle = { + aisleUuid: THREE.MathUtils.generateUUID(), + points: [tempPoints[0], newPoint], + type: aisleConfigs[aisleType](aisleColor) + }; + + addAisle(aisle); + + push2D({ + type: "Draw", + actions: [{ + actionType: "Line-Create", + point: { type: "Aisle", lineData: aisle, timeStamp: new Date().toISOString() } + }] + }); + + addAilseToBackend(aisle); + + setTempPoints([newPoint]); + }; + + const addAilseToBackend = (aisle: Aisle) => { + if (projectId) { + if (!socket?.active) { + + // API + + upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'solid-aisle', - aisleColor: aisleColor, - aisleWidth: aisleWidth - } - }; - addAisle(aisle); + // SOCKET - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); - } - } else if (aisleType === 'dashed-aisle') { - - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); - } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'dashed-aisle', - aisleColor: aisleColor, - aisleWidth: aisleWidth, - dashLength: dashLength, - gapLength: gapLength - } - }; - - addAisle(aisle); - - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); - } - } else if (aisleType === 'dotted-aisle') { - - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); - } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'dotted-aisle', - aisleColor: aisleColor, - dotRadius: dotRadius, - gapLength: gapLength - } - }; - - addAisle(aisle); - - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); - } - } else if (aisleType === 'arrow-aisle') { - - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); - } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'arrow-aisle', - aisleColor: aisleColor, - aisleWidth: aisleWidth - } - }; - - addAisle(aisle); - - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); - } - } else if (aisleType === 'arrows-aisle') { - - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); - } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'arrows-aisle', - aisleColor: aisleColor, - aisleWidth: aisleWidth, - aisleLength: aisleLength, - gapLength: gapLength - } - }; - - addAisle(aisle); - - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); - } - } else if (aisleType === 'arc-aisle') { - - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); - } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'arc-aisle', - aisleColor: aisleColor, - aisleWidth: aisleWidth, - isFlipped: isFlipped - } - }; - - addAisle(aisle); - - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); - } - } else if (aisleType === 'circle-aisle') { - - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); - } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'circle-aisle', - aisleColor: aisleColor, - aisleWidth: aisleWidth - } - }; - - addAisle(aisle); - - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); - } - } else if (aisleType === 'junction-aisle') { - - if (tempPoints.length === 0) { - setTempPoints([newPoint]); - setIsCreating(true); - } else { - const aisle: Aisle = { - aisleUuid: THREE.MathUtils.generateUUID(), - points: [tempPoints[0], newPoint], - type: { - aisleType: 'junction-aisle', - aisleColor: aisleColor, - aisleWidth: aisleWidth, - isFlipped: isFlipped - } - }; - - addAisle(aisle); - - push2D({ - type: 'Draw', - actions: [ - { - actionType: 'Line-Create', - point: { - type: 'Aisle', - lineData: aisle, - timeStamp: new Date().toISOString(), - } - } - ], - }) - - if (projectId) { - - // API - - // upsertAisleApi(aisle.aisleUuid, aisle.points, aisle.type, projectId, selectedVersion?.versionId || '') - - // SOCKET - - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid, - points: aisle.points, - type: aisle.type - }) - } - setTempPoints([newPoint]); + socket.emit("v1:model-aisle:add", { + projectId, + versionId: selectedVersion?.versionId || "", + userId, + organization, + aisleUuid: aisle.aisleUuid, + points: aisle.points, + type: aisle.type + }); } } - }; + } const onContext = (event: any) => { event.preventDefault(); diff --git a/app/src/modules/builder/asset/functions/addAssetModel.ts b/app/src/modules/builder/asset/functions/addAssetModel.ts index 3eac4a2..fbd519a 100644 --- a/app/src/modules/builder/asset/functions/addAssetModel.ts +++ b/app/src/modules/builder/asset/functions/addAssetModel.ts @@ -7,14 +7,14 @@ import * as CONSTANTS from "../../../../types/world/worldConstants"; import PointsCalculator from "../../../simulation/events/points/functions/pointsCalculator"; import { getUserData } from "../../../../functions/getUserData"; -// import { setAssetsApi } from '../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; +import { setAssetsApi } from '../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; async function addAssetModel( scene: THREE.Scene, raycaster: THREE.Raycaster, camera: THREE.Camera, pointer: THREE.Vector2, - socket: Socket, + socket: Socket | null, selectedItem: any, setSelectedItem: any, addEvent: (event: EventsSchema) => void, @@ -106,7 +106,7 @@ async function handleModelLoad( selectedItem: any, addEvent: (event: EventsSchema) => void, addAsset: (asset: Asset) => void, - socket: Socket, + socket: Socket | null, versionId: string, projectId?: string, userId?: string @@ -140,22 +140,6 @@ async function handleModelLoad( opacity: 1, }; - - // API - - // await setAssetsApi( - // organization, - // newFloorItem.modelUuid, - // newFloorItem.modelName, - // newFloorItem.assetId, - // newFloorItem.position, - // { x: 0, y: 0, z: 0 }, - // false, - // true, - // ); - - // SOCKET - if (selectedItem.type) { const data = PointsCalculator( selectedItem.type, @@ -449,14 +433,34 @@ async function handleModelLoad( rotation: { x: model.rotation.x, y: model.rotation.y, z: model.rotation.z, }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id || '', eventData: eventData, versionId: versionId, projectId: projectId, userId: userId, }; - socket.emit("v1:model-asset:add", completeData); + if (!socket?.active) { + // API + + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + position: newFloorItem.position, + assetId: newFloorItem.assetId, + rotation: { x: model.rotation.x, y: model.rotation.y, z: model.rotation.z, }, + eventData: eventData, + isLocked: false, + isVisible: true, + versionId: versionId, + projectId: projectId, + }); + + } else { + // SOCKET + + socket.emit("v1:model-asset:add", completeData); + } const asset: Asset = { modelUuid: completeData.modelUuid, @@ -482,13 +486,32 @@ async function handleModelLoad( rotation: { x: model.rotation.x, y: model.rotation.y, z: model.rotation.z, }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id || '', versionId: versionId, projectId: projectId, userId: userId, }; - socket.emit("v1:model-asset:add", data); + if (!socket?.active) { + // API + + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + position: newFloorItem.position, + assetId: newFloorItem.assetId, + rotation: { x: model.rotation.x, y: model.rotation.y, z: model.rotation.z, }, + isLocked: false, + isVisible: true, + versionId: versionId, + projectId: projectId, + }); + + } else { + // SOCKET + + socket.emit("v1:model-asset:add", data); + } const asset = { modelUuid: data.modelUuid, diff --git a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts index edd9f4e..f6fbca3 100644 --- a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts +++ b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts @@ -16,7 +16,7 @@ import { useSelectedAsset } from '../../../../../../store/simulation/useSimulati import { useBuilderStore } from '../../../../../../store/builder/useBuilderStore'; import { upsertProductOrEventApi } from '../../../../../../services/simulation/products/UpsertProductOrEventApi'; -// import { deleteFloorItem } from '../../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi'; +import { deleteFloorItem } from '../../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi'; export function useModelEventHandlers({ boundingBox, @@ -146,24 +146,28 @@ export function useModelEventHandlers({ if (leftDrag.current || toggleView) return; if (activeTool === 'delete' && deletableFloorAsset && deletableFloorAsset.uuid === asset.modelUuid) { - //REST + if (!socket?.active) { - // const response = await deleteFloorItem(organization, asset.modelUuid, asset.modelName); + // REST - //SOCKET + deleteFloorItem(organization, asset.modelUuid, asset.modelName); - const data = { - organization, - modelUuid: asset.modelUuid, - modelName: asset.modelName, - socketId: socket.id, - userId, - versionId: selectedVersion?.versionId || '', - projectId + } else { + // SOCKET + + const data = { + organization, + modelUuid: asset.modelUuid, + modelName: asset.modelName, + socketId: socket.id, + userId, + versionId: selectedVersion?.versionId || '', + projectId + } + + socket.emit('v1:model-asset:delete', data) } - const response = socket.emit('v1:model-asset:delete', data) - removeEvent(asset.modelUuid); const updatedEvents = deleteEvent(asset.modelUuid); @@ -176,27 +180,24 @@ export function useModelEventHandlers({ ); }) - if (response) { + removeAsset(asset.modelUuid); - removeAsset(asset.modelUuid); - - push3D({ - type: 'Scene', - actions: [ - { - module: "builder", - actionType: "Asset-Delete", - asset: { - type: "Asset", - assetData: asset, - timeStap: new Date().toISOString() - } + push3D({ + type: 'Scene', + actions: [ + { + module: "builder", + actionType: "Asset-Delete", + asset: { + type: "Asset", + assetData: asset, + timeStap: new Date().toISOString() } - ] - }); + } + ] + }); - echo.success("Model Removed!"); - } + echo.success("Model Removed!"); } else if (activeModule === 'simulation' && subModule === "simulations" && activeTool === 'pen') { if (asset.eventData && asset.eventData.type === 'Conveyor') { diff --git a/app/src/modules/builder/dfx/LoadBlueprint.tsx b/app/src/modules/builder/dfx/LoadBlueprint.tsx index 216f2fe..52da573 100644 --- a/app/src/modules/builder/dfx/LoadBlueprint.tsx +++ b/app/src/modules/builder/dfx/LoadBlueprint.tsx @@ -9,6 +9,8 @@ import { useVersionContext } from '../version/versionContext'; import { useBuilderStore } from '../../../store/builder/useBuilderStore'; import { useSceneContext } from '../../scene/sceneContext'; +import { upsertWallApi } from '../../../services/factoryBuilder/wall/upsertWallApi'; + /** * DxfFile component handles the rendering and manipulation of DXf file data in a 3D scene. * It processes the DXF data to create points and lines representing walls and allows @@ -39,20 +41,25 @@ const DxfFile = () => { if (dfxWallGenerate) { dfxWallGenerate.map((wall: Wall) => { - const data = { - wallData: wall, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization - } - addWall(wall); - socket.emit('v1:model-Wall:add', data); - // API + if (projectId) { + if (!socket?.active) { + // API - // if (projectId) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', wall); - // } + upsertWallApi(projectId, selectedVersion?.versionId || '', wall); + } else { + // SOCKET + + const data = { + wallData: wall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + addWall(wall); + socket.emit('v1:model-Wall:add', data); + } + } }) } }, [dfxWallGenerate]); diff --git a/app/src/modules/builder/floor/floorCreator/floorCreator.tsx b/app/src/modules/builder/floor/floorCreator/floorCreator.tsx index 28450aa..76c5efb 100644 --- a/app/src/modules/builder/floor/floorCreator/floorCreator.tsx +++ b/app/src/modules/builder/floor/floorCreator/floorCreator.tsx @@ -10,7 +10,7 @@ import { getUserData } from '../../../../functions/getUserData'; import ReferencePoint from '../../point/reference/referencePoint'; import ReferenceFloor from './referenceFloor'; -// import { upsertFloorApi } from '../../../../services/factoryBuilder/floor/upsertFloorApi'; +import { upsertFloorApi } from '../../../../services/factoryBuilder/floor/upsertFloorApi'; function FloorCreator() { const { scene, camera, raycaster, gl, pointer } = useThree(); @@ -120,23 +120,25 @@ function FloorCreator() { }) if (projectId) { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); - } setTempPoints([]); setIsCreating(false); @@ -174,23 +176,25 @@ function FloorCreator() { }) if (projectId) { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); - } setTempPoints([]); setIsCreating(false); @@ -238,23 +242,25 @@ function FloorCreator() { }) if (projectId) { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); - } } setTempPoints([]); diff --git a/app/src/modules/builder/line/line.tsx b/app/src/modules/builder/line/line.tsx index 462660e..132a572 100644 --- a/app/src/modules/builder/line/line.tsx +++ b/app/src/modules/builder/line/line.tsx @@ -13,14 +13,14 @@ import { handleCanvasCursors } from '../../../utils/mouseUtils/handleCanvasCurso import { useSelectedPoints } from '../../../store/simulation/useSimulationStore'; import { calculateAssetTransformationOnWall } from '../wallAsset/Instances/Instance/functions/calculateAssetTransformationOnWall'; -// import { upsertWallApi } from '../../../services/factoryBuilder/wall/upsertWallApi'; -// import { deleteWallApi } from '../../../services/factoryBuilder/wall/deleteWallApi'; -// import { upsertFloorApi } from '../../../services/factoryBuilder/floor/upsertFloorApi'; -// import { deleteFloorApi } from '../../../services/factoryBuilder/floor/deleteFloorApi'; -// import { deleteZoneApi } from '../../../services/factoryBuilder/zone/deleteZoneApi'; -// import { upsertZoneApi } from '../../../services/factoryBuilder/zone/upsertZoneApi'; -// import { upsertWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; -// import { deleteWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi'; +import { upsertWallApi } from '../../../services/factoryBuilder/wall/upsertWallApi'; +import { deleteWallApi } from '../../../services/factoryBuilder/wall/deleteWallApi'; +import { upsertFloorApi } from '../../../services/factoryBuilder/floor/upsertFloorApi'; +import { deleteFloorApi } from '../../../services/factoryBuilder/floor/deleteFloorApi'; +import { deleteZoneApi } from '../../../services/factoryBuilder/zone/deleteZoneApi'; +import { upsertZoneApi } from '../../../services/factoryBuilder/zone/upsertZoneApi'; +import { upsertWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; +import { deleteWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi'; interface LineProps { points: [Point, Point]; @@ -120,43 +120,48 @@ function Line({ points }: Readonly) { if (projectId && asset) { removeWallAsset(asset.modelUuid); + if (!socket?.active) { - // API + // API - // deleteWallAssetApi(projectId, selectedVersion?.versionId || '', asset.modelUuid, asset.wallUuid); + deleteWallAssetApi(projectId, selectedVersion?.versionId || '', asset.modelUuid, asset.wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - modelUuid: asset.modelUuid, - wallUuid: asset.wallUuid + const data = { + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization, + modelUuid: asset.modelUuid, + wallUuid: asset.wallUuid + } + + socket.emit('v1:wall-asset:delete', data); } - - socket.emit('v1:wall-asset:delete', data); - } }) + if (!socket?.active) { - // API + // API - // deleteWallApi(projectId, selectedVersion?.versionId || '', removedWall.wallUuid); + deleteWallApi(projectId, selectedVersion?.versionId || '', removedWall.wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - wallUuid: removedWall.wallUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallUuid: removedWall.wallUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:delete', data); } - socket.emit('v1:model-Wall:delete', data); - push2D({ type: 'Draw', actions: [ @@ -180,22 +185,25 @@ function Line({ points }: Readonly) { if (removedFloors.length > 0) { removedFloors.forEach(floor => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteFloorApi(projectId, selectedVersion?.versionId || '', floor.floorUuid); + deleteFloorApi(projectId, selectedVersion?.versionId || '', floor.floorUuid); + } else { - // SOCKET + // SOCKET - const data = { - floorUuid: floor.floorUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorUuid: floor.floorUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:delete', data); } - - socket.emit('v1:model-Floor:delete', data); } }); @@ -218,22 +226,25 @@ function Line({ points }: Readonly) { if (updatedFloors.length > 0) { updatedFloors.forEach(floor => { if (projectId) { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }); @@ -263,22 +274,25 @@ function Line({ points }: Readonly) { if (removedZones.length > 0) { removedZones.forEach(zone => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteZoneApi(projectId, selectedVersion?.versionId || '', zone.zoneUuid); + deleteZoneApi(projectId, selectedVersion?.versionId || '', zone.zoneUuid); + } else { - // SOCKET + // SOCKET - const data = { - zoneUuid: zone.zoneUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneUuid: zone.zoneUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:delete', data); } - - socket.emit('v1:zone:delete', data); } }); @@ -301,22 +315,25 @@ function Line({ points }: Readonly) { if (updatedZones.length > 0) { updatedZones.forEach(zone => { if (projectId) { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); } }); @@ -435,40 +452,47 @@ function Line({ points }: Readonly) { }); if (projectId && updatedWallAsset) { - // API + if (!socket?.active) { + // API - // upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + } else { - // SOCKET + // SOCKET - const data = { - wallAssetData: updatedWallAsset, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallAssetData: updatedWallAsset, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:wall-asset:add', data); } - - socket.emit('v1:wall-asset:add', data); } }); } - // API + if (!socket?.active) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + // API - // SOCKET + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + } else { - const data = { - wallData: updatedWall, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + // SOCKET + + const data = { + wallData: updatedWall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); }) if (initialPositions.walls && initialPositions.walls.length > 0) { @@ -495,22 +519,25 @@ function Line({ points }: Readonly) { if (updatedFloors.length > 0 && projectId) { updatedFloors.forEach(updatedFloor => { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: updatedFloor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: updatedFloor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); }) if (initialPositions.floors && initialPositions.floors.length > 0) { @@ -537,22 +564,25 @@ function Line({ points }: Readonly) { if (updatedZones.length > 0 && projectId) { updatedZones.forEach(updatedZone => { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedZone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedZone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: updatedZone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: updatedZone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); }) if (initialPositions.zones && initialPositions.zones.length > 0) { diff --git a/app/src/modules/builder/point/point.tsx b/app/src/modules/builder/point/point.tsx index ac6b26a..ebf2aaa 100644 --- a/app/src/modules/builder/point/point.tsx +++ b/app/src/modules/builder/point/point.tsx @@ -11,16 +11,16 @@ import { useParams } from 'react-router-dom'; import { useVersionContext } from '../version/versionContext'; import { useSceneContext } from '../../scene/sceneContext'; -// import { upsertAisleApi } from '../../../services/factoryBuilder/aisle/upsertAisleApi'; -// import { deleteAisleApi } from '../../../services/factoryBuilder/aisle/deleteAisleApi'; -// import { upsertWallApi } from '../../../services/factoryBuilder/wall/upsertWallApi'; -// import { deleteWallApi } from '../../../services/factoryBuilder/wall/deleteWallApi'; -// import { upsertFloorApi } from '../../../services/factoryBuilder/floor/upsertFloorApi'; -// import { deleteFloorApi } from '../../../services/factoryBuilder/floor/deleteFloorApi'; -// import { upsertZoneApi } from '../../../services/factoryBuilder/zone/upsertZoneApi'; -// import { deleteZoneApi } from '../../../services/factoryBuilder/zone/deleteZoneApi'; -// import { upsertWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; -// import { deleteWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi'; +import { upsertAisleApi } from '../../../services/factoryBuilder/aisle/upsertAisleApi'; +import { deleteAisleApi } from '../../../services/factoryBuilder/aisle/deleteAisleApi'; +import { upsertWallApi } from '../../../services/factoryBuilder/wall/upsertWallApi'; +import { deleteWallApi } from '../../../services/factoryBuilder/wall/deleteWallApi'; +import { upsertFloorApi } from '../../../services/factoryBuilder/floor/upsertFloorApi'; +import { deleteFloorApi } from '../../../services/factoryBuilder/floor/deleteFloorApi'; +import { upsertZoneApi } from '../../../services/factoryBuilder/zone/upsertZoneApi'; +import { deleteZoneApi } from '../../../services/factoryBuilder/zone/deleteZoneApi'; +import { upsertWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; +import { deleteWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi'; import { getUserData } from '../../../functions/getUserData'; import { handleCanvasCursors } from '../../../utils/mouseUtils/handleCanvasCursors'; @@ -190,22 +190,25 @@ function Point({ point }: { readonly point: Point }) { const updatedAisles = getAislesByPointId(point.pointUuid); if (updatedAisles.length > 0 && projectId) { updatedAisles.forEach((updatedAisle) => { + if (!socket?.active) { - // API + // API - // upsertAisleApi(updatedAisle.aisleUuid, updatedAisle.points, updatedAisle.type, projectId, selectedVersion?.versionId || ''); + upsertAisleApi(updatedAisle.aisleUuid, updatedAisle.points, updatedAisle.type, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - socket.emit('v1:model-aisle:add', { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: updatedAisle.aisleUuid, - points: updatedAisle.points, - type: updatedAisle.type - }) + socket.emit('v1:model-aisle:add', { + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization, + aisleUuid: updatedAisle.aisleUuid, + points: updatedAisle.points, + type: updatedAisle.type + }) + } }) if (initialStates.aisles && initialStates.aisles.length > 0) { @@ -244,40 +247,47 @@ function Point({ point }: { readonly point: Point }) { }); if (projectId && updatedWallAsset) { - // API + if (!socket?.active) { + // API - // upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + } else { - // SOCKET + // SOCKET - const data = { - wallAssetData: updatedWallAsset, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallAssetData: updatedWallAsset, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:wall-asset:add', data); } - - socket.emit('v1:wall-asset:add', data); } }); } - // API + if (!socket?.active) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + // API - // SOCKET + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + } else { - const data = { - wallData: updatedWall, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + // SOCKET + + const data = { + wallData: updatedWall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); }); } @@ -301,22 +311,25 @@ function Point({ point }: { readonly point: Point }) { const updatedFloors = getFloorsByPointId(point.pointUuid); if (updatedFloors && updatedFloors.length > 0 && projectId) { updatedFloors.forEach((updatedFloor) => { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: updatedFloor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: updatedFloor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); }); } @@ -340,22 +353,25 @@ function Point({ point }: { readonly point: Point }) { const updatedZones = getZonesByPointId(point.pointUuid); if (updatedZones && updatedZones.length > 0 && projectId) { updatedZones.forEach((updatedZone) => { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedZone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedZone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: updatedZone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: updatedZone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); }); } @@ -388,23 +404,26 @@ function Point({ point }: { readonly point: Point }) { if (removedAisles.length > 0) { removedAisles.forEach(aisle => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteAisleApi(aisle.aisleUuid, projectId, selectedVersion?.versionId || ''); + deleteAisleApi(aisle.aisleUuid, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - const data = { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid + const data = { + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization, + aisleUuid: aisle.aisleUuid + } + + socket.emit('v1:model-aisle:delete', data); } - socket.emit('v1:model-aisle:delete', data); - } }); @@ -436,44 +455,50 @@ function Point({ point }: { readonly point: Point }) { if (projectId && asset) { removeWallAsset(asset.modelUuid); + if (!socket?.active) { - // API + // API - // deleteWallAssetApi(projectId, selectedVersion?.versionId || '', asset.modelUuid, asset.wallUuid); + deleteWallAssetApi(projectId, selectedVersion?.versionId || '', asset.modelUuid, asset.wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - modelUuid: asset.modelUuid, - wallUuid: asset.wallUuid + const data = { + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization, + modelUuid: asset.modelUuid, + wallUuid: asset.wallUuid + } + + socket.emit('v1:wall-asset:delete', data); } - socket.emit('v1:wall-asset:delete', data); - } }) if (projectId) { + if (!socket?.active) { - // API + // API - // deleteWallApi(projectId, selectedVersion?.versionId || '', wall.wallUuid); + deleteWallApi(projectId, selectedVersion?.versionId || '', wall.wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - wallUuid: wall.wallUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallUuid: wall.wallUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:delete', data); } - - socket.emit('v1:model-Wall:delete', data); } }); @@ -501,22 +526,25 @@ function Point({ point }: { readonly point: Point }) { if (removedFloors.length > 0) { removedFloors.forEach(floor => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteFloorApi(projectId, selectedVersion?.versionId || '', floor.floorUuid); + deleteFloorApi(projectId, selectedVersion?.versionId || '', floor.floorUuid); + } else { - // SOCKET + // SOCKET - const data = { - floorUuid: floor.floorUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorUuid: floor.floorUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:delete', data); } - - socket.emit('v1:model-Floor:delete', data); } }); @@ -539,22 +567,25 @@ function Point({ point }: { readonly point: Point }) { if (updatedFloors.length > 0) { updatedFloors.forEach(floor => { if (projectId) { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }); @@ -583,22 +614,25 @@ function Point({ point }: { readonly point: Point }) { if (removedZones.length > 0) { removedZones.forEach(zone => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteZoneApi(projectId, selectedVersion?.versionId || '', zone.zoneUuid); + deleteZoneApi(projectId, selectedVersion?.versionId || '', zone.zoneUuid); + } else { - // SOCKET + // SOCKET - const data = { - zoneUuid: zone.zoneUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneUuid: zone.zoneUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:delete', data); } - - socket.emit('v1:zone:delete', data); } }); @@ -621,22 +655,25 @@ function Point({ point }: { readonly point: Point }) { if (updatedZones.length > 0) { updatedZones.forEach(zone => { if (projectId) { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); } }); diff --git a/app/src/modules/builder/wall/wallCreator/wallCreator.tsx b/app/src/modules/builder/wall/wallCreator/wallCreator.tsx index 52d5d7e..02c7f0b 100644 --- a/app/src/modules/builder/wall/wallCreator/wallCreator.tsx +++ b/app/src/modules/builder/wall/wallCreator/wallCreator.tsx @@ -12,8 +12,8 @@ import getClosestIntersection from '../../line/helpers/getClosestIntersection'; import ReferencePoint from '../../point/reference/referencePoint'; import ReferenceWall from './referenceWall'; -// import { upsertWallApi } from '../../../../services/factoryBuilder/wall/upsertWallApi'; -// import { deleteWallApi } from '../../../../services/factoryBuilder/wall/deleteWallApi'; +import { upsertWallApi } from '../../../../services/factoryBuilder/wall/upsertWallApi'; +import { deleteWallApi } from '../../../../services/factoryBuilder/wall/deleteWallApi'; function WallCreator() { const { scene, camera, raycaster, gl, pointer } = useThree(); @@ -94,23 +94,26 @@ function WallCreator() { removeWall(wall.wallUuid); if (projectId) { + if (!socket?.active) { - // API + // API - // deleteWallApi(projectId, selectedVersion?.versionId || '', wall.wallUuid); + deleteWallApi(projectId, selectedVersion?.versionId || '', wall.wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - wallUuid: wall.wallUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallUuid: wall.wallUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:delete', data); } - socket.emit('v1:model-Wall:delete', data); - } const point1: Point = { @@ -147,24 +150,27 @@ function WallCreator() { addWall(wall2); - // API + if (projectId) { + if (!socket?.active) { + // API - // if (projectId) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', wall2); - // } + upsertWallApi(projectId, selectedVersion?.versionId || '', wall2); + } else { - // SOCKET + // SOCKET - const data = { - wallData: wall2, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: wall2, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); + } } - socket.emit('v1:model-Wall:add', data); - const wall3: Wall = { wallUuid: THREE.MathUtils.generateUUID(), points: [point2, newPoint], @@ -204,24 +210,27 @@ function WallCreator() { ], }) - // API + if (projectId) { + if (!socket?.active) { + // API - // if (projectId) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', wall3); - // } + upsertWallApi(projectId, selectedVersion?.versionId || '', wall3); + } else { - // SOCKET + // SOCKET - const data2 = { - wallData: wall3, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data2 = { + wallData: wall3, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data2); + } } - socket.emit('v1:model-Wall:add', data2); - setTempPoints([newPoint]); setIsCreating(true); } else { @@ -237,24 +246,27 @@ function WallCreator() { addWall(wall1); - // API + if (projectId) { + if (!socket?.active) { + // API - // if (projectId) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', wall1); - // } + upsertWallApi(projectId, selectedVersion?.versionId || '', wall1); + } else { - // SOCKET + // SOCKET - const data = { - wallData: wall1, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: wall1, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); + } } - socket.emit('v1:model-Wall:add', data); - const wall2: Wall = { wallUuid: THREE.MathUtils.generateUUID(), points: [point1, newPoint], @@ -267,24 +279,27 @@ function WallCreator() { addWall(wall2); - // API + if (projectId) { + if (!socket?.active) { + // API - // if (projectId) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', wall2); - // } + upsertWallApi(projectId, selectedVersion?.versionId || '', wall2); + } else { - // SOCKET + // SOCKET - const data1 = { - wallData: wall2, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data1 = { + wallData: wall2, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data1); + } } - socket.emit('v1:model-Wall:add', data1); - const wall3: Wall = { wallUuid: THREE.MathUtils.generateUUID(), points: [point2, newPoint], @@ -328,24 +343,27 @@ function WallCreator() { ], }) - // API + if (projectId) { + if (!socket?.active) { + // API - // if (projectId) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', wall3); - // } + upsertWallApi(projectId, selectedVersion?.versionId || '', wall3); + } else { - // SOCKET + // SOCKET - const data3 = { - wallData: wall3, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data3 = { + wallData: wall3, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data3); + } } - socket.emit('v1:model-Wall:add', data3); - setTempPoints([newPoint]); } @@ -411,24 +429,27 @@ function WallCreator() { ], }) - // API + if (projectId) { + if (!socket?.active) { + // API - // if (projectId) { - // upsertWallApi(projectId, selectedVersion?.versionId || '', wall); - // } + upsertWallApi(projectId, selectedVersion?.versionId || '', wall); + } else { - // SOCKET + // SOCKET - const data = { - wallData: wall, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: wall, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); + } } - socket.emit('v1:model-Wall:add', data); - setTempPoints([newPoint]); } diff --git a/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx b/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx index 3919f65..2f5a9f8 100644 --- a/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx +++ b/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx @@ -14,8 +14,8 @@ import { useVersionContext } from '../../../version/versionContext'; import { getUserData } from '../../../../../functions/getUserData'; import closestPointOnLineSegment from '../../../line/helpers/getClosestPointOnLineSegment'; -// import { upsertWallAssetApi } from '../../../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; -// import { deleteWallAssetApi } from '../../../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi'; +import { upsertWallAssetApi } from '../../../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; +import { deleteWallAssetApi } from '../../../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi'; function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { const url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; @@ -126,23 +126,25 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { const updatedWallAsset = getWallAssetById(wallAsset.modelUuid); if (projectId && updatedWallAsset) { + if (!socket?.active) { - // API + // API - // upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + } else { - // SOCKET + // SOCKET - const data = { - wallAssetData: updatedWallAsset, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallAssetData: updatedWallAsset, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:wall-asset:add', data); } - - socket.emit('v1:wall-asset:add', data); - } } } @@ -194,24 +196,26 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { const removedWallAsset = removeWallAsset(wallAsset.modelUuid); if (projectId && removedWallAsset) { + if (!socket?.active) { - // API + // API - // deleteWallAssetApi(projectId, selectedVersion?.versionId || '', removedWallAsset.modelUuid, removedWallAsset.wallUuid); + deleteWallAssetApi(projectId, selectedVersion?.versionId || '', removedWallAsset.modelUuid, removedWallAsset.wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - modelUuid: removedWallAsset.modelUuid, - wallUuid: removedWallAsset.wallUuid + const data = { + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization, + modelUuid: removedWallAsset.modelUuid, + wallUuid: removedWallAsset.wallUuid + } + + socket.emit('v1:wall-asset:delete', data); } - - socket.emit('v1:wall-asset:delete', data); - } } }, [activeTool, activeModule, deletableWallAsset, socket]) diff --git a/app/src/modules/builder/wallAsset/wallAssetCreator.tsx b/app/src/modules/builder/wallAsset/wallAssetCreator.tsx index 13438c2..bfbeb63 100644 --- a/app/src/modules/builder/wallAsset/wallAssetCreator.tsx +++ b/app/src/modules/builder/wallAsset/wallAssetCreator.tsx @@ -9,7 +9,7 @@ import { useVersionContext } from '../version/versionContext'; import { getUserData } from '../../../functions/getUserData'; import closestPointOnLineSegment from '../line/helpers/getClosestPointOnLineSegment'; -// import { upsertWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; +import { upsertWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; function WallAssetCreator() { const { socket } = useSocketStore(); @@ -62,23 +62,25 @@ function WallAssetCreator() { addWallAsset(newWallAsset); if (projectId) { + if (!socket?.active) { - // API + // API - // upsertWallAssetApi(projectId, selectedVersion?.versionId || '', newWallAsset); + upsertWallAssetApi(projectId, selectedVersion?.versionId || '', newWallAsset); + } else { - // SOCKET + // SOCKET - const data = { - wallAssetData: newWallAsset, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallAssetData: newWallAsset, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:wall-asset:add', data); } - - socket.emit('v1:wall-asset:add', data); - } } } diff --git a/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx index bed501f..85ce279 100644 --- a/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx +++ b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx @@ -10,7 +10,7 @@ import { getUserData } from '../../../../functions/getUserData'; import ReferencePoint from '../../point/reference/referencePoint'; import ReferenceZone from './referenceZone'; -// import { upsertZoneApi } from '../../../../services/factoryBuilder/zone/upsertZoneApi'; +import { upsertZoneApi } from '../../../../services/factoryBuilder/zone/upsertZoneApi'; function ZoneCreator() { const { scene, camera, raycaster, gl, pointer } = useThree(); @@ -33,7 +33,6 @@ function ZoneCreator() { const [isCreating, setIsCreating] = useState(false); const { zoneColor, zoneHeight, snappedPosition, snappedPoint, setSnappedPoint, setSnappedPosition } = useBuilderStore(); - useEffect(() => { const canvasElement = gl.domElement; @@ -119,23 +118,25 @@ function ZoneCreator() { }) if (projectId) { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); - } setTempPoints([]); setIsCreating(false); @@ -171,23 +172,25 @@ function ZoneCreator() { }) if (projectId) { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); - } setTempPoints([]); setIsCreating(false); @@ -233,23 +236,25 @@ function ZoneCreator() { }) if (projectId) { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); - } } setTempPoints([]); diff --git a/app/src/modules/collaboration/socket/socketResponses.dev.tsx b/app/src/modules/collaboration/socket/socketResponses.dev.tsx index f2ab238..5ac1e79 100644 --- a/app/src/modules/collaboration/socket/socketResponses.dev.tsx +++ b/app/src/modules/collaboration/socket/socketResponses.dev.tsx @@ -5,12 +5,16 @@ export default function SocketResponses() { const { socket } = useSocketStore(); useEffect(() => { - socket.on("v1:model-asset:response:add", (data: any) => { - // console.log('data: ', data); - }); + if (socket) { + socket.on("v1:model-asset:response:add", (data: any) => { + // console.log('data: ', data); + }); + } return () => { - socket.off("v1:model-asset:response:add"); + if (socket) { + socket.off("v1:model-asset:response:add"); + } } }, [socket]) diff --git a/app/src/modules/scene/controls/controls.tsx b/app/src/modules/scene/controls/controls.tsx index a3c9638..984cfa8 100644 --- a/app/src/modules/scene/controls/controls.tsx +++ b/app/src/modules/scene/controls/controls.tsx @@ -48,7 +48,7 @@ export default function Controls() { }, []); useEffect(() => { - if (resetCamera) { + if (resetCamera && socket) { controlsRef.current?.setPosition(...CONSTANTS.threeDimension.defaultPosition); controlsRef.current?.setTarget(...CONSTANTS.threeDimension.defaultTarget); controlsRef.current?.rotateAzimuthTo(CONSTANTS.threeDimension.defaultAzimuth); @@ -75,7 +75,7 @@ export default function Controls() { let intervalId: NodeJS.Timeout | null = null; const handleRest = () => { - if (hasInteracted && controlsRef.current && state.camera.position && !toggleView) { + if (hasInteracted && controlsRef.current && state.camera.position && !toggleView && socket) { const position = state.camera.position; if (position.x === 0 && position.y === 0 && position.z === 0) return; updateCamPosition(controlsRef, socket, position, state.camera.rotation, projectId); diff --git a/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx b/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx index 6c10141..a072d5e 100644 --- a/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx @@ -11,10 +11,11 @@ import { useSelectedPoints } from "../../../../../store/simulation/useSimulation import useModuleStore from "../../../../../store/useModuleStore"; import { calculateAssetTransformationOnWall } from "../../../../builder/wallAsset/Instances/Instance/functions/calculateAssetTransformationOnWall"; -// import { upsertAisleApi } from "../../../../../services/factoryBuilder/aisle/upsertAisleApi"; -// import { upsertWallApi } from "../../../../../services/factoryBuilder/wall/upsertWallApi"; -// import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; -// import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; +import { upsertAisleApi } from "../../../../../services/factoryBuilder/aisle/upsertAisleApi"; +import { upsertWallApi } from "../../../../../services/factoryBuilder/wall/upsertWallApi"; +import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; +import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; +import { upsertWallAssetApi } from "../../../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi"; function MoveControls2D({ movedObjects, @@ -270,21 +271,24 @@ function MoveControls2D({ if (updatedAisles.length > 0 && projectId) { updatedAisles.forEach((updatedAisle) => { - // API + if (!socket?.active) { + // API - // upsertAisleApi(updatedAisle.aisleUuid, updatedAisle.points, updatedAisle.type, projectId, selectedVersion?.versionId || ''); + upsertAisleApi(updatedAisle.aisleUuid, updatedAisle.points, updatedAisle.type, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - socket.emit('v1:model-aisle:add', { - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization, - aisleUuid: updatedAisle.aisleUuid, - points: updatedAisle.points, - type: updatedAisle.type - }); + socket.emit('v1:model-aisle:add', { + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization, + aisleUuid: updatedAisle.aisleUuid, + points: updatedAisle.points, + type: updatedAisle.type + }); + } const old = initialStates[movedObject.uuid]; if (old) { @@ -330,19 +334,22 @@ function MoveControls2D({ }); } - // API + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); + } else { - // SOCKET + // SOCKET - socket.emit('v1:model-Wall:add', { - wallData: updatedWall, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }); + socket.emit('v1:model-Wall:add', { + wallData: updatedWall, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }); + } const old = initialStates[movedObject.uuid]; if (old) { @@ -371,19 +378,22 @@ function MoveControls2D({ if (updatedFloors?.length && projectId) { updatedFloors.forEach(updatedFloor => { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); + } else { - // SOCKET + // SOCKET - socket.emit('v1:model-Floor:add', { - floorData: updatedFloor, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }); + socket.emit('v1:model-Floor:add', { + floorData: updatedFloor, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }); + } const updatedFloorsData = updatedFloors.map((floor) => { const originalFloor = Floors.find(f => f.floorUuid === floor.floorUuid) || floor; @@ -410,19 +420,22 @@ function MoveControls2D({ if (updatedZones?.length && projectId) { updatedZones.forEach(updatedZone => { - // API + if (!socket?.active) { + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedZone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedZone); + } else { - // SOCKET + // SOCKET - socket.emit('v1:zone:add', { - zoneData: updatedZone, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }); + socket.emit('v1:zone:add', { + zoneData: updatedZone, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }); + } const updatedZonesData = updatedZones.map((zone) => { const originalZone = Zones.find(z => z.zoneUuid === zone.zoneUuid) || zone; @@ -459,21 +472,24 @@ function MoveControls2D({ rotation: updatedWallAsset.rotation }); - // API + if (!socket?.active) { + // API - // upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); + } else { - // SOCKET + // SOCKET - const data = { - wallAssetData: updatedWallAsset, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallAssetData: updatedWallAsset, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:wall-asset:add', data); } - - socket.emit('v1:wall-asset:add', data); } }); } diff --git a/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx b/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx index a12196d..a01e1fb 100644 --- a/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx @@ -14,12 +14,13 @@ import { useSelectedPoints } from "../../../../../store/simulation/useSimulation import { useBuilderStore } from "../../../../../store/builder/useBuilderStore"; import MoveControls2D from "./moveControls2D"; -// import { deleteAisleApi } from "../../../../../services/factoryBuilder/aisle/deleteAisleApi"; -// import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi"; -// import { deleteFloorApi } from "../../../../../services/factoryBuilder/floor/deleteFloorApi"; -// import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; -// import { deleteZoneApi } from "../../../../../services/factoryBuilder/zone/deleteZoneApi"; -// import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; +import { deleteAisleApi } from "../../../../../services/factoryBuilder/aisle/deleteAisleApi"; +import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi"; +import { deleteFloorApi } from "../../../../../services/factoryBuilder/floor/deleteFloorApi"; +import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; +import { deleteZoneApi } from "../../../../../services/factoryBuilder/zone/deleteZoneApi"; +import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; +import { deleteWallAssetApi } from "../../../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi"; const SelectionControls2D: React.FC = () => { const { camera, controls, gl, scene, pointer } = useThree(); @@ -240,22 +241,25 @@ const SelectionControls2D: React.FC = () => { if (removedAisles.length > 0) { removedAisles.forEach(aisle => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteAisleApi(aisle.aisleUuid, projectId, selectedVersion?.versionId || ''); + deleteAisleApi(aisle.aisleUuid, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - const data = { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - aisleUuid: aisle.aisleUuid + const data = { + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization, + aisleUuid: aisle.aisleUuid + } + + socket.emit('v1:model-aisle:delete', data); } - - socket.emit('v1:model-aisle:delete', data); } }); @@ -280,43 +284,49 @@ const SelectionControls2D: React.FC = () => { removeWallAsset(asset.modelUuid); - // API + if (!socket?.active) { - // deleteWallAssetApi(projectId, selectedVersion?.versionId || '', asset.modelUuid, asset.wallUuid); + // API - // SOCKET + deleteWallAssetApi(projectId, selectedVersion?.versionId || '', asset.modelUuid, asset.wallUuid); + } else { - const data = { - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization, - modelUuid: asset.modelUuid, - wallUuid: asset.wallUuid + // SOCKET + + const data = { + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization, + modelUuid: asset.modelUuid, + wallUuid: asset.wallUuid + } + + socket.emit('v1:wall-asset:delete', data); } - - socket.emit('v1:wall-asset:delete', data); - } }) if (projectId) { + if (!socket?.active) { - // API + // API - // deleteWallApi(projectId, selectedVersion?.versionId || '', wall.wallUuid); + deleteWallApi(projectId, selectedVersion?.versionId || '', wall.wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - wallUuid: wall.wallUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallUuid: wall.wallUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:delete', data); } - - socket.emit('v1:model-Wall:delete', data); } }); @@ -335,22 +345,25 @@ const SelectionControls2D: React.FC = () => { if (removedFloors.length > 0) { removedFloors.forEach(floor => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteFloorApi(projectId, selectedVersion?.versionId || '', floor.floorUuid); + deleteFloorApi(projectId, selectedVersion?.versionId || '', floor.floorUuid); + } else { - // SOCKET + // SOCKET - const data = { - floorUuid: floor.floorUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorUuid: floor.floorUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:delete', data); } - - socket.emit('v1:model-Floor:delete', data); } }); @@ -365,22 +378,25 @@ const SelectionControls2D: React.FC = () => { if (updatedFloors.length > 0) { updatedFloors.forEach(floor => { if (projectId) { + if (!socket?.active) { - // API + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floor); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floor, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floor, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }); @@ -400,22 +416,25 @@ const SelectionControls2D: React.FC = () => { if (removedZones.length > 0) { removedZones.forEach(zone => { if (projectId) { + if (!socket?.active) { - // API + // API - // deleteZoneApi(projectId, selectedVersion?.versionId || '', zone.zoneUuid); + deleteZoneApi(projectId, selectedVersion?.versionId || '', zone.zoneUuid); + } else { - // SOCKET + // SOCKET - const data = { - zoneUuid: zone.zoneUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneUuid: zone.zoneUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:delete', data); } - - socket.emit('v1:zone:delete', data); } }); @@ -430,22 +449,25 @@ const SelectionControls2D: React.FC = () => { if (updatedZones.length > 0) { updatedZones.forEach(zone => { if (projectId) { + if (!socket?.active) { - // API + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zone); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zone, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zone, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); } }); diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx index a905dbc..01130fa 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx @@ -10,7 +10,7 @@ import { getUserData } from "../../../../../functions/getUserData"; import { useSceneContext } from "../../../sceneContext"; import { useVersionContext } from "../../../../builder/version/versionContext"; -// import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; +import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; const CopyPasteControls3D = () => { const { camera, controls, gl, scene, pointer, raycaster } = useThree(); @@ -481,20 +481,34 @@ const CopyPasteControls3D = () => { rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, eventData: eventData, versionId: selectedVersion?.versionId || '', userId, projectId }; - //REST + if (!socket?.active) { + // REST - // await setAssetsApi(data); + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + assetId: newFloorItem.assetId, + position: [position.x, 0, position.z], + rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z }, + isLocked: false, + isVisible: true, + eventData: eventData, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } const asset: Asset = { modelUuid: data.modelUuid, @@ -520,13 +534,32 @@ const CopyPasteControls3D = () => { rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId }; - socket.emit("v1:model-asset:add", data); + if (!socket?.active) { + // REST + + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + assetId: newFloorItem.assetId, + position: [position.x, 0, position.z], + rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { + + // SOCKET + + socket.emit("v1:model-asset:add", data); + } const asset: Asset = { modelUuid: data.modelUuid, diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx index 38a1622..ca37153 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx @@ -11,7 +11,7 @@ import { useSceneContext } from "../../../sceneContext"; import { useVersionContext } from "../../../../builder/version/versionContext"; import { handleAssetPositionSnap } from "./functions/handleAssetPositionSnap"; -// import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; +import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; const DuplicationControls3D = () => { const { camera, controls, gl, scene, pointer, raycaster } = useThree(); @@ -550,20 +550,34 @@ const DuplicationControls3D = () => { rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, eventData: eventData, versionId: selectedVersion?.versionId || '', userId, projectId }; - //REST + if (!socket?.active) { + // REST - // await setAssetsApi(data); + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + assetId: newFloorItem.assetId, + position: [position.x, position.y, position.z], + rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z }, + isLocked: false, + isVisible: true, + eventData: eventData, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } const asset: Asset = { modelUuid: data.modelUuid, @@ -589,14 +603,32 @@ const DuplicationControls3D = () => { rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId }; - socket.emit("v1:model-asset:add", data); + if (!socket?.active) { + // REST + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + assetId: newFloorItem.assetId, + position: [position.x, position.y, position.z], + rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { + + // SOCKET + + socket.emit("v1:model-asset:add", data); + } const asset: Asset = { modelUuid: data.modelUuid, modelName: data.modelName, diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx index 3d58d46..a142de5 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx @@ -14,7 +14,7 @@ import { useSceneContext } from "../../../sceneContext"; import { useVersionContext } from "../../../../builder/version/versionContext"; import useModuleStore from "../../../../../store/useModuleStore"; -// import { setAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; +import { setAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; function MoveControls3D({ boundingBoxRef }: any) { const { camera, controls, gl, scene, pointer, raycaster } = useThree(); @@ -420,19 +420,32 @@ function MoveControls3D({ boundingBoxRef }: any) { rotation: { x: movedAsset.rotation.x, y: movedAsset.rotation.y, z: movedAsset.rotation.z }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId }; - //REST + if (!socket?.active) { + // REST - // await setAssetsApi(data); + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + assetId: newFloorItem.assetId, + position: newFloorItem.position, + rotation: { x: movedAsset.rotation.x, y: movedAsset.rotation.y, z: movedAsset.rotation.z }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } }); diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx index cbedd62..a9b54f3 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx @@ -13,7 +13,7 @@ import { detectModifierKeys } from "../../../../../utils/shortcutkeys/detectModi import { handleAssetRotationSnap } from "./functions/handleAssetRotationSnap"; import useModuleStore from "../../../../../store/useModuleStore"; -// import { setAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; +import { setAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; function RotateControls3D() { const { camera, gl, scene, pointer, raycaster } = useThree(); @@ -364,19 +364,32 @@ function RotateControls3D() { rotation: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId }; - //REST + if (!socket?.active) { + // REST - // await setAssetsApi(data); + setAssetsApi({ + modelUuid: newFloorItem.modelUuid, + modelName: newFloorItem.modelName, + assetId: newFloorItem.assetId, + position: newFloorItem.position, + rotation: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } }); diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx index 014f766..4884acd 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx @@ -19,7 +19,7 @@ import RotateControls3D from "./rotateControls3D"; import TransformControls3D from "./transformControls3D"; import { useBuilderStore } from "../../../../../store/builder/useBuilderStore"; -// import { deleteFloorItem } from '../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi'; +import { deleteFloorItem } from '../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi'; const SelectionControls3D: React.FC = () => { const { camera, controls, gl, scene, raycaster, pointer } = useThree(); @@ -284,23 +284,28 @@ const SelectionControls3D: React.FC = () => { const asset = getAssetById(selectedMesh.userData.modelUuid); if (!asset) return; - //REST - // const response = deleteFloorItem(organization, selectedMesh.userData.modelUuid, selectedMesh.userData.modelName); + if (!socket?.active) { - //SOCKET + // REST - const data = { - organization, - modelUuid: selectedMesh.userData.modelUuid, - modelName: selectedMesh.userData.modelName, - socketId: socket.id, - projectId, - versionId: selectedVersion?.versionId || '', - userId - }; + deleteFloorItem(organization, selectedMesh.userData.modelUuid, selectedMesh.userData.modelName); + } else { - const response = socket.emit("v1:model-asset:delete", data); + // SOCKET + + const data = { + organization, + modelUuid: selectedMesh.userData.modelUuid, + modelName: selectedMesh.userData.modelName, + socketId: socket.id, + projectId, + versionId: selectedVersion?.versionId || '', + userId + }; + + socket.emit("v1:model-asset:delete", data); + } eventStore.getState().removeEvent(selectedMesh.uuid); const updatedEvents = productStore.getState().deleteEvent(selectedMesh.uuid); @@ -314,12 +319,9 @@ const SelectionControls3D: React.FC = () => { ); }) - if (response) { + removeAsset(selectedMesh.uuid); - removeAsset(selectedMesh.uuid); - - echo.success("Model Removed!"); - } + echo.success("Model Removed!"); selectedMesh.traverse((child: THREE.Object3D) => { if (child instanceof THREE.Mesh) { diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx index 5ff4476..05a883e 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx @@ -11,7 +11,7 @@ import { useParams } from 'react-router-dom'; import { getUserData } from '../../../../../functions/getUserData'; import { upsertProductOrEventApi } from '../../../../../services/simulation/products/UpsertProductOrEventApi'; import { detectModifierKeys } from '../../../../../utils/shortcutkeys/detectModifierKeys'; -// import { setAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; +import { setAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; function TransformControls3D() { const { toolMode } = useToolMode(); @@ -135,37 +135,42 @@ function TransformControls3D() { } } - //REST - // setAssetsApi( - // organization, - // asset.modelUuid, - // asset.modelName, - // [obj.position.x, 0, obj.position.z], - // { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z }, - // asset.assetId, - // false, - // true, - // ); + if (!socket?.active) { + // API - //SOCKET + setAssetsApi({ + modelUuid: asset.modelUuid, + modelName: asset.modelName, + assetId: asset.assetId, + position: [obj.position.x, obj.position.y, obj.position.z], + rotation: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - const data = { - organization, - modelUuid: asset.modelUuid, - modelName: asset.modelName, - assetId: asset.assetId, - position: [obj.position.x, obj.position.y, obj.position.z], - rotation: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z }, - isLocked: false, - isVisible: true, - socketId: socket.id, - versionId: selectedVersion?.versionId || '', - userId, - projectId - }; + // SOCKET - socket.emit("v1:model-asset:add", data); + const data = { + organization, + modelUuid: asset.modelUuid, + modelName: asset.modelName, + assetId: asset.assetId, + position: [obj.position.x, obj.position.y, obj.position.z], + rotation: { x: obj.rotation.x, y: obj.rotation.y, z: obj.rotation.z }, + isLocked: false, + isVisible: true, + socketId: socket.id, + versionId: selectedVersion?.versionId || '', + userId, + projectId + }; + + socket.emit("v1:model-asset:add", data); + } }); }, [selectedAssets, setSelectedAssets, getAssetById, updateAsset, eventStore, productStore, selectedProduct, updateBackend, projectId, organization, socket, selectedVersion, userId, push3D]); diff --git a/app/src/modules/scene/controls/transformControls/transformControls.tsx b/app/src/modules/scene/controls/transformControls/transformControls.tsx index 61f264e..7661bda 100644 --- a/app/src/modules/scene/controls/transformControls/transformControls.tsx +++ b/app/src/modules/scene/controls/transformControls/transformControls.tsx @@ -12,7 +12,7 @@ import { useBuilderStore } from "../../../../store/builder/useBuilderStore"; import { detectModifierKeys } from "../../../../utils/shortcutkeys/detectModifierKeys"; import { upsertProductOrEventApi } from "../../../../services/simulation/products/UpsertProductOrEventApi"; -// import { setAssetsApi } from "../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; +import { setAssetsApi } from "../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; export default function TransformControl() { const state = useThree(); @@ -110,37 +110,42 @@ export default function TransformControl() { rotation: [selectedFloorAsset.rotation.x, selectedFloorAsset.rotation.y, selectedFloorAsset.rotation.z] as [number, number, number], }); - //REST + if (!socket?.active) { - // await setAssetsApi( - // organization, - // asset.modelUuid, - // asset.modelName, - // [selectedFloorAsset.position.x, 0, selectedFloorAsset.position.z, - // { "x": selectedFloorAsset.rotation.x, "y": selectedFloorAsset.rotation.y, "z": selectedFloorAsset.rotation.z }, - // asset.assetId, - // false, - // true, - // ); + // API - //SOCKET + setAssetsApi({ + modelUuid: asset.modelUuid, + modelName: asset.modelName, + assetId: asset.assetId, + position: [selectedFloorAsset.position.x, 0, selectedFloorAsset.position.z] as [number, number, number], + rotation: { x: selectedFloorAsset.rotation.x, y: selectedFloorAsset.rotation.y, z: selectedFloorAsset.rotation.z }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - const data = { - organization, - modelUuid: asset.modelUuid, - modelName: asset.modelName, - assetId: asset.assetId, - position: [selectedFloorAsset.position.x, 0, selectedFloorAsset.position.z] as [number, number, number], - rotation: { x: selectedFloorAsset.rotation.x, y: selectedFloorAsset.rotation.y, z: selectedFloorAsset.rotation.z }, - isLocked: false, - isVisible: true, - socketId: socket.id, - versionId: selectedVersion?.versionId || '', - userId, - projectId - }; + // SOCKET - socket.emit("v1:model-asset:add", data); + const data = { + organization, + modelUuid: asset.modelUuid, + modelName: asset.modelName, + assetId: asset.assetId, + position: [selectedFloorAsset.position.x, 0, selectedFloorAsset.position.z] as [number, number, number], + rotation: { x: selectedFloorAsset.rotation.x, y: selectedFloorAsset.rotation.y, z: selectedFloorAsset.rotation.z }, + isLocked: false, + isVisible: true, + socketId: socket.id, + versionId: selectedVersion?.versionId || '', + userId, + projectId + }; + + socket.emit("v1:model-asset:add", data); + } push3D({ type: 'Scene', diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts index 12a0929..cdfa8a9 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts @@ -4,17 +4,17 @@ import { useVersionContext } from "../../../../builder/version/versionContext"; import { useSceneContext } from "../../../sceneContext"; import { useSocketStore } from "../../../../../store/builder/store"; -// import { upsertWallApi } from "../../../../../services/factoryBuilder/wall/upsertWallApi"; -// import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi"; +import { upsertWallApi } from "../../../../../services/factoryBuilder/wall/upsertWallApi"; +import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi"; -// import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; -// import { deleteZoneApi } from "../../../../../services/factoryBuilder/zone/deleteZoneApi"; +import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; +import { deleteZoneApi } from "../../../../../services/factoryBuilder/zone/deleteZoneApi"; -// import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; -// import { deleteFloorApi } from "../../../../../services/factoryBuilder/floor/deleteFloorApi"; +import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; +import { deleteFloorApi } from "../../../../../services/factoryBuilder/floor/deleteFloorApi"; -// import { upsertAisleApi } from "../../../../../services/factoryBuilder/aisle/upsertAisleApi"; -// import { deleteAisleApi } from "../../../../../services/factoryBuilder/aisle/deleteAisleApi"; +import { upsertAisleApi } from "../../../../../services/factoryBuilder/aisle/upsertAisleApi"; +import { deleteAisleApi } from "../../../../../services/factoryBuilder/aisle/deleteAisleApi"; function use2DRedoHandler() { const { undoRedo2DStore, wallStore, floorStore, zoneStore, aisleStore } = useSceneContext(); @@ -100,252 +100,288 @@ function use2DRedoHandler() { const createWallFromBackend = (wallData: Wall) => { addWall(wallData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', wallData); + upsertWallApi(projectId, selectedVersion?.versionId || '', wallData); + } else { - // SOCKET + // SOCKET - const data = { - wallData: wallData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: wallData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); } }; const removeWallFromBackend = (wallUuid: string) => { removeWall(wallUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteWallApi(projectId, selectedVersion?.versionId || '', wallUuid); + deleteWallApi(projectId, selectedVersion?.versionId || '', wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - wallUuid: wallUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallUuid: wallUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:delete', data); } - - socket.emit('v1:model-Wall:delete', data); } }; const updateWallFromBackend = (wallUuid: string, updatedData: Wall) => { updateWall(wallUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedData); + } else { - // SOCKET + // SOCKET - const data = { - wallData: updatedData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: updatedData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); } }; const createFloorFromBackend = (floorData: Floor) => { addFloor(floorData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floorData); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floorData); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floorData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floorData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }; const removeFloorFromBackend = (floorUuid: string) => { removeFloor(floorUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteFloorApi(projectId, selectedVersion?.versionId || '', floorUuid); + deleteFloorApi(projectId, selectedVersion?.versionId || '', floorUuid); + } else { - // SOCKET + // SOCKET - const data = { - floorUuid: floorUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorUuid: floorUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:delete', data); } - - socket.emit('v1:model-Floor:delete', data); } }; const updateFloorFromBackend = (floorUuid: string, updatedData: Floor) => { updateFloor(floorUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedData); + } else { - // SOCKET + // SOCKET - const data = { - floorData: updatedData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: updatedData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }; const createZoneFromBackend = (zoneData: Zone) => { addZone(zoneData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zoneData); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zoneData); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zoneData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zoneData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); } }; const removeZoneFromBackend = (zoneUuid: string) => { removeZone(zoneUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteZoneApi(projectId, selectedVersion?.versionId || '', zoneUuid); + deleteZoneApi(projectId, selectedVersion?.versionId || '', zoneUuid); + } else { - // SOCKET + // SOCKET - const data = { - zoneUuid, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + zoneUuid, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:zone:delete', data); + socket.emit('v1:zone:delete', data); + } } }; const updateZoneFromBackend = (zoneUuid: string, updatedData: Zone) => { updateZone(zoneUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedData); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: updatedData, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + zoneData: updatedData, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:zone:add', data); + socket.emit('v1:zone:add', data); + } } }; const createAisleFromBackend = (aisleData: Aisle) => { addAisle(aisleData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertAisleApi(projectId, selectedVersion?.versionId || '', aisleData); + upsertAisleApi(aisleData.aisleUuid, aisleData.points, aisleData.type, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - const data = { - ...aisleData, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + ...aisleData, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:model-aisle:add', data); + socket.emit('v1:model-aisle:add', data); + } } }; const removeAisleFromBackend = (aisleUuid: string) => { removeAisle(aisleUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteAisleApi(projectId, selectedVersion?.versionId || '', aisleUuid); + deleteAisleApi(projectId, selectedVersion?.versionId || '', aisleUuid); + } else { - // SOCKET + // SOCKET - const data = { - aisleUuid, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + aisleUuid, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:model-aisle:delete', data); + socket.emit('v1:model-aisle:delete', data); + } } }; const updateAisleFromBackend = (aisleUuid: string, updatedData: Aisle) => { updateAisle(aisleUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertAisleApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertAisleApi(updatedData.aisleUuid, updatedData.points, updatedData.type, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - const data = { - ...updatedData, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + ...updatedData, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:model-aisle:add', data); + socket.emit('v1:model-aisle:add', data); + } } }; diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts index 9f7ff60..16fb689 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts @@ -4,17 +4,17 @@ import { useVersionContext } from "../../../../builder/version/versionContext"; import { useSceneContext } from "../../../sceneContext"; import { useSocketStore } from "../../../../../store/builder/store"; -// import { upsertWallApi } from "../../../../../services/factoryBuilder/wall/upsertWallApi"; -// import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi"; +import { upsertWallApi } from "../../../../../services/factoryBuilder/wall/upsertWallApi"; +import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi"; -// import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; -// import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi"; +import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi"; +import { deleteZoneApi } from "../../../../../services/factoryBuilder/zone/deleteZoneApi"; -// import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; -// import { deleteFloorApi } from "../../../../../services/factoryBuilder/floor/deleteFloorApi"; +import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi"; +import { deleteFloorApi } from "../../../../../services/factoryBuilder/floor/deleteFloorApi"; -// import { upsertAisleApi } from "../../../../../services/factoryBuilder/aisle/upsertAisleApi"; -// import { deleteAisleApi } from "../../../../../services/factoryBuilder/aisle/deleteAisleApi"; +import { upsertAisleApi } from "../../../../../services/factoryBuilder/aisle/upsertAisleApi"; +import { deleteAisleApi } from "../../../../../services/factoryBuilder/aisle/deleteAisleApi"; function use2DUndoHandler() { const { undoRedo2DStore, wallStore, floorStore, zoneStore, aisleStore } = useSceneContext(); @@ -100,252 +100,288 @@ function use2DUndoHandler() { const createWallToBackend = (wallData: Wall) => { addWall(wallData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', wallData); + upsertWallApi(projectId, selectedVersion?.versionId || '', wallData); + } else { - // SOCKET + // SOCKET - const data = { - wallData: wallData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: wallData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); } }; const removeWallToBackend = (wallUuid: string) => { removeWall(wallUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteWallApi(projectId, selectedVersion?.versionId || '', wallUuid); + deleteWallApi(projectId, selectedVersion?.versionId || '', wallUuid); + } else { - // SOCKET + // SOCKET - const data = { - wallUuid: wallUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallUuid: wallUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:delete', data); } - - socket.emit('v1:model-Wall:delete', data); } }; const updateWallToBackend = (wallUuid: string, updatedData: Wall) => { updateWall(wallUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertWallApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertWallApi(projectId, selectedVersion?.versionId || '', updatedData); + } else { - // SOCKET + // SOCKET - const data = { - wallData: updatedData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + wallData: updatedData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Wall:add', data); } - - socket.emit('v1:model-Wall:add', data); } }; const createFloorToBackend = (floorData: Floor) => { addFloor(floorData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', floorData); + upsertFloorApi(projectId, selectedVersion?.versionId || '', floorData); + } else { - // SOCKET + // SOCKET - const data = { - floorData: floorData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: floorData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }; const removeFloorToBackend = (floorUuid: string) => { removeFloor(floorUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteFloorApi(projectId, selectedVersion?.versionId || '', floorUuid); + deleteFloorApi(projectId, selectedVersion?.versionId || '', floorUuid); + } else { - // SOCKET + // SOCKET - const data = { - floorUuid: floorUuid, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorUuid: floorUuid, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:delete', data); } - - socket.emit('v1:model-Floor:delete', data); } }; const updateFloorToBackend = (floorUuid: string, updatedData: Floor) => { updateFloor(floorUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedData); + } else { - // SOCKET + // SOCKET - const data = { - floorData: updatedData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + floorData: updatedData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:model-Floor:add', data); } - - socket.emit('v1:model-Floor:add', data); } }; const createZoneToBackend = (zoneData: Zone) => { addZone(zoneData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', zoneData); + upsertZoneApi(projectId, selectedVersion?.versionId || '', zoneData); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: zoneData, - projectId: projectId, - versionId: selectedVersion?.versionId || '', - userId: userId, - organization: organization + const data = { + zoneData: zoneData, + projectId: projectId, + versionId: selectedVersion?.versionId || '', + userId: userId, + organization: organization + } + + socket.emit('v1:zone:add', data); } - - socket.emit('v1:zone:add', data); } }; const removeZoneToBackend = (zoneUuid: string) => { removeZone(zoneUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteZoneApi(projectId, selectedVersion?.versionId || '', zoneUuid); + deleteZoneApi(projectId, selectedVersion?.versionId || '', zoneUuid); + } else { - // SOCKET + // SOCKET - const data = { - zoneUuid, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + zoneUuid, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:zone:delete', data); + socket.emit('v1:zone:delete', data); + } } }; const updateZoneToBackend = (zoneUuid: string, updatedData: Zone) => { updateZone(zoneUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedData); + } else { - // SOCKET + // SOCKET - const data = { - zoneData: updatedData, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + zoneData: updatedData, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:zone:add', data); + socket.emit('v1:zone:add', data); + } } }; const createAisleToBackend = (aisleData: Aisle) => { addAisle(aisleData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertAisleApi(projectId, selectedVersion?.versionId || '', aisleData); + upsertAisleApi(aisleData.aisleUuid, aisleData.points, aisleData.type, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - const data = { - ...aisleData, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + ...aisleData, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:model-aisle:add', data); + socket.emit('v1:model-aisle:add', data); + } } }; const removeAisleToBackend = (aisleUuid: string) => { removeAisle(aisleUuid); if (projectId) { - // API + if (!socket?.active) { + // API - // deleteAisleApi(projectId, selectedVersion?.versionId || '', aisleUuid); + deleteAisleApi(projectId, selectedVersion?.versionId || '', aisleUuid); + } else { - // SOCKET + // SOCKET - const data = { - aisleUuid, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + aisleUuid, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:model-aisle:delete', data); + socket.emit('v1:model-aisle:delete', data); + } } }; const updateAisleToBackend = (aisleUuid: string, updatedData: Aisle) => { updateAisle(aisleUuid, updatedData); if (projectId) { - // API + if (!socket?.active) { + // API - // upsertAisleApi(projectId, selectedVersion?.versionId || '', updatedData); + upsertAisleApi(updatedData.aisleUuid, updatedData.points, updatedData.type, projectId, selectedVersion?.versionId || ''); + } else { - // SOCKET + // SOCKET - const data = { - ...updatedData, - projectId, - versionId: selectedVersion?.versionId || '', - userId, - organization - }; + const data = { + ...updatedData, + projectId, + versionId: selectedVersion?.versionId || '', + userId, + organization + }; - socket.emit('v1:model-aisle:add', data); + socket.emit('v1:model-aisle:add', data); + } } }; diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts index b44f6a7..4ddf62e 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts @@ -7,8 +7,8 @@ import { useSocketStore } from "../../../../../store/builder/store"; import { upsertProductOrEventApi } from "../../../../../services/simulation/products/UpsertProductOrEventApi"; -// import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; -// import { deleteFloorItem } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi"; +import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; +import { deleteFloorItem } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi"; function use3DRedoHandler() { const { undoRedo3DStore, assetStore, productStore, eventStore } = useSceneContext(); @@ -138,7 +138,7 @@ function use3DRedoHandler() { isLocked: false, isVisible: true, eventData: {}, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId @@ -149,35 +149,52 @@ function use3DRedoHandler() { addEvent(assetData.eventData as EventsSchema); } - // API + if (!socket?.active) { + // REST - // setAssetsApi(data); + setAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + assetId: assetData.assetId, + position: assetData.position, + rotation: { x: assetData.rotation[0], y: assetData.rotation[1], z: assetData.rotation[2] }, + isLocked: false, + isVisible: true, + eventData: data.eventData, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } } const deleteAssetToBackend = (assetData: Asset) => { - //REST + if (!socket?.active) { + // REST - // const response = deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + } else { - //SOCKET + // SOCKET - const data = { - organization, - modelUuid: assetData.modelUuid, - modelName: assetData.modelName, - socketId: socket.id, - userId, - versionId: selectedVersion?.versionId || '', - projectId + const data = { + organization, + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + socketId: socket.id, + userId, + versionId: selectedVersion?.versionId || '', + projectId + } + + socket.emit('v1:model-asset:delete', data) } - const response = socket.emit('v1:model-asset:delete', data) - removeEvent(assetData.modelUuid); const updatedEvents = deleteEvent(assetData.modelUuid); @@ -190,10 +207,7 @@ function use3DRedoHandler() { ); }) - if (response) { - - removeAsset(assetData.modelUuid); - } + removeAsset(assetData.modelUuid); } const updateAssetToBackend = (modelUuid: string, updatedData: Asset) => { @@ -208,19 +222,32 @@ function use3DRedoHandler() { rotation: { x: updatedData.rotation[0], y: updatedData.rotation[1], z: updatedData.rotation[2] }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId }; - // API + if (!socket?.active) { + // REST - // setAssetsApi(data); + setAssetsApi({ + modelUuid: updatedData.modelUuid, + modelName: updatedData.modelName, + assetId: updatedData.assetId, + position: updatedData.position, + rotation: { x: updatedData.rotation[0], y: updatedData.rotation[1], z: updatedData.rotation[2] }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } } @@ -237,7 +264,7 @@ function use3DRedoHandler() { isLocked: false, isVisible: true, eventData: {}, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId @@ -248,13 +275,27 @@ function use3DRedoHandler() { addEvent(assetData.eventData as EventsSchema); } - // API + if (!socket?.active) { + // REST - // setAssetsApi(data); + setAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + assetId: assetData.assetId, + position: assetData.position, + rotation: { x: assetData.rotation[0], y: assetData.rotation[1], z: assetData.rotation[2] }, + isLocked: false, + isVisible: true, + eventData: data.eventData, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } } @@ -271,7 +312,7 @@ function use3DRedoHandler() { isLocked: false, isVisible: true, eventData: {}, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId @@ -282,13 +323,27 @@ function use3DRedoHandler() { addEvent(assetData.eventData as EventsSchema); } - // API + if (!socket?.active) { + //REST - // setAssetsApi(data); + setAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + assetId: assetData.assetId, + position: assetData.position, + rotation: { x: assetData.rotation[0], y: assetData.rotation[1], z: assetData.rotation[2] }, + isLocked: false, + isVisible: true, + eventData: data.eventData, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + //SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } } diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts index 50fd6cf..877dff6 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts @@ -7,8 +7,8 @@ import { useSocketStore } from "../../../../../store/builder/store"; import { upsertProductOrEventApi } from "../../../../../services/simulation/products/UpsertProductOrEventApi"; -// import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; -// import { deleteFloorItem } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi"; +import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; +import { deleteFloorItem } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi"; function use3DUndoHandler() { const { undoRedo3DStore, assetStore, productStore, eventStore } = useSceneContext(); @@ -137,7 +137,7 @@ function use3DUndoHandler() { isLocked: false, isVisible: true, eventData: {}, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId @@ -148,35 +148,52 @@ function use3DUndoHandler() { addEvent(assetData.eventData as EventsSchema); } - // API + if (!socket?.active) { + // REST - // setAssetsApi(data); + setAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + assetId: assetData.assetId, + position: assetData.position, + rotation: { x: assetData.rotation[0], y: assetData.rotation[1], z: assetData.rotation[2] }, + isLocked: false, + isVisible: true, + eventData: data.eventData, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } } const deleteAssetToBackend = (assetData: Asset) => { - //REST + if (!socket?.active) { + // REST - // const response = deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + } else { - //SOCKET + // SOCKET - const data = { - organization, - modelUuid: assetData.modelUuid, - modelName: assetData.modelName, - socketId: socket.id, - userId, - versionId: selectedVersion?.versionId || '', - projectId + const data = { + organization, + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + socketId: socket.id, + userId, + versionId: selectedVersion?.versionId || '', + projectId + } + + socket.emit('v1:model-asset:delete', data) } - const response = socket.emit('v1:model-asset:delete', data) - removeEvent(assetData.modelUuid); const updatedEvents = deleteEvent(assetData.modelUuid); @@ -189,10 +206,7 @@ function use3DUndoHandler() { ); }) - if (response) { - - removeAsset(assetData.modelUuid); - } + removeAsset(assetData.modelUuid); } const updateAssetToBackend = (modelUuid: string, updatedData: Asset) => { @@ -207,41 +221,57 @@ function use3DUndoHandler() { rotation: { x: updatedData.rotation[0], y: updatedData.rotation[1], z: updatedData.rotation[2] }, isLocked: false, isVisible: true, - socketId: socket.id, + socketId: socket?.id, versionId: selectedVersion?.versionId || '', projectId, userId }; - // API + if (!socket?.active) { + // REST - // setAssetsApi(data); + setAssetsApi({ + modelUuid: updatedData.modelUuid, + modelName: updatedData.modelName, + assetId: updatedData.assetId, + position: updatedData.position, + rotation: { x: updatedData.rotation[0], y: updatedData.rotation[1], z: updatedData.rotation[2] }, + isLocked: false, + isVisible: true, + versionId: selectedVersion?.versionId || '', + projectId: projectId, + }); + } else { - //SOCKET + // SOCKET - socket.emit("v1:model-asset:add", data); + socket.emit("v1:model-asset:add", data); + } } } const copyAssetToBackend = (assetData: Asset) => { - //REST + if (!socket?.active) { + // REST - // const response = deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + } else { - //SOCKET + // SOCKET - const data = { - organization, - modelUuid: assetData.modelUuid, - modelName: assetData.modelName, - socketId: socket.id, - userId, - versionId: selectedVersion?.versionId || '', - projectId + const data = { + organization, + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + socketId: socket.id, + userId, + versionId: selectedVersion?.versionId || '', + projectId + } + + socket.emit('v1:model-asset:delete', data) } - const response = socket.emit('v1:model-asset:delete', data) - removeEvent(assetData.modelUuid); const updatedEvents = deleteEvent(assetData.modelUuid); @@ -254,31 +284,31 @@ function use3DUndoHandler() { ); }) - if (response) { - - removeAsset(assetData.modelUuid); - } + removeAsset(assetData.modelUuid); } const duplicateAssetToBackend = (assetData: Asset) => { - //REST + if (!socket?.active) { + // REST - // const response = deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + } else { - //SOCKET + // SOCKET - const data = { - organization, - modelUuid: assetData.modelUuid, - modelName: assetData.modelName, - socketId: socket.id, - userId, - versionId: selectedVersion?.versionId || '', - projectId + const data = { + organization, + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + socketId: socket.id, + userId, + versionId: selectedVersion?.versionId || '', + projectId + } + + socket.emit('v1:model-asset:delete', data) } - const response = socket.emit('v1:model-asset:delete', data) - removeEvent(assetData.modelUuid); const updatedEvents = deleteEvent(assetData.modelUuid); @@ -291,10 +321,7 @@ function use3DUndoHandler() { ); }) - if (response) { - - removeAsset(assetData.modelUuid); - } + removeAsset(assetData.modelUuid); } const addWallAssetToBackend = (assetData: WallAsset) => { diff --git a/app/src/modules/scene/scene.tsx b/app/src/modules/scene/scene.tsx index 635edd2..9d154c4 100644 --- a/app/src/modules/scene/scene.tsx +++ b/app/src/modules/scene/scene.tsx @@ -34,11 +34,11 @@ export default function Scene({ layout }: { readonly layout: "Main Layout" | "Co useEffect(() => { if (!projectId || loadingProgress !== 0) return; getAllProjects(userId, organization).then((projects) => { - if (!projects || !projects.Projects) return; + if (!projects.Projects) return; let project = projects.Projects.find((val: any) => val.projectUuid === projectId || val._id === projectId); const canvas = document.getElementById("sceneCanvas")?.getElementsByTagName("canvas")[0]; if (!canvas) return; - compressImage((canvas as HTMLCanvasElement)?.toDataURL("image/png")).then((screenshotDataUrl) => { + compressImage(canvas.toDataURL("image/png")).then((screenshotDataUrl) => { const updateProjects = { projectId: project?._id, organization, diff --git a/app/src/pages/Dashboard.tsx b/app/src/pages/Dashboard.tsx index 606765c..a328f9a 100644 --- a/app/src/pages/Dashboard.tsx +++ b/app/src/pages/Dashboard.tsx @@ -17,7 +17,7 @@ const Dashboard: React.FC = () => { useEffect(() => { const token = localStorage.getItem("token"); const refreshToken = localStorage.getItem("refreshToken") - if (token) { + if (token && refreshToken) { useSocketStore.getState().initializeSocket(email, organization, token, refreshToken); } else { diff --git a/app/src/pages/Project.tsx b/app/src/pages/Project.tsx index f3f369a..ab47701 100644 --- a/app/src/pages/Project.tsx +++ b/app/src/pages/Project.tsx @@ -102,7 +102,7 @@ const Project: React.FC = () => { const token = localStorage.getItem("token"); const refreshToken = localStorage.getItem("refreshToken"); echo.warn('Validating token'); - if (token) { + if (token && refreshToken) { useSocketStore .getState() .initializeSocket(email, organization, token, refreshToken); diff --git a/app/src/store/builder/store.ts b/app/src/store/builder/store.ts index d35ae36..d4ef56e 100644 --- a/app/src/store/builder/store.ts +++ b/app/src/store/builder/store.ts @@ -1,10 +1,28 @@ -import { Object3D } from "three"; import { create } from "zustand"; import { io } from "socket.io-client"; import * as CONSTANTS from "../../types/world/worldConstants"; -export const useSocketStore = create((set: any, get: any) => ({ +type SocketStore = { + socket: ReturnType | null; + visualizationSocket?: ReturnType | null; + dashBoardSocket?: ReturnType | null; + projectSocket?: ReturnType | null; + threadSocket?: ReturnType | null; + initializeSocket: ( + email?: string, + organization?: string, + token?: string, + refreshToken?: string + ) => void; + disconnectSocket: () => void; +}; + +export const useSocketStore = create((set, get) => ({ socket: null, + visualizationSocket: null, + dashBoardSocket: null, + projectSocket: null, + threadSocket: null, initializeSocket: ( email?: string, organization?: string, @@ -63,13 +81,19 @@ export const useSocketStore = create((set: any, get: any) => ({ }); }, 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, + }; }); }, })); From 0ac2bde6d3f603242fe077d674f3ef71ce24867a Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 09:16:41 +0530 Subject: [PATCH 02/17] code optimization --- .../scene/postProcessing/postProcessing.tsx | 11 +++-- app/src/pages/Dashboard.tsx | 44 +++++++++---------- app/src/store/builder/store.ts | 1 - 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/src/modules/scene/postProcessing/postProcessing.tsx b/app/src/modules/scene/postProcessing/postProcessing.tsx index 6f6cde8..0f307de 100644 --- a/app/src/modules/scene/postProcessing/postProcessing.tsx +++ b/app/src/modules/scene/postProcessing/postProcessing.tsx @@ -1,10 +1,15 @@ -import { DepthOfField, Bloom, EffectComposer, N8AO } from "@react-three/postprocessing"; +import { EffectComposer, N8AO } from "@react-three/postprocessing"; import OutlineInstances from "./outlineInstances/outlineInstances"; import { useDeletableEventSphere, useSelectedEventSphere } from "../../../store/simulation/useSimulationStore"; +import { useEffect } from "react"; export default function PostProcessing() { - const { } = useSelectedEventSphere(); - const { } = useDeletableEventSphere(); + const { selectedEventSphere } = useSelectedEventSphere(); + const { deletableEventSphere } = useDeletableEventSphere(); + + useEffect(() => { + + }, [selectedEventSphere, deletableEventSphere]) return ( diff --git a/app/src/pages/Dashboard.tsx b/app/src/pages/Dashboard.tsx index 606765c..c464be5 100644 --- a/app/src/pages/Dashboard.tsx +++ b/app/src/pages/Dashboard.tsx @@ -1,7 +1,5 @@ import React, { useEffect, useState } from "react"; -import { - useSocketStore -} from "../store/builder/store"; +import { useSocketStore } from "../store/builder/store"; import DashboardHome from "../components/Dashboard/DashboardHome"; import DashboardProjects from "../components/Dashboard/DashboardProjects"; import DashboardTrash from "../components/Dashboard/DashboardTrash"; @@ -10,29 +8,27 @@ import SidePannel from "../components/Dashboard/SidePannel"; import DashboardTutorial from "../components/Dashboard/DashboardTutorial"; const Dashboard: React.FC = () => { - const [activeTab, setActiveTab] = useState("Home"); - const { socket } = useSocketStore(); - const { organization, email } = getUserData(); + const [activeTab, setActiveTab] = useState("Home"); + const { socket } = useSocketStore(); + const { organization, email } = getUserData(); - useEffect(() => { - const token = localStorage.getItem("token"); - const refreshToken = localStorage.getItem("refreshToken") - if (token) { - useSocketStore.getState().initializeSocket(email, organization, token, refreshToken); - } else { + useEffect(() => { + const token = localStorage.getItem("token"); + const refreshToken = localStorage.getItem("refreshToken") + if (token) { + useSocketStore.getState().initializeSocket(email, organization, token, refreshToken); + } + }, [socket, email, organization]); - } - }, [socket]); - - return ( -
- - {activeTab == "Home" && } - {activeTab == "Projects" && } - {activeTab == "Trash" && } - {activeTab == "Tutorials" && } -
- ); + return ( +
+ + {activeTab === "Home" && } + {activeTab === "Projects" && } + {activeTab === "Trash" && } + {activeTab === "Tutorials" && } +
+ ); }; export default Dashboard; diff --git a/app/src/store/builder/store.ts b/app/src/store/builder/store.ts index d35ae36..c2c9648 100644 --- a/app/src/store/builder/store.ts +++ b/app/src/store/builder/store.ts @@ -1,4 +1,3 @@ -import { Object3D } from "three"; import { create } from "zustand"; import { io } from "socket.io-client"; import * as CONSTANTS from "../../types/world/worldConstants"; From ae4fd2ff01007dc54445f1b215ec840013d35cd3 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 09:46:27 +0530 Subject: [PATCH 03/17] store optimization --- .../layout/sidebarLeft/assetList/Assets.tsx | 21 +++-- .../assetsHelpers/filteredAssetsHelper.ts | 6 +- .../assetsHelpers/renderAssetHelper.tsx | 5 +- .../Decal/decalCreator/decalCreator.tsx | 5 +- .../transformControls/transformControls.tsx | 4 +- app/src/pages/Project.tsx | 8 -- app/src/pages/UserAuth.tsx | 16 ++-- app/src/store/builder/store.ts | 83 ++----------------- app/src/store/builder/useBuilderStore.ts | 23 +++++ 9 files changed, 58 insertions(+), 113 deletions(-) diff --git a/app/src/components/layout/sidebarLeft/assetList/Assets.tsx b/app/src/components/layout/sidebarLeft/assetList/Assets.tsx index 5294be5..72c1207 100644 --- a/app/src/components/layout/sidebarLeft/assetList/Assets.tsx +++ b/app/src/components/layout/sidebarLeft/assetList/Assets.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useMemo, useCallback } from "react"; -import { useDecalStore } from "../../../../store/builder/store"; import { getFilteredAssets } from "./assetsHelpers/filteredAssetsHelper"; import { fetchCategoryDecals } from "./assetsHelpers/fetchDecalsHelper"; +import { useBuilderStore } from "../../../../store/builder/useBuilderStore"; import { fetchAllAssets, fetchCategoryAssets, @@ -16,7 +16,7 @@ import { import { ArrowIcon } from "../../../icons/ExportCommonIcons"; const Assets: React.FC = () => { - const { selectedSubCategory, setSelectedSubCategory } = useDecalStore(); + const { selectedDecalCategory, setSelectedDecalCategory } = useBuilderStore(); const [searchValue, setSearchValue] = useState(null); const [selectedCategory, setSelectedCategory] = useState(null); const [assets, setAssets] = useState([]); @@ -31,9 +31,9 @@ const Assets: React.FC = () => { assets, searchValue, selectedCategory, - selectedSubCategory, + selectedDecalCategory, }), - [assets, searchValue, selectedCategory, selectedSubCategory] + [assets, searchValue, selectedCategory, selectedDecalCategory] ); const handleFetchCategory = useCallback( @@ -43,14 +43,14 @@ const Assets: React.FC = () => { if (category === "Decals") { const res = await fetchCategoryDecals("Safety"); setAssets(res); - setSelectedSubCategory("Safety"); + setSelectedDecalCategory("Safety"); } else { const res = await fetchCategoryAssets(category); setAssets(res); } setIsLoading(false); }, - [setSelectedSubCategory] + [setSelectedDecalCategory] ); const fetchGlobalSearch = useCallback(async (term: string) => { @@ -90,7 +90,7 @@ const Assets: React.FC = () => { className="back-button" onClick={() => { setSelectedCategory(null); - setSelectedSubCategory(null); + setSelectedDecalCategory(null); setAssets([]); setSearchValue(null); }} @@ -106,14 +106,13 @@ const Assets: React.FC = () => { {ACTIVE_DECAL_SUBCATEGORIES.map((cat) => (
{ setIsLoading(true); const res = await fetchCategoryDecals(cat.name); setAssets(res); - setSelectedSubCategory(cat.name); + setSelectedDecalCategory(cat.name); setIsLoading(false); }} > diff --git a/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/filteredAssetsHelper.ts b/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/filteredAssetsHelper.ts index 38d2b39..1ced2e2 100644 --- a/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/filteredAssetsHelper.ts +++ b/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/filteredAssetsHelper.ts @@ -2,19 +2,19 @@ interface FilterProps { assets: AssetProp[] | DecalProp[]; searchValue: string | null; selectedCategory: string | null; - selectedSubCategory: string | null; + selectedDecalCategory: string | null; } export const getFilteredAssets = ({ assets, searchValue, selectedCategory, - selectedSubCategory, + selectedDecalCategory, }: FilterProps) => { const term = searchValue?.trim().toLowerCase(); if (!term) return assets; - if (selectedCategory === "Decals" || selectedSubCategory) { + if (selectedCategory === "Decals" || selectedDecalCategory) { return (assets as DecalProp[]).filter((a) => a.decalName?.toLowerCase().includes(term) ); diff --git a/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/renderAssetHelper.tsx b/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/renderAssetHelper.tsx index bd553c1..9a3cf95 100644 --- a/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/renderAssetHelper.tsx +++ b/app/src/components/layout/sidebarLeft/assetList/assetsHelpers/renderAssetHelper.tsx @@ -1,9 +1,10 @@ import React from "react"; -import { useDroppedDecal, useSelectedItem } from "../../../../../store/builder/store"; +import { useSelectedItem } from "../../../../../store/builder/store"; +import { useBuilderStore } from "../../../../../store/builder/useBuilderStore"; export const RenderAsset: React.FC<{ asset: AssetProp | DecalProp; index: number }> = ({ asset, index }) => { const { setSelectedItem } = useSelectedItem(); - const { setDroppedDecal } = useDroppedDecal(); + const { setDroppedDecal } = useBuilderStore(); if ("decalName" in asset) { return ( diff --git a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx index 16721d3..3ea4005 100644 --- a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx +++ b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx @@ -2,7 +2,8 @@ import { MathUtils } from 'three'; import { useEffect } from 'react'; import { useThree } from '@react-three/fiber'; import { useParams } from 'react-router-dom'; -import { useDroppedDecal, useSocketStore } from '../../../../store/builder/store'; +import { useSocketStore } from '../../../../store/builder/store'; +import { useBuilderStore } from '../../../../store/builder/useBuilderStore'; import useModuleStore from '../../../../store/useModuleStore'; import { useSceneContext } from '../../../scene/sceneContext'; import { useVersionContext } from '../../version/versionContext'; @@ -16,7 +17,7 @@ function DecalCreator() { const { wallStore, floorStore } = useSceneContext(); const { addDecal: addDecalOnWall, getWallById } = wallStore(); const { addDecal: addDecalOnFloor, getFloorById } = floorStore(); - const { droppedDecal, setDroppedDecal } = useDroppedDecal(); + const { droppedDecal, setDroppedDecal } = useBuilderStore(); const { activeModule } = useModuleStore(); const { userId, organization } = getUserData(); const { selectedVersionStore } = useVersionContext(); diff --git a/app/src/modules/scene/controls/transformControls/transformControls.tsx b/app/src/modules/scene/controls/transformControls/transformControls.tsx index 61f264e..b71cac4 100644 --- a/app/src/modules/scene/controls/transformControls/transformControls.tsx +++ b/app/src/modules/scene/controls/transformControls/transformControls.tsx @@ -196,7 +196,7 @@ export default function TransformControl() { return () => { window.removeEventListener("keydown", handleKeyDown); }; - }, [selectedFloorAsset]); + }, [selectedFloorAsset, setObjectPosition, setObjectRotation]); useEffect(() => { if (activeTool === "delete") { @@ -208,7 +208,7 @@ export default function TransformControl() { setObjectPosition({ x: undefined, y: undefined, z: undefined }); setObjectRotation({ x: undefined, y: undefined, z: undefined }); } - }, [activeTool]); + }, [activeTool, setObjectPosition, setObjectRotation, setSelectedFloorAsset, state.controls]); return ( <> diff --git a/app/src/pages/Project.tsx b/app/src/pages/Project.tsx index f3f369a..5013884 100644 --- a/app/src/pages/Project.tsx +++ b/app/src/pages/Project.tsx @@ -2,8 +2,6 @@ import React, { useEffect } from "react"; import useModuleStore from "../store/useModuleStore"; import { useSocketStore, - useOrganization, - useUserName, useProjectName, useActiveTool, } from "../store/builder/store"; @@ -29,8 +27,6 @@ const Project: React.FC = () => { let navigate = useNavigate(); const echo = useLogger(); const { setActiveModule } = useModuleStore(); - const { setUserName } = useUserName(); - const { setOrganization } = useOrganization(); const { projectId } = useParams(); const { setProjectName } = useProjectName(); const { userId, email, organization, userName } = getUserData(); @@ -107,10 +103,6 @@ const Project: React.FC = () => { .getState() .initializeSocket(email, organization, token, refreshToken); } - if (organization && userName) { - setOrganization(organization); - setUserName(userName); - } echo.success("Project initialized and loaded successfully"); } else { navigate("/"); diff --git a/app/src/pages/UserAuth.tsx b/app/src/pages/UserAuth.tsx index 4db2358..3fec867 100644 --- a/app/src/pages/UserAuth.tsx +++ b/app/src/pages/UserAuth.tsx @@ -4,8 +4,6 @@ import { LogoIconLarge } from "../components/icons/Logo"; import { EyeIcon } from "../components/icons/ExportCommonIcons"; import { useLoadingProgress, - useOrganization, - useUserName, } from "../store/builder/store"; import { signInApi } from "../services/factoryBuilder/signInSignUp/signInApi"; import { signUpApi } from "../services/factoryBuilder/signInSignUp/signUpApi"; @@ -19,8 +17,8 @@ const UserAuth: React.FC = () => { const [showPassword, setShowPassword] = useState(false); const [error, setError] = useState(""); const [isSignIn, setIsSignIn] = useState(true); - const { userName, setUserName } = useUserName(); - const { setOrganization } = useOrganization(); + const { userName } = getUserData(); + const [name, setName] = useState(userName || ''); const { setLoadingProgress } = useLoadingProgress(); const [fingerprint, setFingerprint] = useState(""); @@ -43,8 +41,6 @@ const UserAuth: React.FC = () => { const res = await signInApi(email, password, organization, fingerprint); if (res.message.message === "login successfull") { setError(""); - setOrganization(organization); - setUserName(res.message.name); localStorage.setItem("userId", res.message.userId); localStorage.setItem("email", res.message.email); localStorage.setItem("userName", res.message.name); @@ -113,11 +109,11 @@ const UserAuth: React.FC = () => { const handleRegister = async (e: FormEvent) => { e.preventDefault(); - if (email && password && userName) { + if (email && password && name) { setError(""); try { const organization = email.split("@")[1].split(".")[0]; - const res = await signUpApi(userName, email, password, organization); + const res = await signUpApi(name, email, password, organization); if (res.message === "New User created") { setIsSignIn(true); @@ -178,9 +174,9 @@ const UserAuth: React.FC = () => { {!isSignIn && ( setUserName(e.target.value)} + onChange={(e) => setName(e.target.value)} required /> )} diff --git a/app/src/store/builder/store.ts b/app/src/store/builder/store.ts index c2c9648..0346f42 100644 --- a/app/src/store/builder/store.ts +++ b/app/src/store/builder/store.ts @@ -81,11 +81,6 @@ export const useLoadingProgress = create<{ setLoadingProgress: (x: number) => set({ loadingProgress: x }), })); -export const useOrganization = create((set: any) => ({ - organization: "", - setOrganization: (x: any) => set(() => ({ organization: x })), -})); - export const useToggleView = create((set: any) => ({ toggleView: false, setToggleView: (x: any) => set(() => ({ toggleView: x })), @@ -107,51 +102,16 @@ export const useSelectedItem = create((set: any) => ({ setSelectedItem: (x: any) => set(() => ({ selectedItem: x })), })); -type DroppedDecalType = { - category: string; - decalName: string; - decalImage: string; - decalId: string; -}; - -export const useDroppedDecal = create<{ - droppedDecal: DroppedDecalType | null; - setDroppedDecal: (x: DroppedDecalType | null) => void; -}>((set) => ({ - droppedDecal: null, - setDroppedDecal: (x) => set({ droppedDecal: x }), -})); - export const useNavMesh = create((set: any) => ({ navMesh: null, setNavMesh: (x: any) => set({ navMesh: x }), })); -export const useLayers = create((set: any) => ({ - Layers: 1, - setLayers: (x: any) => set(() => ({ Layers: x })), -})); - -export const useCamPosition = create((set: any) => ({ - camPosition: { x: undefined, y: undefined, z: undefined }, - setCamPosition: (newCamPosition: any) => set({ camPosition: newCamPosition }), -})); - -export const useMenuVisible = create((set: any) => ({ - menuVisible: false, - setMenuVisible: (x: any) => set(() => ({ menuVisible: x })), -})); - export const useToolMode = create((set: any) => ({ toolMode: null, setToolMode: (x: any) => set(() => ({ toolMode: x })), })); -export const useSetScale = create((set: any) => ({ - scale: null, - setScale: (x: any) => set(() => ({ scale: x })), -})); - export const useRoofVisibility = create((set: any) => ({ roofVisibility: false, setRoofVisibility: (x: any) => set(() => ({ roofVisibility: x })), @@ -173,16 +133,6 @@ export const useSunPosition = create((set: any) => ({ set({ sunPosition: newSuntPosition }), })); -export const useRemoveLayer = create((set: any) => ({ - removeLayer: false, - setRemoveLayer: (x: any) => set(() => ({ removeLayer: x })), -})); - -export const useRemovedLayer = create((set: any) => ({ - removedLayer: null, - setRemovedLayer: (x: any) => set(() => ({ removedLayer: x })), -})); - export const useProjectName = create((set: any) => ({ projectName: "Creating Your Project", setProjectName: (x: any) => set({ projectName: x }), @@ -233,11 +183,6 @@ export const useCamMode = create((set: any) => ({ setCamMode: (x: any) => set({ camMode: x }), })); -export const useUserName = create((set: any) => ({ - userName: "", - setUserName: (x: any) => set({ userName: x }), -})); - export const useRenameModeStore = create((set: any) => ({ isRenameMode: false, setIsRenameMode: (state: boolean) => set({ isRenameMode: state }), @@ -345,12 +290,6 @@ export const useTileDistance = create((set: any) => ({ })), })); -export const usePlayAgv = create((set, get) => ({ - PlayAgv: [], - setPlayAgv: (updateFn: (prev: any[]) => any[]) => - set({ PlayAgv: updateFn(get().PlayAgv) }), -})); - // Define the Asset type type Asset = { id: string; @@ -411,14 +350,17 @@ export const useMachineCount = create((set: any) => ({ machineCount: 0, setMachineCount: (x: any) => set({ machineCount: x }), })); + export const useMachineUptime = create((set: any) => ({ machineActiveTime: 0, setMachineActiveTime: (x: any) => set({ machineActiveTime: x }), })); + export const useMachineDowntime = create((set: any) => ({ machineIdleTime: 0, setMachineIdleTime: (x: any) => set({ machineIdleTime: x }), })); + export const useMaterialCycle = create((set: any) => ({ materialCycleTime: 0, setMaterialCycleTime: (x: any) => set({ materialCycleTime: x }), @@ -428,6 +370,7 @@ export const useThroughPutData = create((set: any) => ({ throughputData: 0, setThroughputData: (x: any) => set({ throughputData: x }), })); + export const useProductionCapacityData = create((set: any) => ({ productionCapacityData: 0, setProductionCapacityData: (x: any) => set({ productionCapacityData: x }), @@ -437,6 +380,7 @@ export const useProcessBar = create((set: any) => ({ processBar: [], setProcessBar: (x: any) => set({ processBar: x }), })); + export const useDfxUpload = create((set: any) => ({ dfxuploaded: [], dfxWallGenerate: [], @@ -541,6 +485,7 @@ function getInitialViewSceneLabels(): boolean { const saved = localStorage.getItem("viewSceneLabels"); return saved ? JSON.parse(saved) : false; } + export interface CompareProduct { productUuid: string; productName: string; @@ -579,6 +524,7 @@ export const useSelectedComment = create((set: any) => ({ commentPositionState: null, setCommentPositionState: (x: any) => set({ commentPositionState: x }), })); + export const useSelectedPath = create((set: any) => ({ selectedPath: "auto", setSelectedPath: (x: any) => set({ selectedPath: x }), @@ -587,17 +533,4 @@ export const useSelectedPath = create((set: any) => ({ export const useContextActionStore = create((set: any) => ({ contextAction: null, setContextAction: (x: any) => set({ contextAction: x }), -})); - - -// Define the store's state and actions type -interface DecalStore { - selectedSubCategory: string | null; - setSelectedSubCategory: (subCategory: string | null) => void; -} - -// Create the Zustand store with types -export const useDecalStore = create((set) => ({ - selectedSubCategory: 'Safety', - setSelectedSubCategory: (subCategory: string | null) => set({ selectedSubCategory: subCategory }), -})); +})); \ No newline at end of file diff --git a/app/src/store/builder/useBuilderStore.ts b/app/src/store/builder/useBuilderStore.ts index 5e36d58..01411b0 100644 --- a/app/src/store/builder/useBuilderStore.ts +++ b/app/src/store/builder/useBuilderStore.ts @@ -46,6 +46,13 @@ interface BuilderState { draggingDecalUuid: string | null, dragOffset: Vector3 | null, }, + selectedDecalCategory: string | null, + droppedDecal: { + category: string; + decalName: string; + decalImage: string; + decalId: string; + } | null, // Aisle General selectedAisle: { aisleMesh: Object3D | null, aisleData: Aisle } | null; @@ -97,6 +104,8 @@ interface BuilderState { setSelectedDecal: (decal: { decalMesh: Object3D | null, decalData: Decal } | null) => void; setDeletableDecal: (decal: Object3D | null) => void; setDecalDragState: (isDragging: boolean, draggingDecalUuid: string | null, dragOffset: Vector3 | null) => void; + setSelectedDecalCategory: (subCategory: string | null) => void, + setDroppedDecal: (droppedDecal: { category: string, decalName: string, decalImage: string, decalId: string } | null) => void, // Setters - Aisle General setSelectedAisle: (aisle: { aisleMesh: Object3D | null, aisleData: Aisle } | null) => void; @@ -157,6 +166,8 @@ export const useBuilderStore = create()( draggingDecalUuid: null, dragOffset: null, }, + selectedDecalCategory: 'Safety', + droppedDecal: null, selectedAisle: null, aisleType: 'solid-aisle', @@ -332,6 +343,18 @@ export const useBuilderStore = create()( }) }, + setSelectedDecalCategory: (subCategory: string | null) => { + set((state) => { + state.selectedDecalCategory = subCategory; + }) + }, + + setDroppedDecal: (droppedDecal: { category: string, decalName: string, decalImage: string, decalId: string } | null) => { + set((state) => { + state.droppedDecal = droppedDecal; + }) + }, + // === Setters: Aisle General === setSelectedAisle: (aisle: { aisleMesh: Object3D | null, aisleData: Aisle } | null) => { From a3b2d258cf960caacf7abdf3e1c24255e3d913ee Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 10:48:58 +0530 Subject: [PATCH 04/17] socket and api integerated successfully --- .../properties/SelectedAisleProperties.tsx | 2 +- .../properties/SelectedDecalProperties.tsx | 4 +- .../properties/SelectedFloorProperties.tsx | 8 +- .../properties/SelectedWallProperties.tsx | 6 +- .../versionHisory/VersionSaved.tsx | 18 ++--- .../Decal/decalCreator/decalCreator.tsx | 4 +- .../eventHandler/useDecalEventHandlers.ts | 8 +- .../aisle/aisleCreator/aisleCreator.tsx | 2 +- .../builder/asset/functions/addAssetModel.ts | 4 +- .../model/eventHandlers/useEventHandlers.ts | 2 +- app/src/modules/builder/dfx/LoadBlueprint.tsx | 2 +- .../floor/floorCreator/floorCreator.tsx | 6 +- app/src/modules/builder/line/line.tsx | 20 ++--- app/src/modules/builder/point/point.tsx | 24 +++--- .../builder/wall/wallCreator/wallCreator.tsx | 14 ++-- .../Instances/Instance/wallAssetInstance.tsx | 6 +- .../builder/wallAsset/wallAssetCreator.tsx | 2 +- .../builder/zone/zoneCreator/zoneCreator.tsx | 6 +- .../camera/functions/updateCameraPosition.ts | 51 +++++++----- app/src/modules/scene/camera/switchView.tsx | 4 +- app/src/modules/scene/controls/controls.tsx | 38 +++++---- .../selection2D/moveControls2D.tsx | 10 +-- .../selection2D/selectionControls2D.tsx | 14 ++-- .../selection3D/copyPasteControls3D.tsx | 4 +- .../selection3D/duplicationControls3D.tsx | 5 +- .../selection3D/moveControls3D.tsx | 2 +- .../selection3D/rotateControls3D.tsx | 2 +- .../selection3D/selectionControls3D.tsx | 2 +- .../selection3D/transformControls3D.tsx | 2 +- .../transformControls/transformControls.tsx | 2 +- .../handlers/use2DRedoHandler.ts | 24 +++--- .../handlers/use2DUndoHandler.ts | 24 +++--- .../handlers/use3DRedoHandler.ts | 10 +-- .../handlers/use3DUndoHandler.ts | 10 +-- .../factoryBuilder/camera/getCameraApi.ts | 2 +- .../factoryBuilder/camera/setCameraApi.ts | 77 +++++++++---------- 36 files changed, 221 insertions(+), 200 deletions(-) diff --git a/app/src/components/layout/sidebarRight/properties/SelectedAisleProperties.tsx b/app/src/components/layout/sidebarRight/properties/SelectedAisleProperties.tsx index d51f6ce..e4e993f 100644 --- a/app/src/components/layout/sidebarRight/properties/SelectedAisleProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/SelectedAisleProperties.tsx @@ -46,7 +46,7 @@ const SelectedAisleProperties: React.FC = () => { const updateBackend = (updatedAisle: Aisle) => { if (updatedAisle && projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/components/layout/sidebarRight/properties/SelectedDecalProperties.tsx b/app/src/components/layout/sidebarRight/properties/SelectedDecalProperties.tsx index 0abea6d..196b793 100644 --- a/app/src/components/layout/sidebarRight/properties/SelectedDecalProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/SelectedDecalProperties.tsx @@ -24,7 +24,7 @@ const SelectedDecalProperties = () => { const updateBackend = (updatedData: Wall | Floor) => { if ('wallUuid' in updatedData) { if (projectId && updatedData) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', updatedData); @@ -45,7 +45,7 @@ const SelectedDecalProperties = () => { } } else if ('floorUuid' in updatedData) { if (projectId && updatedData) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedData); diff --git a/app/src/components/layout/sidebarRight/properties/SelectedFloorProperties.tsx b/app/src/components/layout/sidebarRight/properties/SelectedFloorProperties.tsx index 40a84be..bcb51a1 100644 --- a/app/src/components/layout/sidebarRight/properties/SelectedFloorProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/SelectedFloorProperties.tsx @@ -43,7 +43,7 @@ const SelectedFloorProperties = () => { if (!isNaN(parsed) && floor) { const updatedFloor = updateFloor(floor.floorUuid, { floorDepth: parsed }); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -72,7 +72,7 @@ const SelectedFloorProperties = () => { if (!isNaN(parsed) && floor) { const updatedFloor = updateFloor(floor.floorUuid, { bevelStrength: parsed }); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -100,7 +100,7 @@ const SelectedFloorProperties = () => { if (!floor) return; const updatedFloor = updateFloor(floor.floorUuid, { isBeveled: !floor.isBeveled }); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -128,7 +128,7 @@ const SelectedFloorProperties = () => { const key = activeSurface === "top" ? "topMaterial" : "sideMaterial"; const updatedFloor = updateFloor(floor.floorUuid, { [key]: material.textureId }); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/components/layout/sidebarRight/properties/SelectedWallProperties.tsx b/app/src/components/layout/sidebarRight/properties/SelectedWallProperties.tsx index 020bbe3..c26265a 100644 --- a/app/src/components/layout/sidebarRight/properties/SelectedWallProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/SelectedWallProperties.tsx @@ -47,7 +47,7 @@ const SelectedWallProperties = () => { if (!isNaN(height) && wall) { const updatedWall = updateWall(wall.wallUuid, { wallHeight: height }); if (updatedWall && projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -76,7 +76,7 @@ const SelectedWallProperties = () => { if (!isNaN(thickness) && wall) { const updatedWall = updateWall(wall.wallUuid, { wallThickness: thickness }); if (updatedWall && projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -105,7 +105,7 @@ const SelectedWallProperties = () => { const updated = (activeSide === "side1" ? { insideMaterial: material.textureId } : { outsideMaterial: material.textureId }) const updatedWall = updateWall(wall.wallUuid, updated); if (updatedWall && projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx b/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx index 44e32df..fb60ecc 100644 --- a/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx +++ b/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx @@ -11,9 +11,9 @@ import { getUserData } from "../../../../functions/getUserData"; import { useVersionContext } from "../../../../modules/builder/version/versionContext"; const VersionSaved = () => { - const { versionHistory, addVersion, createNewVersion, setCreateNewVersion } = useVersionHistoryStore(); + const { addVersion, createNewVersion, setCreateNewVersion } = useVersionHistoryStore(); const { selectedVersionStore } = useVersionContext(); - const { setSelectedVersion } = selectedVersionStore(); + const { selectedVersion, setSelectedVersion } = selectedVersionStore(); const [newName, setNewName] = useState(new Date().toLocaleString("en-US", { month: "short", day: "numeric", @@ -26,8 +26,6 @@ const VersionSaved = () => { const { projectId } = useParams(); const { userId } = getUserData(); - const latestVersion = versionHistory?.[0]; - useEffect(() => { if (createNewVersion) { const defaultName = new Date().toLocaleString("en-US", { @@ -43,12 +41,12 @@ const VersionSaved = () => { }, [createNewVersion]); const handleSave = () => { - if (!latestVersion || !projectId) return; + if (!selectedVersion || !projectId) return; - const updatedName = (newName.trim() || latestVersion.versionName) ?? latestVersion.timeStamp; - const updatedDescription = (description.trim() || latestVersion.versionName) ?? latestVersion.timeStamp; + const updatedName = (newName.trim() || selectedVersion.versionName) ?? selectedVersion.timeStamp; + const updatedDescription = (description.trim() || selectedVersion.versionName) ?? selectedVersion.timeStamp; - createVersionApi(projectId, userId, latestVersion.versionId, updatedName, updatedDescription).then((data) => { + createVersionApi(projectId, userId, selectedVersion.versionId, updatedName, updatedDescription).then((data) => { setSaveFinish(true); setCreateNewVersion(false); @@ -84,7 +82,7 @@ const VersionSaved = () => { setCreateNewVersion(false); }; - if (!latestVersion) return null; + if (!selectedVersion) return null; return (
@@ -105,7 +103,7 @@ const VersionSaved = () => { placeholder="Enter new version name" />
- by @{latestVersion.createdBy}{" "}{new Date(latestVersion.timeStamp).toLocaleDateString("en-US", { + by @{selectedVersion.createdBy}{" "}{new Date(selectedVersion.timeStamp).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "2-digit", diff --git a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx index ce3b4fb..1870191 100644 --- a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx +++ b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx @@ -65,7 +65,7 @@ function DecalCreator() { const updatedWall = getWallById(wallIntersect.object.userData.wallUuid); if (updatedWall) { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); @@ -111,7 +111,7 @@ function DecalCreator() { setTimeout(() => { const updatedFloor = getFloorById(floorIntersect.object.userData.floorUuid); if (projectId && updatedFloor) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); diff --git a/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts b/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts index 1a75fc7..1db359e 100644 --- a/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts +++ b/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts @@ -148,7 +148,7 @@ export function useDecalEventHandlers({ const updatedWall = getWallById(parent.wallUuid); if (updatedWall) { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); @@ -174,7 +174,7 @@ export function useDecalEventHandlers({ const updatedFloor = parent; if (projectId && updatedFloor) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); @@ -203,7 +203,7 @@ export function useDecalEventHandlers({ const updatedWall = removeDecalInWall(decalUuid); if (projectId && updatedWall) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); @@ -226,7 +226,7 @@ export function useDecalEventHandlers({ const updatedFloor = removeDecalInFloor(decalUuid); if (projectId && updatedFloor) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); diff --git a/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx b/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx index d7a8d8a..3af6f8f 100644 --- a/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx +++ b/app/src/modules/builder/aisle/aisleCreator/aisleCreator.tsx @@ -135,7 +135,7 @@ function AisleCreator() { const addAilseToBackend = (aisle: Aisle) => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/builder/asset/functions/addAssetModel.ts b/app/src/modules/builder/asset/functions/addAssetModel.ts index fbd519a..6a4496a 100644 --- a/app/src/modules/builder/asset/functions/addAssetModel.ts +++ b/app/src/modules/builder/asset/functions/addAssetModel.ts @@ -440,7 +440,7 @@ async function handleModelLoad( userId: userId, }; - if (!socket?.active) { + if (!socket?.connected) { // API setAssetsApi({ @@ -492,7 +492,7 @@ async function handleModelLoad( userId: userId, }; - if (!socket?.active) { + if (!socket?.connected) { // API setAssetsApi({ diff --git a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts index 3b94eec..43d7ae1 100644 --- a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts +++ b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts @@ -145,7 +145,7 @@ export function useModelEventHandlers({ if (leftDrag.current || toggleView) return; if (activeTool === 'delete' && deletableFloorAsset && deletableFloorAsset.uuid === asset.modelUuid) { - if (!socket?.active) { + if (!socket?.connected) { // REST diff --git a/app/src/modules/builder/dfx/LoadBlueprint.tsx b/app/src/modules/builder/dfx/LoadBlueprint.tsx index 52da573..f960388 100644 --- a/app/src/modules/builder/dfx/LoadBlueprint.tsx +++ b/app/src/modules/builder/dfx/LoadBlueprint.tsx @@ -42,7 +42,7 @@ const DxfFile = () => { if (dfxWallGenerate) { dfxWallGenerate.map((wall: Wall) => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wall); diff --git a/app/src/modules/builder/floor/floorCreator/floorCreator.tsx b/app/src/modules/builder/floor/floorCreator/floorCreator.tsx index 76c5efb..c5c36d2 100644 --- a/app/src/modules/builder/floor/floorCreator/floorCreator.tsx +++ b/app/src/modules/builder/floor/floorCreator/floorCreator.tsx @@ -120,7 +120,7 @@ function FloorCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -176,7 +176,7 @@ function FloorCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -242,7 +242,7 @@ function FloorCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/builder/line/line.tsx b/app/src/modules/builder/line/line.tsx index 132a572..51391f8 100644 --- a/app/src/modules/builder/line/line.tsx +++ b/app/src/modules/builder/line/line.tsx @@ -120,7 +120,7 @@ function Line({ points }: Readonly) { if (projectId && asset) { removeWallAsset(asset.modelUuid); - if (!socket?.active) { + if (!socket?.connected) { // API @@ -142,7 +142,7 @@ function Line({ points }: Readonly) { } } }) - if (!socket?.active) { + if (!socket?.connected) { // API @@ -185,7 +185,7 @@ function Line({ points }: Readonly) { if (removedFloors.length > 0) { removedFloors.forEach(floor => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -226,7 +226,7 @@ function Line({ points }: Readonly) { if (updatedFloors.length > 0) { updatedFloors.forEach(floor => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -274,7 +274,7 @@ function Line({ points }: Readonly) { if (removedZones.length > 0) { removedZones.forEach(zone => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -315,7 +315,7 @@ function Line({ points }: Readonly) { if (updatedZones.length > 0) { updatedZones.forEach(zone => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -452,7 +452,7 @@ function Line({ points }: Readonly) { }); if (projectId && updatedWallAsset) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); @@ -474,7 +474,7 @@ function Line({ points }: Readonly) { }); } - if (!socket?.active) { + if (!socket?.connected) { // API @@ -519,7 +519,7 @@ function Line({ points }: Readonly) { if (updatedFloors.length > 0 && projectId) { updatedFloors.forEach(updatedFloor => { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -564,7 +564,7 @@ function Line({ points }: Readonly) { if (updatedZones.length > 0 && projectId) { updatedZones.forEach(updatedZone => { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/builder/point/point.tsx b/app/src/modules/builder/point/point.tsx index ebf2aaa..0b1e3cc 100644 --- a/app/src/modules/builder/point/point.tsx +++ b/app/src/modules/builder/point/point.tsx @@ -190,7 +190,7 @@ function Point({ point }: { readonly point: Point }) { const updatedAisles = getAislesByPointId(point.pointUuid); if (updatedAisles.length > 0 && projectId) { updatedAisles.forEach((updatedAisle) => { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -247,7 +247,7 @@ function Point({ point }: { readonly point: Point }) { }); if (projectId && updatedWallAsset) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); @@ -269,7 +269,7 @@ function Point({ point }: { readonly point: Point }) { }); } - if (!socket?.active) { + if (!socket?.connected) { // API @@ -311,7 +311,7 @@ function Point({ point }: { readonly point: Point }) { const updatedFloors = getFloorsByPointId(point.pointUuid); if (updatedFloors && updatedFloors.length > 0 && projectId) { updatedFloors.forEach((updatedFloor) => { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -353,7 +353,7 @@ function Point({ point }: { readonly point: Point }) { const updatedZones = getZonesByPointId(point.pointUuid); if (updatedZones && updatedZones.length > 0 && projectId) { updatedZones.forEach((updatedZone) => { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -404,7 +404,7 @@ function Point({ point }: { readonly point: Point }) { if (removedAisles.length > 0) { removedAisles.forEach(aisle => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -455,7 +455,7 @@ function Point({ point }: { readonly point: Point }) { if (projectId && asset) { removeWallAsset(asset.modelUuid); - if (!socket?.active) { + if (!socket?.connected) { // API @@ -480,7 +480,7 @@ function Point({ point }: { readonly point: Point }) { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -526,7 +526,7 @@ function Point({ point }: { readonly point: Point }) { if (removedFloors.length > 0) { removedFloors.forEach(floor => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -567,7 +567,7 @@ function Point({ point }: { readonly point: Point }) { if (updatedFloors.length > 0) { updatedFloors.forEach(floor => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -614,7 +614,7 @@ function Point({ point }: { readonly point: Point }) { if (removedZones.length > 0) { removedZones.forEach(zone => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -655,7 +655,7 @@ function Point({ point }: { readonly point: Point }) { if (updatedZones.length > 0) { updatedZones.forEach(zone => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/builder/wall/wallCreator/wallCreator.tsx b/app/src/modules/builder/wall/wallCreator/wallCreator.tsx index 02c7f0b..a0729fd 100644 --- a/app/src/modules/builder/wall/wallCreator/wallCreator.tsx +++ b/app/src/modules/builder/wall/wallCreator/wallCreator.tsx @@ -94,7 +94,7 @@ function WallCreator() { removeWall(wall.wallUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -151,7 +151,7 @@ function WallCreator() { addWall(wall2); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wall2); @@ -211,7 +211,7 @@ function WallCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wall3); @@ -247,7 +247,7 @@ function WallCreator() { addWall(wall1); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wall1); @@ -280,7 +280,7 @@ function WallCreator() { addWall(wall2); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wall2); @@ -344,7 +344,7 @@ function WallCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wall3); @@ -430,7 +430,7 @@ function WallCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wall); diff --git a/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx b/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx index 2f5a9f8..edaaafd 100644 --- a/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx +++ b/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx @@ -126,7 +126,7 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { const updatedWallAsset = getWallAssetById(wallAsset.modelUuid); if (projectId && updatedWallAsset) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -196,7 +196,7 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { const removedWallAsset = removeWallAsset(wallAsset.modelUuid); if (projectId && removedWallAsset) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -292,7 +292,7 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { setSelectedWallAsset(null); } }} - onPointerOver={(e) => { + onPointerEnter={(e) => { if (!toggleView) { e.stopPropagation(); let currentObject = e.object as THREE.Object3D; diff --git a/app/src/modules/builder/wallAsset/wallAssetCreator.tsx b/app/src/modules/builder/wallAsset/wallAssetCreator.tsx index bfbeb63..effc0ed 100644 --- a/app/src/modules/builder/wallAsset/wallAssetCreator.tsx +++ b/app/src/modules/builder/wallAsset/wallAssetCreator.tsx @@ -62,7 +62,7 @@ function WallAssetCreator() { addWallAsset(newWallAsset); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx index 85ce279..6e9e97c 100644 --- a/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx +++ b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx @@ -118,7 +118,7 @@ function ZoneCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -172,7 +172,7 @@ function ZoneCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -236,7 +236,7 @@ function ZoneCreator() { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/scene/camera/functions/updateCameraPosition.ts b/app/src/modules/scene/camera/functions/updateCameraPosition.ts index fb8c956..b0cc67a 100644 --- a/app/src/modules/scene/camera/functions/updateCameraPosition.ts +++ b/app/src/modules/scene/camera/functions/updateCameraPosition.ts @@ -1,26 +1,41 @@ import { Socket } from "socket.io-client"; import * as THREE from "three"; import { getUserData } from "../../../../functions/getUserData"; +import { CameraControls } from "@react-three/drei"; +import { setCameraApi } from "../../../../services/factoryBuilder/camera/setCameraApi"; export default function updateCamPosition( - controls: any, - socket: Socket, - position: THREE.Vector3, - rotation: THREE.Euler, - projectId?: string + controls: React.RefObject, + socket: Socket, + position: THREE.Vector3, + rotation: THREE.Euler, + projectId?: string ) { - const { userId, organization } = getUserData(); - if (!controls.current) return; - const target = controls.current.getTarget(new THREE.Vector3()); + const { userId, organization } = getUserData(); + if (!controls.current || !projectId) return; + const target = controls.current.getTarget(new THREE.Vector3()); - const camData = { - organization, - userId: userId, - position: position, - target: new THREE.Vector3(target.x, 0, target.z), - rotation: new THREE.Vector3(rotation.x, rotation.y, rotation.z), - socketId: socket.id, - projectId, - }; - socket.emit("v1:Camera:set", camData); + if (!socket?.connected) { + // API + + setCameraApi( + projectId, + position, + new THREE.Vector3(target.x, 0, target.z), + new THREE.Vector3(rotation.x, rotation.y, rotation.z), + ) + } else { + // SOCKET + + const camData = { + organization, + userId: userId, + position: position, + target: new THREE.Vector3(target.x, 0, target.z), + rotation: new THREE.Vector3(rotation.x, rotation.y, rotation.z), + socketId: socket.id, + projectId, + }; + socket.emit("v1:Camera:set", camData); + } } diff --git a/app/src/modules/scene/camera/switchView.tsx b/app/src/modules/scene/camera/switchView.tsx index b9501b3..489d46a 100644 --- a/app/src/modules/scene/camera/switchView.tsx +++ b/app/src/modules/scene/camera/switchView.tsx @@ -4,7 +4,7 @@ import * as THREE from 'three'; import { PerspectiveCamera, OrthographicCamera, CameraControls } from '@react-three/drei'; import { useParams } from "react-router-dom"; import * as CONSTANTS from '../../../types/world/worldConstants'; -import { getCamera } from "../../../services/factoryBuilder/camera/getCameraApi"; +import { getCameraApi } from "../../../services/factoryBuilder/camera/getCameraApi"; import { getUserData } from "../../../functions/getUserData"; import { useToggleView } from "../../../store/builder/store"; @@ -20,7 +20,7 @@ export default function SwitchView() { (controls as any).mouseButtons.right = CONSTANTS.twoDimension.rightMouse; } else { try { - getCamera(organization, localStorage.getItem('userId')!, projectId).then((data) => { + getCameraApi(organization, localStorage.getItem('userId')!, projectId).then((data) => { if (data && data.position && data.target) { (controls as CameraControls)?.setPosition(data.position.x, data.position.y, data.position.z); (controls as CameraControls)?.setTarget(data.target.x, data.target.y, data.target.z); diff --git a/app/src/modules/scene/controls/controls.tsx b/app/src/modules/scene/controls/controls.tsx index 984cfa8..3e9dca3 100644 --- a/app/src/modules/scene/controls/controls.tsx +++ b/app/src/modules/scene/controls/controls.tsx @@ -17,7 +17,8 @@ import CameraShortcutsControls from "../camera/shortcutsControls/cameraShortcuts import { useParams } from "react-router-dom"; import { getUserData } from "../../../functions/getUserData"; -import { getCamera } from "../../../services/factoryBuilder/camera/getCameraApi"; +import { getCameraApi } from "../../../services/factoryBuilder/camera/getCameraApi"; +import { setCameraApi } from "../../../services/factoryBuilder/camera/setCameraApi"; import updateCamPosition from "../camera/functions/updateCameraPosition"; export default function Controls() { @@ -36,7 +37,7 @@ export default function Controls() { (controlsRef.current as any).mouseButtons.right = CONSTANTS.thirdPersonControls.rightMouse; } - getCamera(organization, userId, projectId).then((data) => { + getCameraApi(organization, userId, projectId).then((data) => { if (data && data.position && data.target) { controlsRef.current?.setPosition(data.position.x, data.position.y, data.position.z); controlsRef.current?.setTarget(data.target.x, data.target.y, data.target.z); @@ -48,21 +49,30 @@ export default function Controls() { }, []); useEffect(() => { - if (resetCamera && socket) { + if (resetCamera && projectId) { controlsRef.current?.setPosition(...CONSTANTS.threeDimension.defaultPosition); controlsRef.current?.setTarget(...CONSTANTS.threeDimension.defaultTarget); controlsRef.current?.rotateAzimuthTo(CONSTANTS.threeDimension.defaultAzimuth); - const camData = { - organization, - userId: userId, - position: new THREE.Vector3(...CONSTANTS.threeDimension.defaultPosition), - target: new THREE.Vector3(...CONSTANTS.threeDimension.defaultTarget), - rotation: new THREE.Vector3(...CONSTANTS.threeDimension.defaultRotation), - socketId: socket.id, - projectId - }; - socket.emit('v1:Camera:set', camData) + if (!socket?.connected) { + setCameraApi( + projectId, + new THREE.Vector3(...CONSTANTS.threeDimension.defaultPosition), + new THREE.Vector3(...CONSTANTS.threeDimension.defaultTarget), + new THREE.Vector3(...CONSTANTS.threeDimension.defaultRotation), + ) + } else { + const camData = { + organization, + userId: userId, + position: new THREE.Vector3(...CONSTANTS.threeDimension.defaultPosition), + target: new THREE.Vector3(...CONSTANTS.threeDimension.defaultTarget), + rotation: new THREE.Vector3(...CONSTANTS.threeDimension.defaultRotation), + socketId: socket.id, + projectId + }; + socket.emit('v1:Camera:set', camData) + } setResetCamera(false); } @@ -139,7 +149,7 @@ export default function Controls() { - + diff --git a/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx b/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx index a072d5e..b87323e 100644 --- a/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx @@ -271,7 +271,7 @@ function MoveControls2D({ if (updatedAisles.length > 0 && projectId) { updatedAisles.forEach((updatedAisle) => { - if (!socket?.active) { + if (!socket?.connected) { // API upsertAisleApi(updatedAisle.aisleUuid, updatedAisle.points, updatedAisle.type, projectId, selectedVersion?.versionId || ''); @@ -334,7 +334,7 @@ function MoveControls2D({ }); } - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', updatedWall); @@ -378,7 +378,7 @@ function MoveControls2D({ if (updatedFloors?.length && projectId) { updatedFloors.forEach(updatedFloor => { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedFloor); @@ -420,7 +420,7 @@ function MoveControls2D({ if (updatedZones?.length && projectId) { updatedZones.forEach(updatedZone => { - if (!socket?.active) { + if (!socket?.connected) { // API upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedZone); @@ -472,7 +472,7 @@ function MoveControls2D({ rotation: updatedWallAsset.rotation }); - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallAssetApi(projectId, selectedVersion?.versionId || '', updatedWallAsset); diff --git a/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx b/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx index a01e1fb..1b29174 100644 --- a/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx @@ -241,7 +241,7 @@ const SelectionControls2D: React.FC = () => { if (removedAisles.length > 0) { removedAisles.forEach(aisle => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -284,7 +284,7 @@ const SelectionControls2D: React.FC = () => { removeWallAsset(asset.modelUuid); - if (!socket?.active) { + if (!socket?.connected) { // API @@ -308,7 +308,7 @@ const SelectionControls2D: React.FC = () => { }) if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -345,7 +345,7 @@ const SelectionControls2D: React.FC = () => { if (removedFloors.length > 0) { removedFloors.forEach(floor => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -378,7 +378,7 @@ const SelectionControls2D: React.FC = () => { if (updatedFloors.length > 0) { updatedFloors.forEach(floor => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -416,7 +416,7 @@ const SelectionControls2D: React.FC = () => { if (removedZones.length > 0) { removedZones.forEach(zone => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API @@ -449,7 +449,7 @@ const SelectionControls2D: React.FC = () => { if (updatedZones.length > 0) { updatedZones.forEach(zone => { if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx index 01130fa..4b9ae71 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/copyPasteControls3D.tsx @@ -488,7 +488,7 @@ const CopyPasteControls3D = () => { projectId }; - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ @@ -540,7 +540,7 @@ const CopyPasteControls3D = () => { userId }; - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx index ca37153..17a369e 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/duplicationControls3D.tsx @@ -557,7 +557,8 @@ const DuplicationControls3D = () => { projectId }; - if (!socket?.active) { + console.log('socket: ', socket); + if (!socket?.connected) { // REST setAssetsApi({ @@ -609,7 +610,7 @@ const DuplicationControls3D = () => { userId }; - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx index a142de5..cb15a43 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx @@ -426,7 +426,7 @@ function MoveControls3D({ boundingBoxRef }: any) { userId }; - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx index a9b54f3..4aa8bc6 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx @@ -370,7 +370,7 @@ function RotateControls3D() { userId }; - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx index 4884acd..d07d3bc 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx @@ -285,7 +285,7 @@ const SelectionControls3D: React.FC = () => { if (!asset) return; - if (!socket?.active) { + if (!socket?.connected) { // REST diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx index 05a883e..e0ede9a 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/transformControls3D.tsx @@ -136,7 +136,7 @@ function TransformControls3D() { } - if (!socket?.active) { + if (!socket?.connected) { // API setAssetsApi({ diff --git a/app/src/modules/scene/controls/transformControls/transformControls.tsx b/app/src/modules/scene/controls/transformControls/transformControls.tsx index 851f816..a2676bb 100644 --- a/app/src/modules/scene/controls/transformControls/transformControls.tsx +++ b/app/src/modules/scene/controls/transformControls/transformControls.tsx @@ -110,7 +110,7 @@ export default function TransformControl() { rotation: [selectedFloorAsset.rotation.x, selectedFloorAsset.rotation.y, selectedFloorAsset.rotation.z] as [number, number, number], }); - if (!socket?.active) { + if (!socket?.connected) { // API diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts index cdfa8a9..bceeeb8 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts @@ -100,7 +100,7 @@ function use2DRedoHandler() { const createWallFromBackend = (wallData: Wall) => { addWall(wallData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wallData); @@ -124,7 +124,7 @@ function use2DRedoHandler() { const removeWallFromBackend = (wallUuid: string) => { removeWall(wallUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteWallApi(projectId, selectedVersion?.versionId || '', wallUuid); @@ -148,7 +148,7 @@ function use2DRedoHandler() { const updateWallFromBackend = (wallUuid: string, updatedData: Wall) => { updateWall(wallUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', updatedData); @@ -172,7 +172,7 @@ function use2DRedoHandler() { const createFloorFromBackend = (floorData: Floor) => { addFloor(floorData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', floorData); @@ -196,7 +196,7 @@ function use2DRedoHandler() { const removeFloorFromBackend = (floorUuid: string) => { removeFloor(floorUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteFloorApi(projectId, selectedVersion?.versionId || '', floorUuid); @@ -220,7 +220,7 @@ function use2DRedoHandler() { const updateFloorFromBackend = (floorUuid: string, updatedData: Floor) => { updateFloor(floorUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedData); @@ -244,7 +244,7 @@ function use2DRedoHandler() { const createZoneFromBackend = (zoneData: Zone) => { addZone(zoneData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertZoneApi(projectId, selectedVersion?.versionId || '', zoneData); @@ -268,7 +268,7 @@ function use2DRedoHandler() { const removeZoneFromBackend = (zoneUuid: string) => { removeZone(zoneUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteZoneApi(projectId, selectedVersion?.versionId || '', zoneUuid); @@ -292,7 +292,7 @@ function use2DRedoHandler() { const updateZoneFromBackend = (zoneUuid: string, updatedData: Zone) => { updateZone(zoneUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedData); @@ -316,7 +316,7 @@ function use2DRedoHandler() { const createAisleFromBackend = (aisleData: Aisle) => { addAisle(aisleData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertAisleApi(aisleData.aisleUuid, aisleData.points, aisleData.type, projectId, selectedVersion?.versionId || ''); @@ -340,7 +340,7 @@ function use2DRedoHandler() { const removeAisleFromBackend = (aisleUuid: string) => { removeAisle(aisleUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteAisleApi(projectId, selectedVersion?.versionId || '', aisleUuid); @@ -364,7 +364,7 @@ function use2DRedoHandler() { const updateAisleFromBackend = (aisleUuid: string, updatedData: Aisle) => { updateAisle(aisleUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertAisleApi(updatedData.aisleUuid, updatedData.points, updatedData.type, projectId, selectedVersion?.versionId || ''); diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts index 16fb689..31725d0 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use2DUndoHandler.ts @@ -100,7 +100,7 @@ function use2DUndoHandler() { const createWallToBackend = (wallData: Wall) => { addWall(wallData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', wallData); @@ -124,7 +124,7 @@ function use2DUndoHandler() { const removeWallToBackend = (wallUuid: string) => { removeWall(wallUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteWallApi(projectId, selectedVersion?.versionId || '', wallUuid); @@ -148,7 +148,7 @@ function use2DUndoHandler() { const updateWallToBackend = (wallUuid: string, updatedData: Wall) => { updateWall(wallUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertWallApi(projectId, selectedVersion?.versionId || '', updatedData); @@ -172,7 +172,7 @@ function use2DUndoHandler() { const createFloorToBackend = (floorData: Floor) => { addFloor(floorData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', floorData); @@ -196,7 +196,7 @@ function use2DUndoHandler() { const removeFloorToBackend = (floorUuid: string) => { removeFloor(floorUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteFloorApi(projectId, selectedVersion?.versionId || '', floorUuid); @@ -220,7 +220,7 @@ function use2DUndoHandler() { const updateFloorToBackend = (floorUuid: string, updatedData: Floor) => { updateFloor(floorUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertFloorApi(projectId, selectedVersion?.versionId || '', updatedData); @@ -244,7 +244,7 @@ function use2DUndoHandler() { const createZoneToBackend = (zoneData: Zone) => { addZone(zoneData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertZoneApi(projectId, selectedVersion?.versionId || '', zoneData); @@ -268,7 +268,7 @@ function use2DUndoHandler() { const removeZoneToBackend = (zoneUuid: string) => { removeZone(zoneUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteZoneApi(projectId, selectedVersion?.versionId || '', zoneUuid); @@ -292,7 +292,7 @@ function use2DUndoHandler() { const updateZoneToBackend = (zoneUuid: string, updatedData: Zone) => { updateZone(zoneUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertZoneApi(projectId, selectedVersion?.versionId || '', updatedData); @@ -316,7 +316,7 @@ function use2DUndoHandler() { const createAisleToBackend = (aisleData: Aisle) => { addAisle(aisleData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertAisleApi(aisleData.aisleUuid, aisleData.points, aisleData.type, projectId, selectedVersion?.versionId || ''); @@ -340,7 +340,7 @@ function use2DUndoHandler() { const removeAisleToBackend = (aisleUuid: string) => { removeAisle(aisleUuid); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API deleteAisleApi(projectId, selectedVersion?.versionId || '', aisleUuid); @@ -364,7 +364,7 @@ function use2DUndoHandler() { const updateAisleToBackend = (aisleUuid: string, updatedData: Aisle) => { updateAisle(aisleUuid, updatedData); if (projectId) { - if (!socket?.active) { + if (!socket?.connected) { // API upsertAisleApi(updatedData.aisleUuid, updatedData.points, updatedData.type, projectId, selectedVersion?.versionId || ''); diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts index 4ddf62e..31b5fd4 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts @@ -149,7 +149,7 @@ function use3DRedoHandler() { addEvent(assetData.eventData as EventsSchema); } - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ @@ -174,7 +174,7 @@ function use3DRedoHandler() { } const deleteAssetToBackend = (assetData: Asset) => { - if (!socket?.active) { + if (!socket?.connected) { // REST deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); @@ -228,7 +228,7 @@ function use3DRedoHandler() { userId }; - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ @@ -275,7 +275,7 @@ function use3DRedoHandler() { addEvent(assetData.eventData as EventsSchema); } - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ @@ -323,7 +323,7 @@ function use3DRedoHandler() { addEvent(assetData.eventData as EventsSchema); } - if (!socket?.active) { + if (!socket?.connected) { //REST setAssetsApi({ diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts index 877dff6..021b006 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts @@ -148,7 +148,7 @@ function use3DUndoHandler() { addEvent(assetData.eventData as EventsSchema); } - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ @@ -173,7 +173,7 @@ function use3DUndoHandler() { } const deleteAssetToBackend = (assetData: Asset) => { - if (!socket?.active) { + if (!socket?.connected) { // REST deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); @@ -227,7 +227,7 @@ function use3DUndoHandler() { userId }; - if (!socket?.active) { + if (!socket?.connected) { // REST setAssetsApi({ @@ -251,7 +251,7 @@ function use3DUndoHandler() { } const copyAssetToBackend = (assetData: Asset) => { - if (!socket?.active) { + if (!socket?.connected) { // REST deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); @@ -288,7 +288,7 @@ function use3DUndoHandler() { } const duplicateAssetToBackend = (assetData: Asset) => { - if (!socket?.active) { + if (!socket?.connected) { // REST deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); diff --git a/app/src/services/factoryBuilder/camera/getCameraApi.ts b/app/src/services/factoryBuilder/camera/getCameraApi.ts index 595ac29..2ea25a9 100644 --- a/app/src/services/factoryBuilder/camera/getCameraApi.ts +++ b/app/src/services/factoryBuilder/camera/getCameraApi.ts @@ -1,6 +1,6 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -export const getCamera = async (organization: string, userId: string, projectId?: string) => { +export const getCameraApi = async (organization: string, userId: string, projectId?: string) => { try { const response = await fetch( `${url_Backend_dwinzo}/api/V1/cameras/${projectId}`, diff --git a/app/src/services/factoryBuilder/camera/setCameraApi.ts b/app/src/services/factoryBuilder/camera/setCameraApi.ts index bc0d16f..b3a2f78 100644 --- a/app/src/services/factoryBuilder/camera/setCameraApi.ts +++ b/app/src/services/factoryBuilder/camera/setCameraApi.ts @@ -1,47 +1,44 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -export const setCamera = async ( - organization: string, - userId: string, - position: Object, - target: Object, - rotation: Object +export const setCameraApi = async ( + projectId: string, + position: Object, + target: Object, + rotation: Object ) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/setCamera`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ - organization, - userId, - position, - target, - rotation, - }), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/builder/setCamera`, { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ + projectId, + position, + target, + rotation, + }), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - if (!response.ok) { - console.error("Failed to set Camera Position and Target"); - } + if (!response.ok) { + console.error("Failed to set Camera Position and Target"); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to set camera"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch (error) { + echo.error("Failed to set camera"); + if (error instanceof Error) { + console.log(error.message); + } else { + console.log("An unknown error occurred"); + } } - } }; From 817a85b2623c1e50f30f3290e848fc16088cb262 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 11:11:31 +0530 Subject: [PATCH 05/17] code optimization --- app/src/pages/Project.tsx | 210 +++++---- app/src/pages/UserAuth.tsx | 441 +++++++++---------- app/src/services/dashboard/recentlyViewed.ts | 51 ++- 3 files changed, 342 insertions(+), 360 deletions(-) diff --git a/app/src/pages/Project.tsx b/app/src/pages/Project.tsx index 9b71ded..9c297e8 100644 --- a/app/src/pages/Project.tsx +++ b/app/src/pages/Project.tsx @@ -1,10 +1,6 @@ import React, { useEffect } from "react"; import useModuleStore from "../store/useModuleStore"; -import { - useSocketStore, - useProjectName, - useActiveTool, -} from "../store/builder/store"; +import { useSocketStore, useProjectName, useActiveTool, } from "../store/builder/store"; import { useNavigate, useParams } from "react-router-dom"; import { useSelectedUserStore } from "../store/collaboration/useCollabStore"; import FollowPerson from "../components/templates/FollowPerson"; @@ -24,116 +20,116 @@ import { sharedWithMeProjects } from "../services/dashboard/sharedWithMeProject" import { handleCanvasCursors } from "../utils/mouseUtils/handleCanvasCursors"; const Project: React.FC = () => { - let navigate = useNavigate(); - const echo = useLogger(); - const { setActiveModule } = useModuleStore(); - const { projectId } = useParams(); - const { setProjectName } = useProjectName(); - const { userId, email, organization, userName } = getUserData(); - const { selectedUser } = useSelectedUserStore(); - const { isLogListVisible } = useLogger(); - const { setVersions } = useVersionHistoryStore(); - const { activeTool } = useActiveTool(); + let navigate = useNavigate(); + const echo = useLogger(); + const { setActiveModule } = useModuleStore(); + const { projectId } = useParams(); + const { setProjectName } = useProjectName(); + const { userId, email, organization } = getUserData(); + const { selectedUser } = useSelectedUserStore(); + const { isLogListVisible } = useLogger(); + const { setVersions } = useVersionHistoryStore(); + const { activeTool } = useActiveTool(); - useEffect(() => { - if (!email || !userId) { - console.error("User data not found in localStorage"); - navigate("/page-not-found"); - return; - } - - const fetchProjects = async () => { - try { - const projects = await getAllProjects(userId, organization); - const shared = await sharedWithMeProjects(); - - const allProjects = [...(projects?.Projects || []), ...(shared || [])]; - - const matchedProject = allProjects.find( - (val: any) => val.projectUuid === projectId || val._id === projectId - ); - if (matchedProject) { - setProjectName(matchedProject.projectName); - await viewProject(organization, matchedProject._id, userId); - } else { - console.warn("Project not found with given ID:", projectId); - navigate(`/not_found#project_not_found#${projectId}`); + useEffect(() => { + if (!email || !userId) { + console.error("User data not found in localStorage"); + navigate("/page-not-found"); + return; } - } catch (error) { - console.error("Error fetching projects:", error); - } - }; - fetchProjects(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + const fetchProjects = async () => { + try { + const projects = await getAllProjects(userId, organization); + const shared = await sharedWithMeProjects(); - useEffect(() => { - if (!projectId) return; + const allProjects = [...(projects?.Projects || []), ...(shared || [])]; - getVersionHistoryApi(projectId) - .then((data) => { - const versions: VersionHistory = []; - data.versions.forEach((version: any) => { - versions.push({ - version: version.version, - versionId: version.versionId, - versionName: version.versionName, - versionDescription: version.description, - timeStamp: version.createdAt, - createdBy: version.createdBy.userName, - }); - }); - setVersions(versions); - }) - .catch(() => { - console.error("Error fetching version history"); - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [projectId]); + const matchedProject = allProjects.find( + (val: any) => val.projectUuid === projectId || val._id === projectId + ); + if (matchedProject) { + setProjectName(matchedProject.projectName); + await viewProject(organization, matchedProject._id, userId); + } else { + console.warn("Project not found with given ID:", projectId); + navigate(`/not_found#project_not_found#${projectId}`); + } + } catch (error) { + console.error("Error fetching projects:", error); + } + }; - useEffect(() => { - setActiveModule("builder"); - if (email) { - const token = localStorage.getItem("token"); - const refreshToken = localStorage.getItem("refreshToken"); - echo.warn('Validating token'); - if (token && refreshToken) { - useSocketStore - .getState() - .initializeSocket(email, organization, token, refreshToken); - } - echo.success("Project initialized and loaded successfully"); - } else { - navigate("/"); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + fetchProjects(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); - useEffect(() => { - handleCanvasCursors(activeTool); - }, [activeTool]); + useEffect(() => { + if (!projectId) return; - return ( -
- - - - - - - - - - - {selectedUser && } - {isLogListVisible && ( - - - - )} -
- ); + getVersionHistoryApi(projectId) + .then((data) => { + const versions: VersionHistory = []; + data.versions.forEach((version: any) => { + versions.push({ + version: version.version, + versionId: version.versionId, + versionName: version.versionName, + versionDescription: version.description, + timeStamp: version.createdAt, + createdBy: version.createdBy.userName, + }); + }); + setVersions(versions); + }) + .catch(() => { + console.error("Error fetching version history"); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [projectId]); + + useEffect(() => { + setActiveModule("builder"); + if (email) { + const token = localStorage.getItem("token"); + const refreshToken = localStorage.getItem("refreshToken"); + echo.warn('Validating token'); + if (token && refreshToken) { + useSocketStore + .getState() + .initializeSocket(email, organization, token, refreshToken); + } + echo.success("Project initialized and loaded successfully"); + } else { + navigate("/"); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + handleCanvasCursors(activeTool); + }, [activeTool]); + + return ( +
+ + + + + + + + + + + {selectedUser && } + {isLogListVisible && ( + + + + )} +
+ ); }; export default Project; diff --git a/app/src/pages/UserAuth.tsx b/app/src/pages/UserAuth.tsx index 3fec867..f7b89a1 100644 --- a/app/src/pages/UserAuth.tsx +++ b/app/src/pages/UserAuth.tsx @@ -2,9 +2,7 @@ import React, { useState, FormEvent, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { LogoIconLarge } from "../components/icons/Logo"; import { EyeIcon } from "../components/icons/ExportCommonIcons"; -import { - useLoadingProgress, -} from "../store/builder/store"; +import { useLoadingProgress } from "../store/builder/store"; import { signInApi } from "../services/factoryBuilder/signInSignUp/signInApi"; import { signUpApi } from "../services/factoryBuilder/signInSignUp/signUpApi"; import FingerprintJS from "@fingerprintjs/fingerprintjs"; @@ -12,243 +10,232 @@ import { recentlyViewed } from "../services/dashboard/recentlyViewed"; import { getUserData } from "../functions/getUserData"; const UserAuth: React.FC = () => { - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [showPassword, setShowPassword] = useState(false); - const [error, setError] = useState(""); - const [isSignIn, setIsSignIn] = useState(true); - const { userName } = getUserData(); - const [name, setName] = useState(userName || ''); - const { setLoadingProgress } = useLoadingProgress(); - const [fingerprint, setFingerprint] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [showPassword, setShowPassword] = useState(false); + const [error, setError] = useState(""); + const [isSignIn, setIsSignIn] = useState(true); + const { userName } = getUserData(); + const [name, setName] = useState(userName || ''); + const { setLoadingProgress } = useLoadingProgress(); + const [fingerprint, setFingerprint] = useState(""); - const navigate = useNavigate(); + const navigate = useNavigate(); - const initializeFingerprint = async () => { - const fp = await FingerprintJS.load(); - const result = await fp.get(); - setFingerprint(result.visitorId); // Set the fingerprint - }; + const initializeFingerprint = async () => { + const fp = await FingerprintJS.load(); + const result = await fp.get(); + setFingerprint(result.visitorId); // Set the fingerprint + }; - useEffect(() => { - initializeFingerprint(); - }, []); + useEffect(() => { + initializeFingerprint(); + }, []); - const handleLogin = async (e: FormEvent) => { - e.preventDefault(); - const organization = email.split("@")[1].split(".")[0]; - try { - const res = await signInApi(email, password, organization, fingerprint); - if (res.message.message === "login successfull") { - setError(""); - localStorage.setItem("userId", res.message.userId); - localStorage.setItem("email", res.message.email); - localStorage.setItem("userName", res.message.name); - localStorage.setItem("token", res.message.token); - localStorage.setItem("refreshToken", res.message.refreshToken); - - try { - const projects = await recentlyViewed( - organization, - res.message.userId - ); - if (res.message.isShare) { - if (Object.values(projects.RecentlyViewed).length > 0) { - const recent_opend_projectID = ( - Object.values(projects?.RecentlyViewed || {})[0] as any - )?._id; - if ( - Object.values(projects?.RecentlyViewed).filter( - (val: any) => val._id == recent_opend_projectID - ) - ) { - setLoadingProgress(1); - navigate(`/projects/${recent_opend_projectID}`); - } else { - navigate("/Dashboard"); - } - } else { - setLoadingProgress(1); - navigate("/Dashboard"); - } - } - } catch (error) { - console.error("Error fetching recent projects:", error); - } - } else if (res.message === "User Not Found!!! Kindly signup...") { - setError("Account not found"); - } else if ( - res.message === "Email & Password is invalid...Check the credentials" - ) { - setError(res.message); - } else if ( - res.message === - "Already LoggedIn on another browser....Please logout!!!" - ) { - setError("Already logged in on another browser. Please logout first."); - navigate("/"); - setError(""); - // setError(""); - // setOrganization(organization); - // setUserName(res.ForceLogoutData.userName); - // console.log(' res.userId: ', res.ForceLogoutData.userId); - // localStorage.setItem("userId", res.ForceLogoutData.userId); - // localStorage.setItem("email", res.ForceLogoutData.Email); - // localStorage.setItem("userName", res.ForceLogoutData.userName); - // localStorage.setItem("token", res.ForceLogoutData.token); - // localStorage.setItem("refreshToken", res.ForceLogoutData.refreshToken); - // if (res.ForceLogoutData.isShare) { - // setLoadingProgress(1); - // navigate("/Dashboard"); - // } - } - } catch (error) { - echo.error("Login failed"); - } - }; - - const handleRegister = async (e: FormEvent) => { - e.preventDefault(); - if (email && password && name) { - setError(""); - try { + const handleLogin = async (e: FormEvent) => { + e.preventDefault(); const organization = email.split("@")[1].split(".")[0]; - const res = await signUpApi(name, email, password, organization); + try { + const res = await signInApi(email, password, organization, fingerprint); + if (res.message.message === "login successfull") { + setError(""); + localStorage.setItem("userId", res.message.userId); + localStorage.setItem("email", res.message.email); + localStorage.setItem("userName", res.message.name); + localStorage.setItem("token", res.message.token); + localStorage.setItem("refreshToken", res.message.refreshToken); - if (res.message === "New User created") { - setIsSignIn(true); + try { + const projects = await recentlyViewed( + organization, + res.message.userId + ); + if (res.message.isShare) { + if (Object.values(projects.RecentlyViewed).length > 0) { + const recent_opend_projectID = (Object.values(projects?.RecentlyViewed || {})[0] as any)?._id; + if (Object.values(projects?.RecentlyViewed).filter((val: any) => val._id == recent_opend_projectID)) { + setLoadingProgress(1); + navigate(`/projects/${recent_opend_projectID}`); + } else { + navigate("/Dashboard"); + } + } else { + setLoadingProgress(1); + navigate("/Dashboard"); + } + } + } catch (error) { + console.error("Error fetching recent projects:", error); + } + } else if (res.message === "User Not Found!!! Kindly signup...") { + setError("Account not found"); + } else if (res.message === "Email & Password is invalid...Check the credentials") { + setError(res.message); + } else if (res.message === "Already LoggedIn on another browser....Please logout!!!") { + setError("Already logged in on another browser. Please logout first."); + navigate("/"); + setError(""); + // setError(""); + // setOrganization(organization); + // setUserName(res.ForceLogoutData.userName); + // console.log(' res.userId: ', res.ForceLogoutData.userId); + // localStorage.setItem("userId", res.ForceLogoutData.userId); + // localStorage.setItem("email", res.ForceLogoutData.Email); + // localStorage.setItem("userName", res.ForceLogoutData.userName); + // localStorage.setItem("token", res.ForceLogoutData.token); + // localStorage.setItem("refreshToken", res.ForceLogoutData.refreshToken); + // if (res.ForceLogoutData.isShare) { + // setLoadingProgress(1); + // navigate("/Dashboard"); + // } + } + } catch (error) { + echo.error("Login failed"); } - if (res.message === "User already exists") { - setError("User already exists"); + }; + + const handleRegister = async (e: FormEvent) => { + e.preventDefault(); + if (email && password && name) { + setError(""); + try { + const organization = email.split("@")[1].split(".")[0]; + const res = await signUpApi(name, email, password, organization); + + if (res.message === "New User created") { + setIsSignIn(true); + } + if (res.message === "User already exists") { + setError("User already exists"); + } + } catch (error) { + echo.error("Register user failed"); + } + } else { + setError("Please fill all the fields!"); } - } catch (error) { - echo.error("Register user failed"); - } - } else { - setError("Please fill all the fields!"); - } - }; + }; - return ( -
-
- -
-

Welcome to Aalai

-

- {isSignIn ? ( - <> - Don’t have an account?{" "} - setIsSignIn(false)} - style={{ cursor: "pointer" }} + return ( +

+
+ +
+

Welcome to Aalai

+

+ {isSignIn ? ( + <> + Don’t have an account?{" "} + setIsSignIn(false)} + style={{ cursor: "pointer" }} + > + Register here! + + + ) : ( + <> + Already have an account?{" "} + setIsSignIn(true)} + style={{ cursor: "pointer" }} + > + Login here! + + + )} +

+ + + + {error &&
🛈 {error}
} + +
- Register here! - - - ) : ( - <> - Already have an account?{" "} - setIsSignIn(true)} - style={{ cursor: "pointer" }} - > - Login here! - - - )} -

+ {!isSignIn && ( + setName(e.target.value)} + required + /> + )} + setEmail(e.target.value)} + required + /> +
+ setPassword(e.target.value)} + required + /> + +
- + {isSignIn && ( + + Forgot password ? + + )} - {error &&
🛈 {error}
} - - - {!isSignIn && ( - setName(e.target.value)} - required - /> - )} - setEmail(e.target.value)} - required - /> -
- setPassword(e.target.value)} - required - /> - + {!isSignIn && ( +
+ + +
+ )} + + +

+ By signing up for, or logging into, an account, you agree to our{" "} + navigate("/privacy")} + style={{ cursor: "pointer" }} + > + privacy policy + {" "} + &{" "} + navigate("/terms")} + style={{ cursor: "pointer" }} + > + terms of service + {" "} + whether you read them or not. You can also find these terms on our + website. +

- - {isSignIn && ( - - Forgot password ? - - )} - - {!isSignIn && ( -
- - -
- )} - - -

- By signing up for, or logging into, an account, you agree to our{" "} - navigate("/privacy")} - style={{ cursor: "pointer" }} - > - privacy policy - {" "} - &{" "} - navigate("/terms")} - style={{ cursor: "pointer" }} - > - terms of service - {" "} - whether you read them or not. You can also find these terms on our - website. -

-
- ); + ); }; export default UserAuth; diff --git a/app/src/services/dashboard/recentlyViewed.ts b/app/src/services/dashboard/recentlyViewed.ts index ff8bf89..06fa3fd 100644 --- a/app/src/services/dashboard/recentlyViewed.ts +++ b/app/src/services/dashboard/recentlyViewed.ts @@ -1,31 +1,30 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const recentlyViewed = async (organization: string, userId: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/RecentlyViewed`, - { - method: "GET", - headers: { - Authorization: "Bearer ", // Replace with actual token - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string - refresh_token: localStorage.getItem("refreshToken") || "", - }, - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to fetch project"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/RecentlyViewed`, + { + method: "GET", + headers: { + Authorization: "Bearer ", // Replace with actual token + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", // Coerce null to empty string + 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 fetch project"); + } - return await response.json(); - } catch (error: any) { - console.error("Failed to get project"); - console.log(error.message); - } + return await response.json(); + } catch (error: any) { + console.error("Failed to get project"); + console.log(error.message); + } }; From aa16257ae7aa804eabf3278a4b460c36b1dfb564 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 11:38:12 +0530 Subject: [PATCH 06/17] version optimization --- .../components/layout/scenes/MainScene.tsx | 50 ++++++++++--------- app/src/pages/Project.tsx | 4 +- app/src/pages/UserAuth.tsx | 5 +- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/app/src/components/layout/scenes/MainScene.tsx b/app/src/components/layout/scenes/MainScene.tsx index ef53a50..1234246 100644 --- a/app/src/components/layout/scenes/MainScene.tsx +++ b/app/src/components/layout/scenes/MainScene.tsx @@ -1,17 +1,5 @@ -import React, { useEffect } from "react"; -import { - useLoadingProgress, - useRenameModeStore, - useSaveVersion, - useSelectedComment, - useSocketStore, - useWidgetSubOption, -} from "../../../store/builder/store"; -import useModuleStore, { useThreeDStore } from "../../../store/useModuleStore"; -import { usePlayButtonStore } from "../../../store/usePlayButtonStore"; -import { useSelectedZoneStore } from "../../../store/visualization/useZoneStore"; -import { useFloatingWidget } from "../../../store/visualization/useDroppedObjectsStore"; -import { useSelectedUserStore } from "../../../store/collaboration/useCollabStore"; +import { useEffect } from "react"; +import { useLoadingProgress, useRenameModeStore, useSaveVersion, useSelectedComment, useSocketStore, useWidgetSubOption } from "../../../store/builder/store"; import KeyPressListener from "../../../utils/shortcutkeys/handleShortcutKeys"; import LoadingPage from "../../templates/LoadingPage"; import ModuleToggle from "../../ui/ModuleToggle"; @@ -23,21 +11,28 @@ import Tools from "../../ui/Tools"; import SimulationPlayer from "../../ui/simulation/simulationPlayer"; import ControlsPlayer from "../controls/ControlsPlayer"; import SelectFloorPlan from "../../temporary/SelectFloorPlan"; -import { createHandleDrop } from "../../../modules/visualization/functions/handleUiDrop"; -import Scene from "../../../modules/scene/scene"; -import { useComparisonProduct, useMainProduct } from "../../../store/simulation/useSimulationStore"; -import { useProductContext } from "../../../modules/simulation/products/productContext"; 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 Scene from "../../../modules/scene/scene"; +import useModuleStore, { useThreeDStore } from "../../../store/useModuleStore"; +import { usePlayButtonStore } from "../../../store/usePlayButtonStore"; +import { useSelectedZoneStore } from "../../../store/visualization/useZoneStore"; +import { useFloatingWidget } from "../../../store/visualization/useDroppedObjectsStore"; +import { useSelectedUserStore } from "../../../store/collaboration/useCollabStore"; +import { createHandleDrop } from "../../../modules/visualization/functions/handleUiDrop"; +import { useComparisonProduct, useMainProduct } from "../../../store/simulation/useSimulationStore"; +import { useProductContext } from "../../../modules/simulation/products/productContext"; import { setAssetsApi } from "../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; import { useParams } from "react-router-dom"; import { useSceneContext } from "../../../modules/scene/sceneContext"; import { useVersionHistoryStore } from "../../../store/builder/useVersionHistoryStore"; import { useVersionContext } from "../../../modules/builder/version/versionContext"; -import VersionSaved from "../sidebarRight/versionHisory/VersionSaved"; -import Footer from "../../footer/Footer"; -import ThreadChat from "../../ui/collaboration/ThreadChat"; import { useBuilderStore } from "../../../store/builder/useBuilderStore"; +import { recentlyViewed } from "../../../services/dashboard/recentlyViewed"; +import { getUserData } from "../../../functions/getUserData"; function MainScene() { const { setMainProduct } = useMainProduct(); @@ -59,6 +54,7 @@ function MainScene() { const { products } = productStore(); const { setName, selectedAssets, setSelectedAssets } = assetStore(); const { projectId } = useParams() + const { organization, userId } = getUserData(); const { isRenameMode, setIsRenameMode } = useRenameModeStore(); const { versionHistory } = useVersionHistoryStore(); const { selectedVersionStore } = useVersionContext(); @@ -73,8 +69,16 @@ function MainScene() { }, [activeModule, clearComparisonProduct, setIsVersionSaved]) useEffect(() => { - if (versionHistory.length > 0) { - setSelectedVersion(versionHistory[0]) + if (versionHistory.length > 0 && organization && userId) { + recentlyViewed(organization, userId).then((projects) => { + const recent_opened_verisionID = (Object.values(projects?.RecentlyViewed || {})[0] as any)?.Present_version._id; + if (recent_opened_verisionID) { + const version = versionHistory.find((ver) => ver.versionId === recent_opened_verisionID); + if (version) { + setSelectedVersion(version); + } + } + }) } }, [setSelectedVersion, versionHistory]) diff --git a/app/src/pages/Project.tsx b/app/src/pages/Project.tsx index 9c297e8..0530377 100644 --- a/app/src/pages/Project.tsx +++ b/app/src/pages/Project.tsx @@ -95,9 +95,7 @@ const Project: React.FC = () => { const refreshToken = localStorage.getItem("refreshToken"); echo.warn('Validating token'); if (token && refreshToken) { - useSocketStore - .getState() - .initializeSocket(email, organization, token, refreshToken); + useSocketStore.getState().initializeSocket(email, organization, token, refreshToken); } echo.success("Project initialized and loaded successfully"); } else { diff --git a/app/src/pages/UserAuth.tsx b/app/src/pages/UserAuth.tsx index f7b89a1..153e5f0 100644 --- a/app/src/pages/UserAuth.tsx +++ b/app/src/pages/UserAuth.tsx @@ -46,10 +46,7 @@ const UserAuth: React.FC = () => { localStorage.setItem("refreshToken", res.message.refreshToken); try { - const projects = await recentlyViewed( - organization, - res.message.userId - ); + const projects = await recentlyViewed(organization, res.message.userId); if (res.message.isShare) { if (Object.values(projects.RecentlyViewed).length > 0) { const recent_opend_projectID = (Object.values(projects?.RecentlyViewed || {})[0] as any)?._id; From 175f6eac4fbd9ac8945792c33beedb2660bb27f8 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 12:32:02 +0530 Subject: [PATCH 07/17] api asset delete bug fix and wall visibililty bug fix --- .../model/eventHandlers/useEventHandlers.ts | 9 +++- .../builder/wall/Instances/instance/wall.tsx | 2 +- .../selection3D/selectionControls3D.tsx | 10 +++-- .../handlers/use3DRedoHandler.ts | 9 +++- .../handlers/use3DUndoHandler.ts | 23 ++++++++-- .../asset/floorAsset/deleteFloorAssetsApi.ts | 42 +++++++++++++++++++ .../asset/floorAsset/deleteFloorItemApi.ts | 42 ------------------- .../zone/getFloatingWidgetInput.ts | 1 - .../visulization/zone/getWidgetInputData.ts | 1 - 9 files changed, 83 insertions(+), 56 deletions(-) create mode 100644 app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi.ts delete mode 100644 app/src/services/factoryBuilder/asset/floorAsset/deleteFloorItemApi.ts diff --git a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts index 43d7ae1..6eb1a37 100644 --- a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts +++ b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts @@ -15,7 +15,7 @@ import { useSelectedAsset } from '../../../../../../store/simulation/useSimulati import { useBuilderStore } from '../../../../../../store/builder/useBuilderStore'; import { upsertProductOrEventApi } from '../../../../../../services/simulation/products/UpsertProductOrEventApi'; -import { deleteFloorItem } from '../../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi'; +import { deleteFloorAssetsApi } from '../../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi'; export function useModelEventHandlers({ boundingBox, @@ -149,7 +149,12 @@ export function useModelEventHandlers({ // REST - deleteFloorItem(organization, asset.modelUuid, asset.modelName); + deleteFloorAssetsApi({ + modelUuid: asset.modelUuid, + modelName: asset.modelName, + versionId: selectedVersion?.versionId || '', + projectId: projectId || '' + }); } else { // SOCKET diff --git a/app/src/modules/builder/wall/Instances/instance/wall.tsx b/app/src/modules/builder/wall/Instances/instance/wall.tsx index 67d5b8a..293be01 100644 --- a/app/src/modules/builder/wall/Instances/instance/wall.tsx +++ b/app/src/modules/builder/wall/Instances/instance/wall.tsx @@ -122,7 +122,7 @@ function Wall({ wall }: { readonly wall: Wall }) { castShadow receiveShadow ref={meshRef} - geometry={visible ? geometry : new THREE.BoxGeometry(0, 0)} + geometry={visible ? geometry : new THREE.BoxGeometry(0.00001, 0.00001)} position={[centerX, centerY, centerZ]} rotation={[0, -angle, 0]} userData={wall} diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx index d07d3bc..b512ca7 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx @@ -19,7 +19,7 @@ import RotateControls3D from "./rotateControls3D"; import TransformControls3D from "./transformControls3D"; import { useBuilderStore } from "../../../../../store/builder/useBuilderStore"; -import { deleteFloorItem } from '../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi'; +import { deleteFloorAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi'; const SelectionControls3D: React.FC = () => { const { camera, controls, gl, scene, raycaster, pointer } = useThree(); @@ -284,12 +284,16 @@ const SelectionControls3D: React.FC = () => { const asset = getAssetById(selectedMesh.userData.modelUuid); if (!asset) return; - if (!socket?.connected) { // REST - deleteFloorItem(organization, selectedMesh.userData.modelUuid, selectedMesh.userData.modelName); + deleteFloorAssetsApi({ + modelUuid: selectedMesh.userData.modelUuid, + modelName: selectedMesh.userData.modelName, + versionId: selectedVersion?.versionId || '', + projectId: projectId || '' + }); } else { // SOCKET diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts index 31b5fd4..1c56a0b 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts @@ -8,7 +8,7 @@ import { useSocketStore } from "../../../../../store/builder/store"; import { upsertProductOrEventApi } from "../../../../../services/simulation/products/UpsertProductOrEventApi"; import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; -import { deleteFloorItem } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi"; +import { deleteFloorAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi"; function use3DRedoHandler() { const { undoRedo3DStore, assetStore, productStore, eventStore } = useSceneContext(); @@ -177,7 +177,12 @@ function use3DRedoHandler() { if (!socket?.connected) { // REST - deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + versionId: selectedVersion?.versionId || '', + projectId: projectId || '' + }); } else { // SOCKET diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts index 021b006..620832f 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts @@ -8,7 +8,7 @@ import { useSocketStore } from "../../../../../store/builder/store"; import { upsertProductOrEventApi } from "../../../../../services/simulation/products/UpsertProductOrEventApi"; import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; -import { deleteFloorItem } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi"; +import { deleteFloorAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi"; function use3DUndoHandler() { const { undoRedo3DStore, assetStore, productStore, eventStore } = useSceneContext(); @@ -176,7 +176,12 @@ function use3DUndoHandler() { if (!socket?.connected) { // REST - deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + versionId: selectedVersion?.versionId || '', + projectId: projectId || '' + }); } else { // SOCKET @@ -254,7 +259,12 @@ function use3DUndoHandler() { if (!socket?.connected) { // REST - deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + versionId: selectedVersion?.versionId || '', + projectId: projectId || '' + }); } else { // SOCKET @@ -291,7 +301,12 @@ function use3DUndoHandler() { if (!socket?.connected) { // REST - deleteFloorItem(organization, assetData.modelUuid, assetData.modelName); + deleteFloorAssetsApi({ + modelUuid: assetData.modelUuid, + modelName: assetData.modelName, + versionId: selectedVersion?.versionId || '', + projectId: projectId || '' + }); } else { // SOCKET diff --git a/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi.ts new file mode 100644 index 0000000..f752fe4 --- /dev/null +++ b/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi.ts @@ -0,0 +1,42 @@ +let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; + +export interface DeleteFloorAssetsParams { + modelUuid: string; + modelName: string; + projectId: string; + versionId: string; +} + +export const deleteFloorAssetsApi = async (params: DeleteFloorAssetsParams) => { + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/assetDelete`, { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(params), + }); + + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + console.error("Failed to delete Floor Asset"); + } + + const result = await response.json(); + return result; + } catch (error) { + console.error("Failed to delete floor asset"); + if (error instanceof Error) { + console.log(error.message); + } else { + console.log("An unknown error occurred"); + } + } +}; diff --git a/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorItemApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorItemApi.ts deleted file mode 100644 index 1e66ec7..0000000 --- a/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorItemApi.ts +++ /dev/null @@ -1,42 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const deleteFloorItem = async ( - organization: string, - modelUuid: string, - modelName: string -) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/v1/deletefloorItem`, - { - method: "DELETE", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ organization, modelUuid, modelName }), - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - - if (!response.ok) { - console.error("Failed to delete Floor Item"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to delete floor item"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/visulization/zone/getFloatingWidgetInput.ts b/app/src/services/visulization/zone/getFloatingWidgetInput.ts index 2da71f1..7ccfa54 100644 --- a/app/src/services/visulization/zone/getFloatingWidgetInput.ts +++ b/app/src/services/visulization/zone/getFloatingWidgetInput.ts @@ -18,7 +18,6 @@ export const getFloatingWidgetInput = async (floatWidgetID: string, organization ); const newAccessToken = response.headers.get("x-access-token"); if (newAccessToken) { - //console.log("New token received:", newAccessToken); localStorage.setItem("token", newAccessToken); } diff --git a/app/src/services/visulization/zone/getWidgetInputData.ts b/app/src/services/visulization/zone/getWidgetInputData.ts index 34c41b7..e03c1fa 100644 --- a/app/src/services/visulization/zone/getWidgetInputData.ts +++ b/app/src/services/visulization/zone/getWidgetInputData.ts @@ -17,7 +17,6 @@ export const getWidgetInputData = async (chartId?: string, zoneUuid?: string, pr ); const newAccessToken = response.headers.get("x-access-token"); if (newAccessToken) { - //console.log("New token received:", newAccessToken); localStorage.setItem("token", newAccessToken); } From 4f8bf81a6054b9b5cba1daed85df9fe90eda7244 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 15:21:13 +0530 Subject: [PATCH 08/17] code optimization --- .../components/Dashboard/DashboardHome.tsx | 1 - .../properties/GlobalProperties.tsx | 11 +- app/src/modules/builder/Decal/decal.tsx | 4 +- .../Decal/decalCreator/decalCreator.tsx | 4 +- .../Decal/decalInstance/decalInstance.tsx | 12 +- .../eventHandler/useDecalEventHandlers.ts | 2 +- .../functions/handleDecalPositionSnap.ts | 20 +- app/src/modules/builder/asset/assetsGroup.tsx | 16 +- .../models/model/animator/modelAnimator.tsx | 2 +- .../model/eventHandlers/useEventHandlers.ts | 37 +- .../builder/asset/models/model/model.tsx | 9 +- .../modules/builder/asset/models/models.tsx | 2 +- app/src/modules/builder/builder.tsx | 35 +- app/src/modules/builder/csg/csg.tsx | 63 --- .../dfx/functions/convertDxfToThree.ts | 102 ++-- .../functions/getWallPointsFromBlueprint.ts | 447 ++++++++-------- .../Instances/Instance/floor2DInstance.tsx | 2 +- .../Instances/Instance/floorInstance.tsx | 4 +- .../floor/Instances/floorInstances.tsx | 4 +- .../floor/floorCreator/floorCreator.tsx | 1 - .../floor/floorCreator/referenceFloor.tsx | 2 +- .../modules/builder/functions/computeArea.ts | 44 +- .../builder/groups/calculateAreaGroup.tsx | 168 +++--- .../modules/builder/layout/layoutImage.tsx | 26 +- .../helpers/getClosestPointOnLineSegment.ts | 2 +- app/src/modules/builder/line/line.tsx | 4 +- .../point/reference/referencePoint.tsx | 14 +- .../builder/wall/Instances/wallInstances.tsx | 2 +- .../Instances/Instance/wallAssetInstance.tsx | 128 +++-- .../Instances/Instance/zone2DInstance.tsx | 2 +- .../zone/Instances/Instance/zoneInstance.tsx | 61 ++- .../zone/zoneCreator/referenceZone.tsx | 2 +- .../builder/zone/zoneCreator/zoneCreator.tsx | 1 - .../collaboration/camera/collabCams.tsx | 1 - .../collaboration/camera/collabUserIcon.tsx | 112 ++-- .../commentInstance/commentInstance.tsx | 4 +- .../comments/instances/commentInstances.tsx | 27 +- .../socket/threadSocketResponses.dev.tsx | 3 - .../modules/collaboration/users/Avatar.tsx | 82 +-- app/src/modules/scene/camera/camMode.tsx | 3 +- app/src/modules/scene/camera/switchView.tsx | 25 +- app/src/modules/scene/clouds/clouds.tsx | 2 +- app/src/modules/scene/controls/controls.tsx | 7 +- .../{ => helper}/selectionHelper.ts | 0 .../selection2D/moveControls2D.tsx | 8 +- .../selection2D/selectionControls2D.tsx | 10 +- .../selection3D/rotateControls3D.tsx | 2 +- .../selection3D/selectionControls3D.tsx | 6 +- .../handlers/use3DRedoHandler.ts | 4 +- .../handlers/use3DUndoHandler.ts | 8 +- .../undoRedo3D/undoRedo3DControls.tsx | 2 +- .../outlineInstance/outlineInstance.tsx | 2 +- .../modules/scene/tools/measurementTool.tsx | 484 +++++++++--------- .../actionHandler/useRetrieveHandler.ts | 2 +- .../simulation/actions/useActionHandler.ts | 14 +- .../simulation/analysis/ROI/roiData.tsx | 1 - .../analysis/throughPut/throughPutData.tsx | 3 +- .../modules/simulation/conveyor/conveyor.tsx | 4 +- .../conveyor/instances/conveyorInstances.tsx | 1 - app/src/modules/simulation/crane/crane.tsx | 4 +- .../instances/animator/pillarJibAnimator.tsx | 6 +- .../instances/helper/pillarJibHelper.tsx | 4 +- .../instances/instance/pillarJibInstance.tsx | 2 +- .../simulation/events/arrows/arrows.tsx | 4 +- .../events/points/creator/pointsCreator.tsx | 4 +- .../functions/handleAddEventToProduct.ts | 2 - .../instances/instance/pointInstance.tsx | 6 +- .../simulation/events/points/points.tsx | 7 +- .../triggerConnections/triggerConnector.tsx | 22 +- app/src/modules/simulation/human/human.tsx | 4 +- .../animator/manufacturerAnimator.tsx | 4 +- .../instances/animator/operatorAnimator.tsx | 4 +- .../instances/animator/workerAnimator.tsx | 6 +- .../instance/actions/manufacturerInstance.tsx | 16 +- .../instance/actions/operatorInstance.tsx | 31 +- .../instance/actions/workerInstance.tsx | 18 +- .../instances/instance/humanInstance.tsx | 2 +- .../human/instances/instance/humanUi.tsx | 27 +- .../machineInstance/machineInstance.tsx | 4 +- .../machine/instances/machineInstances.tsx | 26 +- .../modules/simulation/machine/machine.tsx | 4 +- .../simulation/materials/materials.tsx | 4 +- .../instances/animator/roboticArmAnimator.tsx | 2 +- .../armInstance/roboticArmInstance.tsx | 11 +- .../instances/ikInstance/ikInstance.tsx | 4 +- .../functions/determineExecutionOrder.ts | 4 +- .../spatialUI/arm/PickDropPoints.tsx | 94 ++-- .../spatialUI/vehicle/useDraggableGLTF.ts | 202 ++++---- .../storageUnitInstance.tsx | 8 +- .../simulation/storageUnit/storageUnit.tsx | 5 +- .../modules/simulation/triggers/trigger.tsx | 4 +- .../triggerHandler/useTriggerHandler.ts | 271 +++++----- .../instances/animator/interactivePoint.tsx | 60 +-- .../instances/animator/vehicleAnimator.tsx | 15 +- .../instances/instance/vehicleInstance.tsx | 2 +- .../vehicle/instances/vehicleInstances.tsx | 26 +- .../vehicle/navMesh/polygonGenerator.tsx | 3 +- app/src/services/dashboard/deleteProject.ts | 4 +- app/src/services/dashboard/deleteTrash.ts | 4 +- .../services/dashboard/duplicateProject.ts | 4 +- app/src/services/dashboard/recentlyViewed.ts | 4 +- app/src/services/dashboard/restoreTrash.ts | 4 +- app/src/services/dashboard/searchProjects.ts | 4 +- .../services/dashboard/trashSearchProject.ts | 4 +- app/src/services/dashboard/viewProject.ts | 4 +- .../factoryBuilder/aisle/deleteAisleApi.ts | 50 +- .../factoryBuilder/aisle/getAisleApi.ts | 51 +- .../factoryBuilder/aisle/upsertAisleApi.ts | 60 +-- .../asset/assets/getAssetImages.ts | 35 +- .../asset/assets/getAssetModel.ts | 39 +- .../asset/assets/getAssetThumbnail.ts | 11 +- .../asset/assets/getCategoryAsset.ts | 34 +- .../asset/decals/getCategoryDecals.ts | 34 +- ...oorAssetsApi.ts => deleteFloorAssetApi.ts} | 13 +- .../asset/floorAsset/getAssetField.ts | 11 +- .../asset/floorAsset/getFloorItemsApi.ts | 57 +-- .../asset/floorAsset/setAssetsApi.ts | 66 +-- .../asset/wallAsset/deleteWallAssetApi.ts | 9 +- .../asset/wallAsset/getWallAssetsApi.ts | 9 +- .../asset/wallAsset/upsertWallAssetApi.ts | 9 +- .../factoryBuilder/camera/getCameraApi.ts | 64 ++- .../factoryBuilder/camera/setCameraApi.ts | 11 +- .../factoryBuilder/collab/getActiveUsers.ts | 58 +-- .../collab/getProjectSharedList.ts | 51 +- .../factoryBuilder/collab/getSearchUsers.ts | 51 +- .../factoryBuilder/collab/getUsersApi.ts | 53 +- .../factoryBuilder/collab/giveCollabAccess.ts | 57 +-- .../factoryBuilder/collab/shareAccess.ts | 68 ++- .../factoryBuilder/collab/shareProject.ts | 51 +- .../factoryBuilder/comments/addCommentsApi.ts | 77 ++- .../comments/createThreadApi.ts | 72 ++- .../comments/deleteCommentApi.ts | 76 ++- .../comments/deleteThreadApi.ts | 66 ++- .../comments/editThreadTitleApi.ts | 76 ++- .../factoryBuilder/comments/getAllThreads.ts | 58 +-- .../environment/findEnvironment.ts | 57 +-- .../environment/setEnvironment.ts | 83 ++- .../factoryBuilder/floor/deleteFloorApi.ts | 9 +- .../factoryBuilder/floor/getFloorsApi.ts | 9 +- .../factoryBuilder/floor/upsertFloorApi.ts | 9 +- .../signInSignUp/changePasswordApi.ts | 43 +- .../signInSignUp/checkEmailApi.ts | 37 +- .../factoryBuilder/signInSignUp/signInApi.ts | 33 +- .../factoryBuilder/signInSignUp/signUpApi.ts | 45 +- .../signInSignUp/verifyOtpApi.ts | 45 +- .../versionControl/addVersionApi.ts | 12 +- .../versionControl/getVersionDataApi.ts | 13 +- .../versionControl/getVersionHistoryApi.ts | 54 +- .../factoryBuilder/wall/deleteWallApi.ts | 10 +- .../factoryBuilder/wall/getWallsApi.ts | 10 +- .../factoryBuilder/wall/upsertWallApi.ts | 10 +- .../webWorkers/distanceWorker.js | 6 +- .../factoryBuilder/zone/deleteZoneApi.ts | 10 +- .../factoryBuilder/zone/getZonesApi.ts | 10 +- .../factoryBuilder/zone/upsertZoneApi.ts | 10 +- .../products/UpsertProductOrEventApi.ts | 12 +- .../simulation/products/deleteEventDataApi.ts | 59 +-- .../simulation/products/deleteProductApi.ts | 57 +-- .../simulation/products/getProductApi.ts | 59 +-- .../simulation/products/getallProductsApi.ts | 55 +- .../simulation/products/renameProductApi.ts | 62 +-- .../visulization/zone/zoneCameraUpdation.ts | 2 +- 162 files changed, 2381 insertions(+), 2822 deletions(-) delete mode 100644 app/src/modules/builder/csg/csg.tsx rename app/src/modules/scene/controls/selectionControls/{ => helper}/selectionHelper.ts (100%) rename app/src/services/factoryBuilder/asset/floorAsset/{deleteFloorAssetsApi.ts => deleteFloorAssetApi.ts} (72%) diff --git a/app/src/components/Dashboard/DashboardHome.tsx b/app/src/components/Dashboard/DashboardHome.tsx index cc94530..96761f8 100644 --- a/app/src/components/Dashboard/DashboardHome.tsx +++ b/app/src/components/Dashboard/DashboardHome.tsx @@ -120,7 +120,6 @@ const DashboardHome: React.FC = () => { } return ( - projectList && projectList.map((project) => ( { const { email, userId, organization } = getUserData(); const optimizeScene = async (value: any) => { - + if (!projectId) return; setEnvironment( organization, userId, @@ -44,7 +44,7 @@ const GlobalProperties: React.FC = () => { }; const limitRenderDistance = async () => { - + if (!projectId) return; if (limitDistance) { setEnvironment( organization, @@ -78,6 +78,7 @@ const GlobalProperties: React.FC = () => { } const updatedDist = async (value: number) => { + if (!projectId) return; setRenderDistance(value); // setDistance(value); const data = await setEnvironment( @@ -95,6 +96,8 @@ const GlobalProperties: React.FC = () => { // Function to toggle roof visibility const changeRoofVisibility = async () => { + if (!projectId) return; + //using REST const data = await setEnvironment( organization, @@ -123,6 +126,8 @@ const GlobalProperties: React.FC = () => { }; const changeWallVisibility = async () => { + if (!projectId) return; + //using REST const data = await setEnvironment( organization, @@ -150,6 +155,8 @@ const GlobalProperties: React.FC = () => { }; const shadowVisibility = async () => { + if (!projectId) return; + //using REST const data = await setEnvironment( organization, diff --git a/app/src/modules/builder/Decal/decal.tsx b/app/src/modules/builder/Decal/decal.tsx index d14e150..737c099 100644 --- a/app/src/modules/builder/Decal/decal.tsx +++ b/app/src/modules/builder/Decal/decal.tsx @@ -3,11 +3,9 @@ import DecalCreator from './decalCreator/decalCreator' function Decal() { return ( - <> - + - ) } diff --git a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx index 1870191..5e9ebaa 100644 --- a/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx +++ b/app/src/modules/builder/Decal/decalCreator/decalCreator.tsx @@ -36,8 +36,8 @@ function DecalCreator() { pointer.y = -(event.clientY / window.innerHeight) * 2 + 1; raycaster.setFromCamera(pointer, camera); const intersects = raycaster.intersectObjects(scene.children, true); - const wallIntersect = intersects.find(i => i.object.userData && i.object.userData.wallUuid); - const floorIntersect = intersects.find(i => i.object.userData && i.object.userData.floorUuid); + const wallIntersect = intersects.find(i => i.object.userData.wallUuid); + const floorIntersect = intersects.find(i => i.object.userData.floorUuid); if (wallIntersect) { const wall = getWallById(wallIntersect.object.userData.wallUuid); diff --git a/app/src/modules/builder/Decal/decalInstance/decalInstance.tsx b/app/src/modules/builder/Decal/decalInstance/decalInstance.tsx index f0bc7c4..9a095d9 100644 --- a/app/src/modules/builder/Decal/decalInstance/decalInstance.tsx +++ b/app/src/modules/builder/Decal/decalInstance/decalInstance.tsx @@ -10,7 +10,7 @@ import { useEffect, useRef, useState } from 'react'; import { useDecalEventHandlers } from '../eventHandler/useDecalEventHandlers'; -function DecalInstance({ parent, visible = true, decal, zPosition = decal.decalPosition[2] }: { parent: Wall | Floor; visible?: boolean, decal: Decal, zPosition?: number }) { +function DecalInstance({ parent, visible = true, decal, zPosition = decal.decalPosition[2] }: Readonly<{ parent: Wall | Floor; visible?: boolean, decal: Decal, zPosition?: number }>) { const url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; const { selectedDecal, deletableDecal, setSelectedDecal, setDeletableDecal } = useBuilderStore(); const { toolMode } = useToolMode(); @@ -110,7 +110,7 @@ function DecalInstance({ parent, visible = true, decal, zPosition = decal.decalP console.error("Error storing texture in IndexedDB:", error); } }, - undefined, + undefined, (error) => { echo.error(`Error loading texture from backend: ${decal.decalName}`); loadDefaultTexture(); @@ -129,11 +129,11 @@ function DecalInstance({ parent, visible = true, decal, zPosition = decal.decalP useEffect(() => { if (!toggleView && activeModule === 'builder') { - if (toolMode !== 'cursor') { - if (selectedDecal) setSelectedDecal(null); + if (toolMode !== 'cursor' && selectedDecal) { + setSelectedDecal(null); } - if (toolMode !== '3D-Delete') { - if (deletableDecal) setDeletableDecal(null); + if (toolMode !== '3D-Delete' && deletableDecal) { + setDeletableDecal(null); } } else { if (selectedDecal) setSelectedDecal(null); diff --git a/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts b/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts index 1db359e..b3a8fda 100644 --- a/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts +++ b/app/src/modules/builder/Decal/eventHandler/useDecalEventHandlers.ts @@ -304,7 +304,7 @@ export function useDecalEventHandlers({ }; const handlePointerMissed = () => { - if (selectedDecal && selectedDecal.decalMesh && selectedDecal.decalMesh.userData.decalUuid === decal.decalUuid) { + if (selectedDecal?.decalMesh && selectedDecal.decalMesh.userData.decalUuid === decal.decalUuid) { setSelectedDecal(null); setKeyEvent(""); } diff --git a/app/src/modules/builder/Decal/functions/handleDecalPositionSnap.ts b/app/src/modules/builder/Decal/functions/handleDecalPositionSnap.ts index 63d6d2c..51e3915 100644 --- a/app/src/modules/builder/Decal/functions/handleDecalPositionSnap.ts +++ b/app/src/modules/builder/Decal/functions/handleDecalPositionSnap.ts @@ -20,21 +20,11 @@ function handleDecalPositionSnap( ): THREE.Vector3 { let rawPos: [number, number, number]; - if ("wallUuid" in parent) { - // snap relative to wall - rawPos = [ - point.x + offset.x, - point.y + offset.y, - decal.decalPosition[2], // keep depth as-is - ]; - } else { - // snap relative to floor - rawPos = [ - point.x + offset.x, - point.y + offset.y, - decal.decalPosition[2], - ]; - } + rawPos = [ + point.x + offset.x, + point.y + offset.y, + decal.decalPosition[2], + ]; const snapped = snapToFixedPoint(rawPos, snapInterval); return new THREE.Vector3(snapped[0], snapped[1], snapped[2]); diff --git a/app/src/modules/builder/asset/assetsGroup.tsx b/app/src/modules/builder/asset/assetsGroup.tsx index dfad400..ecdc926 100644 --- a/app/src/modules/builder/asset/assetsGroup.tsx +++ b/app/src/modules/builder/asset/assetsGroup.tsx @@ -33,7 +33,7 @@ function AssetsGroup({ plane }: { readonly plane: RefMesh }) { const { selectedItem, setSelectedItem } = useSelectedItem(); const { projectId } = useParams(); const { isRenameMode, setIsRenameMode } = useRenameModeStore(); - const { userId, organization } = getUserData(); + const { userId } = getUserData(); const { setTop } = useTopData(); const { setLeft } = useLeftData(); @@ -64,7 +64,7 @@ function AssetsGroup({ plane }: { readonly plane: RefMesh }) { } }; - getFloorAssets(organization, projectId, selectedVersion?.versionId || '').then((data) => { + getFloorAssets(projectId, selectedVersion?.versionId || '').then((data) => { if (data && data.length > 0) { const uniqueItems = (data as FloorItems).filter((item, index, self) => index === self.findIndex((t) => t.assetId === item.assetId)); totalAssets = uniqueItems.length; @@ -96,7 +96,7 @@ function AssetsGroup({ plane }: { readonly plane: RefMesh }) { if (loadedAssets === totalAssets) { const assets: Asset[] = []; - getFloorAssets(organization, projectId, selectedVersion.versionId || '').then((data: FloorItems) => { + getFloorAssets(projectId, selectedVersion.versionId || '').then((data: FloorItems) => { data.forEach((item) => { if (item.eventData) { assets.push({ @@ -374,12 +374,10 @@ function AssetsGroup({ plane }: { readonly plane: RefMesh }) { canvasElement.addEventListener("dragover", onDragOver); canvasElement.addEventListener("mousemove", onMouseMove); canvasElement.addEventListener("mouseup", onMouseUp); - } else { - if ((controls as CameraControls)) { - const target = (controls as CameraControls).getTarget(new THREE.Vector3()); - (controls as CameraControls).setTarget(target.x, 0, target.z, true); - setSelectedFloorAsset(null); - } + } else if ((controls as CameraControls)) { + const target = (controls as CameraControls).getTarget(new THREE.Vector3()); + (controls as CameraControls).setTarget(target.x, 0, target.z, true); + setSelectedFloorAsset(null); } return () => { diff --git a/app/src/modules/builder/asset/models/model/animator/modelAnimator.tsx b/app/src/modules/builder/asset/models/model/animator/modelAnimator.tsx index d2c76eb..d79df60 100644 --- a/app/src/modules/builder/asset/models/model/animator/modelAnimator.tsx +++ b/app/src/modules/builder/asset/models/model/animator/modelAnimator.tsx @@ -34,7 +34,7 @@ export function ModelAnimator({ }, [asset.animationState]); useEffect(() => { - if (!gltfScene || !gltfScene.animations || gltfScene.animations.length === 0) return; + if (!gltfScene.animations || gltfScene.animations.length === 0) return; mixerRef.current = new THREE.AnimationMixer(gltfScene); diff --git a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts index 6eb1a37..4b97ddb 100644 --- a/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts +++ b/app/src/modules/builder/asset/models/model/eventHandlers/useEventHandlers.ts @@ -15,7 +15,7 @@ import { useSelectedAsset } from '../../../../../../store/simulation/useSimulati import { useBuilderStore } from '../../../../../../store/builder/useBuilderStore'; import { upsertProductOrEventApi } from '../../../../../../services/simulation/products/UpsertProductOrEventApi'; -import { deleteFloorAssetsApi } from '../../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi'; +import { deleteFloorAssetApi } from '../../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetApi'; export function useModelEventHandlers({ boundingBox, @@ -146,10 +146,9 @@ export function useModelEventHandlers({ if (activeTool === 'delete' && deletableFloorAsset && deletableFloorAsset.uuid === asset.modelUuid) { if (!socket?.connected) { - // REST - deleteFloorAssetsApi({ + deleteFloorAssetApi({ modelUuid: asset.modelUuid, modelName: asset.modelName, versionId: selectedVersion?.versionId || '', @@ -261,30 +260,16 @@ export function useModelEventHandlers({ if (asset.modelUuid) { const canvasElement = gl.domElement; const isInProduct = getIsEventInProduct(selectedProduct.productUuid, asset.modelUuid); - if (isInProduct) { - const event = getEventByModelUuid(asset.modelUuid); - if (event) { - setSelectedAsset(event); - const canvasRect = canvasElement.getBoundingClientRect(); - const relativeX = evt.clientX - canvasRect.left; - const relativeY = evt.clientY - canvasRect.top; - setTop(relativeY); - setLeft(relativeX); - } else { - clearSelectedAsset(); - } + const event = getEventByModelUuid(asset.modelUuid); + if (event) { + setSelectedAsset(event); + const canvasRect = canvasElement.getBoundingClientRect(); + const relativeX = evt.clientX - canvasRect.left; + const relativeY = evt.clientY - canvasRect.top; + setTop(relativeY); + setLeft(relativeX); } else { - const event = getEventByModelUuid(asset.modelUuid); - if (event) { - setSelectedAsset(event) - const canvasRect = canvasElement.getBoundingClientRect(); - const relativeX = evt.clientX - canvasRect.left; - const relativeY = evt.clientY - canvasRect.top; - setTop(relativeY); - setLeft(relativeX); - } else { - clearSelectedAsset() - } + clearSelectedAsset(); } } else { clearSelectedAsset() diff --git a/app/src/modules/builder/asset/models/model/model.tsx b/app/src/modules/builder/asset/models/model/model.tsx index a402cf1..cc49d5a 100644 --- a/app/src/modules/builder/asset/models/model/model.tsx +++ b/app/src/modules/builder/asset/models/model/model.tsx @@ -13,7 +13,7 @@ import { getAssetFieldApi } from '../../../../../services/factoryBuilder/asset/f import { ModelAnimator } from './animator/modelAnimator'; import { useModelEventHandlers } from './eventHandlers/useEventHandlers'; -function Model({ asset, isRendered, loader }: { readonly asset: Asset, isRendered: boolean, loader: GLTFLoader }) { +function Model({ asset, isRendered, loader }: Readonly<{ asset: Asset; isRendered: boolean; loader: GLTFLoader }>) { const url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; const savedTheme: string = localStorage.getItem("theme") || "light"; const { toolMode } = useToolMode(); @@ -36,12 +36,7 @@ function Model({ asset, isRendered, loader }: { readonly asset: Asset, isRendere const fieldData: IK[] = data.data; setFieldData(fieldData); } - } else if (data.type === 'Conveyor') { - if (data.data) { - const fieldData = data.data; - setFieldData(fieldData); - } - } else if (data.type === 'Crane') { + } else if (data.type === 'Conveyor' || data.type === 'Crane') { if (data.data) { const fieldData = data.data; setFieldData(fieldData); diff --git a/app/src/modules/builder/asset/models/models.tsx b/app/src/modules/builder/asset/models/models.tsx index e54e761..78eacab 100644 --- a/app/src/modules/builder/asset/models/models.tsx +++ b/app/src/modules/builder/asset/models/models.tsx @@ -12,7 +12,7 @@ import { GLTFLoader } from "three/examples/jsm/Addons"; const distanceWorker = new Worker(new URL("../../../../services/factoryBuilder/webWorkers/distanceWorker.js", import.meta.url)); -function Models({ loader }: { loader: GLTFLoader }) { +function Models({ loader }: { readonly loader: GLTFLoader }) { const { controls, camera } = useThree(); const assetGroupRef = useRef(null); const { assetStore } = useSceneContext(); diff --git a/app/src/modules/builder/builder.tsx b/app/src/modules/builder/builder.tsx index d7b8d34..574a2bd 100644 --- a/app/src/modules/builder/builder.tsx +++ b/app/src/modules/builder/builder.tsx @@ -7,15 +7,7 @@ import { Geometry } from "@react-three/csg"; ////////// Zustand State Imports ////////// -import { - useToggleView, - useWallVisibility, - useRoofVisibility, - useShadows, - useToolMode, - useRenderDistance, - useLimitDistance, -} from "../../store/builder/store"; +import { useToggleView, useWallVisibility, useRoofVisibility, useShadows, useToolMode, useRenderDistance, useLimitDistance } from "../../store/builder/store"; ////////// 3D Function Imports ////////// @@ -23,8 +15,6 @@ import * as Types from "../../types/world/worldTypes"; import SocketResponses from "../collaboration/socket/socketResponses.dev"; import Ground from "../scene/environment/ground"; -import { findEnvironment } from "../../services/factoryBuilder/environment/findEnvironment"; - import MeasurementTool from "../scene/tools/measurementTool"; import NavMesh from "../simulation/vehicle/navMesh/navMesh"; import CalculateAreaGroup from "./groups/calculateAreaGroup"; @@ -41,6 +31,7 @@ import Decal from "./Decal/decal"; import { useParams } from "react-router-dom"; import { useBuilderStore } from "../../store/builder/useBuilderStore"; import { getUserData } from "../../functions/getUserData"; +import { findEnvironment } from "../../services/factoryBuilder/environment/findEnvironment"; export default function Builder() { const state = useThree(); @@ -58,7 +49,6 @@ export default function Builder() { const { setHoveredPoint, setHoveredLine } = useBuilderStore(); const { userId, organization } = getUserData(); - useEffect(() => { if (!toggleView) { setHoveredLine(null); @@ -69,19 +59,16 @@ export default function Builder() { }, [toggleView]); useEffect(() => { + if (!projectId) return; - async function fetchVisibility() { - const data = await findEnvironment(organization, userId, projectId); - if (data) { - setRoofVisibility(data.roofVisibility); - setWallVisibility(data.wallVisibility); - setShadows(data.shadowVisibility); - setRenderDistance(data.renderDistance); - setLimitDistance(data.limitDistance); - } - } - fetchVisibility(); - }, []); + findEnvironment(projectId).then((data) => { + setRoofVisibility(data.roofVisibility); + setWallVisibility(data.wallVisibility); + setShadows(data.shadowVisibility); + setRenderDistance(data.renderDistance); + setLimitDistance(data.limitDistance); + }) + }, [projectId]); useFrame(() => { if (csgRef.current) { diff --git a/app/src/modules/builder/csg/csg.tsx b/app/src/modules/builder/csg/csg.tsx deleted file mode 100644 index 0c50ff7..0000000 --- a/app/src/modules/builder/csg/csg.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import * as THREE from "three"; -import { Geometry, Base, Subtraction } from "@react-three/csg"; -import { useRef } from "react"; -import { useToolMode } from "../../../store/builder/store"; - -export interface CsgProps { - position: THREE.Vector3 | [number, number, number]; - scale: THREE.Vector3 | [number, number, number]; - model: THREE.Object3D; - hoveredDeletableWallItem: { current: THREE.Mesh | null }; -} - -export const Csg: React.FC = (props) => { - const { toolMode } = useToolMode(); - const modelRef = useRef(); - const originalMaterials = useRef>(new Map()); - - const handleHover = (hovered: boolean, object: THREE.Mesh | null) => { - if (modelRef.current && toolMode === "3D-Delete") { - modelRef.current.traverse((child) => { - if (child instanceof THREE.Mesh) { - if (!originalMaterials.current.has(child)) { - originalMaterials.current.set(child, child.material); - } - child.material = child.material.clone(); - child.material.color.set(hovered && toolMode === "3D-Delete" ? 0xff0000 : (originalMaterials.current.get(child) as any).color); - } - }); - } - let currentObject = object; - while (currentObject) { - if (currentObject.name === "Scene") { - break; - } - currentObject = currentObject.parent as THREE.Mesh; - } - if (currentObject) { - props.hoveredDeletableWallItem.current = hovered ? currentObject : null; - } - }; - - return ( - - - - - - - { - e.stopPropagation(); - handleHover(true, e.object.parent); - }} - onPointerOut={(e: any) => { - e.stopPropagation(); - handleHover(false, null); - }} - /> - - ); -}; diff --git a/app/src/modules/builder/dfx/functions/convertDxfToThree.ts b/app/src/modules/builder/dfx/functions/convertDxfToThree.ts index 5951534..9f5258c 100644 --- a/app/src/modules/builder/dfx/functions/convertDxfToThree.ts +++ b/app/src/modules/builder/dfx/functions/convertDxfToThree.ts @@ -1,65 +1,55 @@ import { BufferGeometry, Vector3 } from "three"; + type DXFData = any; + export const convertDXFToThree = (dxfData: DXFData): BufferGeometry[] => { - const geometries: BufferGeometry[] = []; - const UNIT = 1000; - if (dxfData.entities) { - dxfData.entities.forEach((entity: any) => { - // LINE - if (entity.type === "LINE" && entity.vertices) { - const points = [ - new Vector3(entity.vertices[0].x, entity.vertices[0].y, 0), - new Vector3(entity.vertices[1].x, entity.vertices[1].y, 0), - ]; - const geometry = new BufferGeometry().setFromPoints(points); - geometry.scale(1 / UNIT, 1 / UNIT, 1 / UNIT); - geometries.push(geometry); - } + const geometries: BufferGeometry[] = []; + const UNIT = 1000; + if (dxfData.entities) { + dxfData.entities.forEach((entity: any) => { + // LINE + if (entity.type === "LINE" && entity.vertices) { + const points = [ + new Vector3(entity.vertices[0].x, entity.vertices[0].y, 0), + new Vector3(entity.vertices[1].x, entity.vertices[1].y, 0), + ]; + const geometry = new BufferGeometry().setFromPoints(points); + geometry.scale(1 / UNIT, 1 / UNIT, 1 / UNIT); + geometries.push(geometry); + } - // LWPOLYLINE - else if (entity.type === "LWPOLYLINE" && entity.vertices) { - const points: Vector3[] = entity.vertices.map( - (v: any) => new Vector3(v.x, v.y, 0) - ); + // LWPOLYLINE + else if (entity.type === "LWPOLYLINE" && entity.vertices) { + const points: Vector3[] = entity.vertices.map((v: any) => new Vector3(v.x, v.y, 0)); - for (let i = 0; i < points.length - 1; i++) { - const segment = [points[i], points[i + 1]]; - const geometry = new BufferGeometry().setFromPoints(segment); - geometry.scale(1 / UNIT, 1 / UNIT, 1 / UNIT); - geometries.push(geometry); - } - } + for (let i = 0; i < points.length - 1; i++) { + const segment = [points[i], points[i + 1]]; + const geometry = new BufferGeometry().setFromPoints(segment); + geometry.scale(1 / UNIT, 1 / UNIT, 1 / UNIT); + geometries.push(geometry); + } + } - // ARC - else if ( - entity.type === "ARC" && - entity.center && - entity.radius !== undefined - ) { - const { center, radius, startAngle, endAngle } = entity; - if ( - center === undefined || - radius === undefined || - startAngle === undefined || - endAngle === undefined - ) - return; - const numSegments = 32; - const points: Vector3[] = []; + // ARC + else if (entity.type === "ARC" && entity.center && entity.radius !== undefined) { + const { center, radius, startAngle, endAngle } = entity; + if (center === undefined || radius === undefined || startAngle === undefined || endAngle === undefined) return; + const numSegments = 32; + const points: Vector3[] = []; - for (let i = 0; i <= numSegments; i++) { - const t = i / numSegments; - const angle = startAngle + t * (endAngle - startAngle); // linear interpolation - const x = center.x + radius * Math.cos(angle); - const y = center.y + radius * Math.sin(angle); - points.push(new Vector3(x, y, 0)); - } + for (let i = 0; i <= numSegments; i++) { + const t = i / numSegments; + const angle = startAngle + t * (endAngle - startAngle); // linear interpolation + const x = center.x + radius * Math.cos(angle); + const y = center.y + radius * Math.sin(angle); + points.push(new Vector3(x, y, 0)); + } - const geometry = new BufferGeometry().setFromPoints(points); - geometry.scale(1 / UNIT, 1 / UNIT, 1 / UNIT); - geometries.push(geometry); - } - }); - } - return geometries; + const geometry = new BufferGeometry().setFromPoints(points); + geometry.scale(1 / UNIT, 1 / UNIT, 1 / UNIT); + geometries.push(geometry); + } + }); + } + return geometries; }; diff --git a/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts b/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts index 2087899..f655d35 100644 --- a/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts +++ b/app/src/modules/builder/dfx/functions/getWallPointsFromBlueprint.ts @@ -1,21 +1,18 @@ -import { MathUtils, Vector3, BufferGeometry } from "three"; -import { useActiveLayer } from "../../../../store/builder/store"; -import { useBuilderStore } from "../../../../store/builder/useBuilderStore"; -import { wait } from "@testing-library/user-event/dist/utils"; +import { MathUtils, Vector3 } from "three"; type DXFData = any; // Replace with actual DXF data type type DXFEntity = any; // Replace with actual DXF entity type type WallLineVertex = [Vector3, string, number, string]; // Represents a wall segment with start point, ID, weight, and type interface Props { - parsedData?: DXFData; // Parsed DXF file data - setDxfWallGenerate?: any; // Callback to set generated walls - objValue: any; // Object position values for offset calculation - wallThickness: number; - wallHeight: number; - outsideMaterial: string; - insideMaterial: string; - activeLayer: number; // Active layer for wall points - addWall: (wall: Wall) => void; // Function to add a wall to the scene - walls: Wall[]; // Array of walls to be processed + parsedData?: DXFData; // Parsed DXF file data + setDxfWallGenerate?: any; // Callback to set generated walls + objValue: any; // Object position values for offset calculation + wallThickness: number; + wallHeight: number; + outsideMaterial: string; + insideMaterial: string; + activeLayer: number; // Active layer for wall points + addWall: (wall: Wall) => void; // Function to add a wall to the scene + walls: Wall[]; // Array of walls to be processed } /** @@ -29,230 +26,230 @@ interface Props { * @param {Object} params.objValue - Contains x,y,z offsets for position adjustment */ export function getWallPointsFromBlueprint({ - parsedData, - setDxfWallGenerate, - objValue, - wallThickness, - wallHeight, - outsideMaterial, - insideMaterial, - activeLayer, - addWall, - walls, + parsedData, + setDxfWallGenerate, + objValue, + wallThickness, + wallHeight, + outsideMaterial, + insideMaterial, + activeLayer, + addWall, + walls, }: Props) { - // Early return if no data is provided - if (!parsedData) return; - if (!parsedData.entities) return; + // Early return if no data is provided + if (!parsedData) return; + if (!parsedData.entities) return; - const unit = 1000; // Conversion factor from millimeters to meters - const wallVertex: any[] = []; // Array to store wall vertices - const findExistingPoint = (vec: Vector3): Point | undefined => { - for (const wall of wallVertex) { - for (const pt of wall.points) { - const pos = new Vector3(...pt.position); - if (pos.equals(vec)) return pt; - } - } - return undefined; - }; - - // Process each entity in the DXF file - parsedData.entities.forEach((entity: DXFEntity) => { - // Handle LINE entities - if (entity.type === "LINE" && entity.vertices) { - // Create start and end vectors with unit conversion and position offset - const startVec = new Vector3( - entity.vertices[0].x / unit, - 0.01, // Slightly above ground to avoid z-fighting - -entity.vertices[0].y / unit // Invert Y-axis to match Three.js coordinate system - ).add(new Vector3(objValue.x, 0, objValue.z)); - - const endVec = new Vector3( - entity.vertices[1].x / unit, - 0.01, - -entity.vertices[1].y / unit - ).add(new Vector3(objValue.x, 0, objValue.z)); - - // Create start and end points - const existingStart = findExistingPoint(startVec); - const startPoint: Point = existingStart || { - pointUuid: MathUtils.generateUUID(), - pointType: "Wall", - position: [startVec.x, startVec.y, startVec.z], - layer: activeLayer, - }; - - const existingEnd = findExistingPoint(endVec); - const endPoint: Point = existingEnd || { - pointUuid: MathUtils.generateUUID(), - pointType: "Wall", - position: [endVec.x, endVec.y, endVec.z], - layer: activeLayer, - }; - - // Create the wall - const wallSet: Wall = { - wallUuid: MathUtils.generateUUID(), - points: [startPoint, endPoint], // Store start and end points - outsideMaterial: insideMaterial, - insideMaterial: outsideMaterial, - wallThickness: wallThickness, - wallHeight: wallHeight, - decals: [], - }; - wallVertex.push(wallSet); // Store wall segment in array - // Add the wall to the scene - // addWall(wallSet); - } - - // Handle LWPOLYLINE entities (connected line segments) - else if (entity.type === "LWPOLYLINE" && entity.vertices) { - let firstPoint: Point | undefined; // Store first point for closing the polyline - - // Process each vertex pair in the polyline - for (let i = 0; i < entity.vertices.length - 1; i++) { - // Convert vertices to Three.js vectors with offset - const startVec = new Vector3( - entity.vertices[i].x / unit, - 0.01, - -entity.vertices[i].y / unit - ).add(new Vector3(objValue.x, 0, objValue.z)); - - const endVec = new Vector3( - entity.vertices[i + 1].x / unit, - 0.01, - -entity.vertices[i + 1].y / unit - ).add(new Vector3(objValue.x, 0, objValue.z)); - - // Create start and end points - const existingStart = findExistingPoint(startVec); - const startPoint: Point = existingStart || { - pointUuid: MathUtils.generateUUID(), // Generate unique ID for new points - pointType: "Wall", // Type identifier - position: [startVec.x, startVec.y, startVec.z], // Position in 3D space - layer: activeLayer, - }; - - const existingEnd = findExistingPoint(endVec); - const endPoint: Point = existingEnd || { - pointUuid: MathUtils.generateUUID(), // Generate unique ID for new points - pointType: "Wall", // Type identifier - position: [endVec.x, endVec.y, endVec.z], // Position in 3D space - layer: activeLayer, - }; - - // Create the wall segment - const wallSet: Wall = { - wallUuid: MathUtils.generateUUID(), - points: [startPoint, endPoint], // Store start and end points - outsideMaterial: insideMaterial, - insideMaterial: outsideMaterial, - wallThickness: wallThickness, - wallHeight: wallHeight, - decals: [], - }; - - // Add the wall segment - // addWall(wallSet); - wallVertex.push(wallSet); - // Store first point and create closing segment if this is the last vertex - if (i === 0) firstPoint = startPoint; - if (i === entity.vertices.length - 2 && firstPoint) { - const closingWallSet: Wall = { - wallUuid: MathUtils.generateUUID(), - points: [endPoint, firstPoint], // Create closing segment - outsideMaterial: insideMaterial, - insideMaterial: outsideMaterial, - wallThickness: wallThickness, - wallHeight: wallHeight, - decals: [], - }; - // Add the closing wall - wallVertex.push(closingWallSet); - // addWall(closingWallSet); + const unit = 1000; // Conversion factor from millimeters to meters + const wallVertex: any[] = []; // Array to store wall vertices + const findExistingPoint = (vec: Vector3): Point | undefined => { + for (const wall of wallVertex) { + for (const pt of wall.points) { + const pos = new Vector3(...pt.position); + if (pos.equals(vec)) return pt; + } } - } - } + return undefined; + }; - // Handle ARC entities - else if (entity.type === "ARC") { - const { center, radius, startAngle, endAngle } = entity; + // Process each entity in the DXF file + parsedData.entities.forEach((entity: DXFEntity) => { + // Handle LINE entities + if (entity.type === "LINE" && entity.vertices) { + // Create start and end vectors with unit conversion and position offset + const startVec = new Vector3( + entity.vertices[0].x / unit, + 0.01, // Slightly above ground to avoid z-fighting + -entity.vertices[0].y / unit // Invert Y-axis to match Three.js coordinate system + ).add(new Vector3(objValue.x, 0, objValue.z)); - // Validate required ARC properties - if ( - !center || - radius === undefined || - startAngle === undefined || - endAngle === undefined - ) { - return; - } + const endVec = new Vector3( + entity.vertices[1].x / unit, + 0.01, + -entity.vertices[1].y / unit + ).add(new Vector3(objValue.x, 0, objValue.z)); - // Convert ARC to series of line segments - const numSegments = 16; // Number of segments to approximate the arc - const angleStep = (endAngle - startAngle) / numSegments; - const arcPoints: Vector3[] = []; // Stores points along the arc + // Create start and end points + const existingStart = findExistingPoint(startVec); + const startPoint: Point = existingStart || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [startVec.x, startVec.y, startVec.z], + layer: activeLayer, + }; - // Generate points along the arc - for (let i = 0; i <= numSegments; i++) { - const angle = startAngle + i * angleStep; - // Calculate arc point in DXF coordinate system - const x = center.x + radius * Math.cos(angle); - const y = -center.y + radius * Math.sin(angle); // Invert Y-axis + const existingEnd = findExistingPoint(endVec); + const endPoint: Point = existingEnd || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [endVec.x, endVec.y, endVec.z], + layer: activeLayer, + }; - // Convert to Three.js vector with offset - const vec = new Vector3(x / unit, 0.01, y / unit).add( - new Vector3(objValue.x, 0, objValue.z) - ); + // Create the wall + const wallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [startPoint, endPoint], // Store start and end points + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; + wallVertex.push(wallSet); // Store wall segment in array + // Add the wall to the scene + // addWall(wallSet); + } - arcPoints.push(vec); - } + // Handle LWPOLYLINE entities (connected line segments) + else if (entity.type === "LWPOLYLINE" && entity.vertices) { + let firstPoint: Point | undefined; // Store first point for closing the polyline - // Create line segments between arc points - for (let i = 0; i < arcPoints.length - 1; i++) { - const startVec = arcPoints[i]; - const endVec = arcPoints[i + 1]; + // Process each vertex pair in the polyline + for (let i = 0; i < entity.vertices.length - 1; i++) { + // Convert vertices to Three.js vectors with offset + const startVec = new Vector3( + entity.vertices[i].x / unit, + 0.01, + -entity.vertices[i].y / unit + ).add(new Vector3(objValue.x, 0, objValue.z)); - // Create start and end points - const existingStart = findExistingPoint(startVec); - const startPoint: Point = existingStart || { - pointUuid: MathUtils.generateUUID(), - pointType: "Wall", - position: [startVec.x, startVec.y, startVec.z], - layer: activeLayer, - }; + const endVec = new Vector3( + entity.vertices[i + 1].x / unit, + 0.01, + -entity.vertices[i + 1].y / unit + ).add(new Vector3(objValue.x, 0, objValue.z)); - const existingEnd = findExistingPoint(endVec); - const endPoint: Point = existingEnd || { - pointUuid: MathUtils.generateUUID(), - pointType: "Wall", - position: [endVec.x, endVec.y, endVec.z], - layer: activeLayer, - }; + // Create start and end points + const existingStart = findExistingPoint(startVec); + const startPoint: Point = existingStart || { + pointUuid: MathUtils.generateUUID(), // Generate unique ID for new points + pointType: "Wall", // Type identifier + position: [startVec.x, startVec.y, startVec.z], // Position in 3D space + layer: activeLayer, + }; - // Create the wall segment - const wallSet: Wall = { - wallUuid: MathUtils.generateUUID(), - points: [startPoint, endPoint], - outsideMaterial: insideMaterial, - insideMaterial: outsideMaterial, - wallThickness: wallThickness, - wallHeight: wallHeight, - decals: [], - }; + const existingEnd = findExistingPoint(endVec); + const endPoint: Point = existingEnd || { + pointUuid: MathUtils.generateUUID(), // Generate unique ID for new points + pointType: "Wall", // Type identifier + position: [endVec.x, endVec.y, endVec.z], // Position in 3D space + layer: activeLayer, + }; - // Add the wall segment - // addWall(wallSet); - wallVertex.push(wallSet); - } - } + // Create the wall segment + const wallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [startPoint, endPoint], // Store start and end points + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; - // Log unsupported entity types - else { - console.error("Unsupported entity type:", entity.type); - } - }); - console.log("wallVertex: ", wallVertex); - // Return the generated walls through callback if provided - setDxfWallGenerate && setDxfWallGenerate(wallVertex); + // Add the wall segment + // addWall(wallSet); + wallVertex.push(wallSet); + // Store first point and create closing segment if this is the last vertex + if (i === 0) firstPoint = startPoint; + if (i === entity.vertices.length - 2 && firstPoint) { + const closingWallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [endPoint, firstPoint], // Create closing segment + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; + // Add the closing wall + wallVertex.push(closingWallSet); + // addWall(closingWallSet); + } + } + } + + // Handle ARC entities + else if (entity.type === "ARC") { + const { center, radius, startAngle, endAngle } = entity; + + // Validate required ARC properties + if ( + !center || + radius === undefined || + startAngle === undefined || + endAngle === undefined + ) { + return; + } + + // Convert ARC to series of line segments + const numSegments = 16; // Number of segments to approximate the arc + const angleStep = (endAngle - startAngle) / numSegments; + const arcPoints: Vector3[] = []; // Stores points along the arc + + // Generate points along the arc + for (let i = 0; i <= numSegments; i++) { + const angle = startAngle + i * angleStep; + // Calculate arc point in DXF coordinate system + const x = center.x + radius * Math.cos(angle); + const y = -center.y + radius * Math.sin(angle); // Invert Y-axis + + // Convert to Three.js vector with offset + const vec = new Vector3(x / unit, 0.01, y / unit).add( + new Vector3(objValue.x, 0, objValue.z) + ); + + arcPoints.push(vec); + } + + // Create line segments between arc points + for (let i = 0; i < arcPoints.length - 1; i++) { + const startVec = arcPoints[i]; + const endVec = arcPoints[i + 1]; + + // Create start and end points + const existingStart = findExistingPoint(startVec); + const startPoint: Point = existingStart || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [startVec.x, startVec.y, startVec.z], + layer: activeLayer, + }; + + const existingEnd = findExistingPoint(endVec); + const endPoint: Point = existingEnd || { + pointUuid: MathUtils.generateUUID(), + pointType: "Wall", + position: [endVec.x, endVec.y, endVec.z], + layer: activeLayer, + }; + + // Create the wall segment + const wallSet: Wall = { + wallUuid: MathUtils.generateUUID(), + points: [startPoint, endPoint], + outsideMaterial: insideMaterial, + insideMaterial: outsideMaterial, + wallThickness: wallThickness, + wallHeight: wallHeight, + decals: [], + }; + + // Add the wall segment + // addWall(wallSet); + wallVertex.push(wallSet); + } + } + + // Log unsupported entity types + else { + console.error("Unsupported entity type:", entity.type); + } + }); + console.log("wallVertex: ", wallVertex); + // Return the generated walls through callback if provided + setDxfWallGenerate && setDxfWallGenerate(wallVertex); } diff --git a/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx b/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx index 1ba15f0..bcafa9f 100644 --- a/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx +++ b/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx @@ -3,7 +3,7 @@ import { DoubleSide, Shape, Vector2 } from 'three'; import { Extrude } from '@react-three/drei'; import * as Constants from '../../../../../types/world/worldConstants'; -function Floor2DInstance({ floor }: { floor: Floor }) { +function Floor2DInstance({ floor }: { readonly floor: Floor }) { const savedTheme: string | null = localStorage.getItem("theme"); const shape = useMemo(() => { diff --git a/app/src/modules/builder/floor/Instances/Instance/floorInstance.tsx b/app/src/modules/builder/floor/Instances/Instance/floorInstance.tsx index 4ea5b43..3559128 100644 --- a/app/src/modules/builder/floor/Instances/Instance/floorInstance.tsx +++ b/app/src/modules/builder/floor/Instances/Instance/floorInstance.tsx @@ -1,5 +1,5 @@ import { useMemo } from "react"; -import { Shape, Vector2, DoubleSide, TextureLoader, RepeatWrapping, SRGBColorSpace, NoColorSpace, ExtrudeGeometry, Vector3, Euler, } from "three"; +import { Shape, Vector2, DoubleSide, TextureLoader, RepeatWrapping, SRGBColorSpace, NoColorSpace, ExtrudeGeometry } from "three"; import { useLoader } from "@react-three/fiber"; import useModuleStore from "../../../../../store/useModuleStore"; import { useBuilderStore } from "../../../../../store/builder/useBuilderStore"; @@ -28,7 +28,7 @@ import material4RoughnessMap from "../../../../../assets/textures/floor/tex3/met import material4MetalicMap from "../../../../../assets/textures/floor/tex3/metal_plate_metal_1k.png"; import material4NormalMap from "../../../../../assets/textures/floor/tex3/metal_plate_nor_gl_1k.png"; -function FloorInstance({ floor }: { floor: Floor }) { +function FloorInstance({ floor }: { readonly floor: Floor }) { const { toggleView } = useToggleView(); const { activeModule } = useModuleStore(); const { selectedFloor, setSelectedFloor, setSelectedDecal } = useBuilderStore(); diff --git a/app/src/modules/builder/floor/Instances/floorInstances.tsx b/app/src/modules/builder/floor/Instances/floorInstances.tsx index 2af5787..9ad65db 100644 --- a/app/src/modules/builder/floor/Instances/floorInstances.tsx +++ b/app/src/modules/builder/floor/Instances/floorInstances.tsx @@ -27,8 +27,8 @@ function FloorInstances() { if (toolMode !== 'cursor') { if (selectedFloor) setSelectedFloor(null); } - } else { - if (selectedFloor) setSelectedFloor(null); + } else if (selectedFloor) { + setSelectedFloor(null); } }, [toggleView, toolMode, activeModule, selectedFloor]); diff --git a/app/src/modules/builder/floor/floorCreator/floorCreator.tsx b/app/src/modules/builder/floor/floorCreator/floorCreator.tsx index c5c36d2..d63bd38 100644 --- a/app/src/modules/builder/floor/floorCreator/floorCreator.tsx +++ b/app/src/modules/builder/floor/floorCreator/floorCreator.tsx @@ -206,7 +206,6 @@ function FloorCreator() { setTempPoints(prev => [...prev, newPoint]); setIsCreating(true); } - }; const onContext = (event: any) => { diff --git a/app/src/modules/builder/floor/floorCreator/referenceFloor.tsx b/app/src/modules/builder/floor/floorCreator/referenceFloor.tsx index 71d376c..80b30b9 100644 --- a/app/src/modules/builder/floor/floorCreator/referenceFloor.tsx +++ b/app/src/modules/builder/floor/floorCreator/referenceFloor.tsx @@ -137,7 +137,7 @@ function ReferenceFloor({ tempPoints }: Readonly) { export default ReferenceFloor; -function Floor({ floor }: { floor: Point[] }) { +function Floor({ floor }: { readonly floor: Point[] }) { const savedTheme: string | null = localStorage.getItem('theme'); const shape = useMemo(() => { diff --git a/app/src/modules/builder/functions/computeArea.ts b/app/src/modules/builder/functions/computeArea.ts index 2bd499b..8a089ae 100644 --- a/app/src/modules/builder/functions/computeArea.ts +++ b/app/src/modules/builder/functions/computeArea.ts @@ -1,29 +1,29 @@ import { Vector2 } from "three"; export function computeArea(data: any, type: "zone" | "rooms" | "aisle"): any { - if (type === "zone") { - const points3D = data.map((p: any) => new Vector2(p[0], p[2])); - let area = 0; - for (let i = 0; i < points3D.length - 1; i++) { - const current = points3D[i]; - const next = points3D[i + 1]; - area += current.x * next.y - next.x * current.y; + if (type === "zone") { + const points3D = data.map((p: any) => new Vector2(p[0], p[2])); + let area = 0; + for (let i = 0; i < points3D.length - 1; i++) { + const current = points3D[i]; + const next = points3D[i + 1]; + area += current.x * next.y - next.x * current.y; + } + + return Math.abs(area) / 2; } - return Math.abs(area) / 2; - } - - if (type === "rooms") { - const points2D = data.coordinates.map( - (coordinate: any) => - new Vector2(coordinate.position.x, coordinate.position.z) - ); - let area = 0; - for (let i = 0; i < points2D.length - 1; i++) { - const current = points2D[i]; - const next = points2D[i + 1]; - area += current.x * next.y - next.x * current.y; + if (type === "rooms") { + const points2D = data.coordinates.map( + (coordinate: any) => + new Vector2(coordinate.position.x, coordinate.position.z) + ); + let area = 0; + for (let i = 0; i < points2D.length - 1; i++) { + const current = points2D[i]; + const next = points2D[i + 1]; + area += current.x * next.y - next.x * current.y; + } + return Math.abs(area) / 2; } - return Math.abs(area) / 2; - } } diff --git a/app/src/modules/builder/groups/calculateAreaGroup.tsx b/app/src/modules/builder/groups/calculateAreaGroup.tsx index f6a5057..ec27afd 100644 --- a/app/src/modules/builder/groups/calculateAreaGroup.tsx +++ b/app/src/modules/builder/groups/calculateAreaGroup.tsx @@ -6,109 +6,101 @@ import * as turf from "@turf/turf"; import * as THREE from "three"; const CalculateAreaGroup = () => { - const { roomsState } = useRoomsState(); - const { toggleView } = useToggleView(); - const savedTheme: string | null = localStorage.getItem("theme"); + const { roomsState } = useRoomsState(); + const { toggleView } = useToggleView(); + const savedTheme: string | null = localStorage.getItem("theme"); - return ( - - - {roomsState.length > 0 && - roomsState.flat().map((room: any, index: number) => { - const coordinates = room.coordinates; - if (!coordinates || coordinates.length < 3) return null; + return ( + + + {roomsState.length > 0 && + roomsState.flat().map((room: any, index: number) => { + const coordinates = room.coordinates; + if (!coordinates || coordinates.length < 3) return null; - const coords2D = coordinates.map( - (p: any) => new THREE.Vector2(p.position.x, p.position.z) - ); + const coords2D = coordinates.map((p: any) => new THREE.Vector2(p.position.x, p.position.z)); - if (!coords2D[0].equals(coords2D[coords2D.length - 1])) { - coords2D.push(coords2D[0]); - } + if (!coords2D[0].equals(coords2D[coords2D.length - 1])) { + coords2D.push(coords2D[0]); + } - const shape = new THREE.Shape(coords2D); - const extrudeSettings = { - depth: 0.01, - bevelEnabled: false, - }; + const shape = new THREE.Shape(coords2D); + const extrudeSettings = { + depth: 0.01, + bevelEnabled: false, + }; - const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings); - geometry.rotateX(Math.PI / 2); + const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings); + geometry.rotateX(Math.PI / 2); - const material = new THREE.MeshBasicMaterial({ - color: savedTheme === "dark" ? "#d2baff" : "#6f42c1", - side: THREE.DoubleSide, - transparent: true, - opacity: 0.4, - depthWrite: false, - }); + const material = new THREE.MeshBasicMaterial({ + color: savedTheme === "dark" ? "#d2baff" : "#6f42c1", + side: THREE.DoubleSide, + transparent: true, + opacity: 0.4, + depthWrite: false, + }); - return ( - - - - ); - })} - - {roomsState.length > 0 && - roomsState.flat().map((room: any, index: number) => { - if (!toggleView) return null; - const coordinates = room.coordinates; + return ( + + + + ); + })} + + {roomsState.length > 0 && + roomsState.flat().map((room: any, index: number) => { + if (!toggleView) return null; + const coordinates = room.coordinates; - if (!coordinates || coordinates.length < 3) return null; + if (!coordinates || coordinates.length < 3) return null; - let coords2D = coordinates.map((p: any) => [ - p.position.x, - p.position.z, - ]); + let coords2D = coordinates.map((p: any) => [p.position.x, p.position.z,]); - const first = coords2D[0]; - const last = coords2D[coords2D.length - 1]; - if (first[0] !== last[0] || first[1] !== last[1]) { - coords2D.push(first); - } + const first = coords2D[0]; + const last = coords2D[coords2D.length - 1]; + if (first[0] !== last[0] || first[1] !== last[1]) { + coords2D.push(first); + } - const polygon = turf.polygon([coords2D]); - const center2D = turf.center(polygon).geometry.coordinates; + const polygon = turf.polygon([coords2D]); + const center2D = turf.center(polygon).geometry.coordinates; - const sumY = coordinates.reduce( - (sum: number, p: any) => sum + p.position.y, - 0 - ); - const avgY = sumY / coordinates.length; + const sumY = coordinates.reduce((sum: number, p: any) => sum + p.position.y, 0); + const avgY = sumY / coordinates.length; - const area = computeArea(room, "rooms"); - const formattedArea = `${area.toFixed(2)} m²`; + const area = computeArea(room, "rooms"); + const formattedArea = `${area.toFixed(2)} m²`; - const htmlPosition: [number, number, number] = [ - center2D[0], - avgY + CONSTANTS.zoneConfig.height, - center2D[1], - ]; + const htmlPosition: [number, number, number] = [ + center2D[0], + avgY + CONSTANTS.zoneConfig.height, + center2D[1], + ]; - return ( - -
- Room ({formattedArea}) -
- - ); - })} -
- ); + return ( + +
+ Room ({formattedArea}) +
+ + ); + })} +
+ ); }; export default CalculateAreaGroup; diff --git a/app/src/modules/builder/layout/layoutImage.tsx b/app/src/modules/builder/layout/layoutImage.tsx index 40c2c3c..4e28421 100644 --- a/app/src/modules/builder/layout/layoutImage.tsx +++ b/app/src/modules/builder/layout/layoutImage.tsx @@ -11,24 +11,24 @@ const modelPaths: Record = { }; function LayoutModel() { - const { toggleView } = useToggleView(); - const { currentLayout } = useLayoutStore(); + const { toggleView } = useToggleView(); + const { currentLayout } = useLayoutStore(); - // Always call the hook, but ensure it has a valid fallback - const path = currentLayout ? modelPaths[currentLayout] : modelPaths.layout1; + // Always call the hook, but ensure it has a valid fallback + const path = currentLayout ? modelPaths[currentLayout] : modelPaths.layout1; - // Explicitly cast the return type to ensure it's not an array - const gltf = useGLTF(path) as any; + // Explicitly cast the return type to ensure it's not an array + const gltf = useGLTF(path) as any; - const cloned = useMemo(() => gltf.scene.clone(), [gltf]); + const cloned = useMemo(() => gltf.scene.clone(), [gltf]); - if (!currentLayout || !toggleView) return null; + if (!currentLayout || !toggleView) return null; - return ( - - - - ); + return ( + + + + ); } export default LayoutModel; diff --git a/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts b/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts index 8b65282..b22c3da 100644 --- a/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts +++ b/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts @@ -1,7 +1,7 @@ import { Vector3 } from "three"; export default function closestPointOnLineSegment(p: Vector3, a: Vector3, b: Vector3) { - const ab = new Vector3().subVectors(b, a); + const ab = new Vector3().subVectors(a, b); const ap = new Vector3().subVectors(p, a); const abLengthSq = ab.lengthSq(); diff --git a/app/src/modules/builder/line/line.tsx b/app/src/modules/builder/line/line.tsx index 51391f8..dad7728 100644 --- a/app/src/modules/builder/line/line.tsx +++ b/app/src/modules/builder/line/line.tsx @@ -415,10 +415,10 @@ function Line({ points }: Readonly) { const walls = getConnectedWallsByWallId(wall.wallUuid, false); setInitialPositions({ walls }); } - } else if (points[0].pointType === 'Floor' && points[0].pointType === 'Floor') { + } else if (points[0].pointType === 'Floor') { const floors = getFloorsByPointId(points[0].pointUuid); setInitialPositions({ floors }); - } else if (points[0].pointType === 'Zone' && points[0].pointType === 'Zone') { + } else if (points[0].pointType === 'Zone') { const zones = getZonesByPointId(points[0].pointUuid); setInitialPositions({ zones }); } diff --git a/app/src/modules/builder/point/reference/referencePoint.tsx b/app/src/modules/builder/point/reference/referencePoint.tsx index 2f2cccd..50882f8 100644 --- a/app/src/modules/builder/point/reference/referencePoint.tsx +++ b/app/src/modules/builder/point/reference/referencePoint.tsx @@ -21,10 +21,16 @@ function ReferencePoint({ point }: { readonly point: Point }) { return null; } - const pointName = point.pointType === 'Wall' ? 'Wall-Point' : - point.pointType === 'Floor' ? 'Floor-Point' : - point.pointType === 'Aisle' ? 'Aisle-Point' : - point.pointType === 'Zone' ? 'Zone-Point' : 'Point'; + let pointName = 'Point'; + if (point.pointType === 'Wall') { + pointName = 'Wall-Point'; + } else if (point.pointType === 'Floor') { + pointName = 'Floor-Point'; + } else if (point.pointType === 'Aisle') { + pointName = 'Aisle-Point'; + } else if (point.pointType === 'Zone') { + pointName = 'Zone-Point'; + } return ( i.object.name.includes('WallReference')); - if (intersect && intersect.object.userData.wallUuid) { + if (intersect?.object.userData.wallUuid) { const newPoint = closestPointOnLineSegment( new THREE.Vector3(intersect.point.x, 0, intersect.point.z), new THREE.Vector3(...intersect.object.userData.points[0].position), @@ -243,57 +243,35 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { boundingBox.getCenter(center); return ( - <> - - - - - - - {gltfScene && ( - { - if (!toggleView && activeModule === 'builder' && selectedWallAsset && selectedWallAsset.userData.modelUuid === wallAsset.modelUuid) { - draggingRef.current = true; - e.stopPropagation(); - setSelectedWallAsset(groupRef.current); - if (controls) { - (controls as any).enabled = false; - } + + + + + + + {gltfScene && ( + { + if (!toggleView && activeModule === 'builder' && selectedWallAsset && selectedWallAsset.userData.modelUuid === wallAsset.modelUuid) { + draggingRef.current = true; + e.stopPropagation(); + setSelectedWallAsset(groupRef.current); + if (controls) { + (controls as any).enabled = false; } - }} - onClick={(e) => { - if (!toggleView && activeModule === 'builder' && activeTool !== 'delete') { - if (e.object) { - e.stopPropagation(); - let currentObject = e.object as THREE.Object3D; - while (currentObject) { - if (currentObject.userData.wallUuid) { - break; - } - currentObject = currentObject.parent as THREE.Object3D; - } - setSelectedWallAsset(currentObject); - } - } else if (!toggleView && activeModule === 'builder' && activeTool === 'delete') { - handlePointerClick(wallAsset); - } - }} - onPointerMissed={() => { - if (selectedWallAsset && selectedWallAsset.userData.modelUuid === wallAsset.modelUuid) { - setSelectedWallAsset(null); - } - }} - onPointerEnter={(e) => { - if (!toggleView) { + } + }} + onClick={(e) => { + if (!toggleView && activeModule === 'builder' && activeTool !== 'delete') { + if (e.object) { e.stopPropagation(); let currentObject = e.object as THREE.Object3D; while (currentObject) { @@ -302,22 +280,42 @@ function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { } currentObject = currentObject.parent as THREE.Object3D; } - handlePointerOver(wallAsset, currentObject); + setSelectedWallAsset(currentObject); } - }} - onPointerLeave={(e) => { - if (!toggleView) { - e.stopPropagation(); - handlePointerOut(e, wallAsset); + } else if (!toggleView && activeModule === 'builder' && activeTool === 'delete') { + handlePointerClick(wallAsset); + } + }} + onPointerMissed={() => { + if (selectedWallAsset && selectedWallAsset.userData.modelUuid === wallAsset.modelUuid) { + setSelectedWallAsset(null); + } + }} + onPointerEnter={(e) => { + if (!toggleView) { + e.stopPropagation(); + let currentObject = e.object as THREE.Object3D; + while (currentObject) { + if (currentObject.userData.wallUuid) { + break; + } + currentObject = currentObject.parent as THREE.Object3D; } - }} - userData={wallAsset} - > - - - )} - - + handlePointerOver(wallAsset, currentObject); + } + }} + onPointerLeave={(e) => { + if (!toggleView) { + e.stopPropagation(); + handlePointerOut(e, wallAsset); + } + }} + userData={wallAsset} + > + + + )} + ) } diff --git a/app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx b/app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx index 3489b32..c5a20bb 100644 --- a/app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx +++ b/app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx @@ -3,7 +3,7 @@ import { DoubleSide, Shape, Vector2 } from 'three'; import { Extrude } from '@react-three/drei'; import * as Constants from '../../../../../types/world/worldConstants'; -function Zone2DInstance({ zone }: { zone: Zone }) { +function Zone2DInstance({ zone }: { readonly zone: Zone }) { const savedTheme: string | null = localStorage.getItem("theme"); const shape = useMemo(() => { diff --git a/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx b/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx index e49400c..d00d398 100644 --- a/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx +++ b/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx @@ -1,8 +1,7 @@ import { useMemo } from 'react' -import { Color, DoubleSide, ShaderMaterial } from 'three'; -import { Vector3 } from 'three'; +import { Color, DoubleSide, ShaderMaterial, Vector3 } from 'three'; -function ZoneInstance({ zone }: { zone: Zone }) { +function ZoneInstance({ zone }: { readonly zone: Zone }) { const zoneLayer = zone.points[0].layer; const zoneMaterial = useMemo(() => { @@ -32,41 +31,39 @@ function ZoneInstance({ zone }: { zone: Zone }) { }, []); return ( - <> - - {zone.points.map((point, index: number) => { - const nextPoint = zone.points[(index + 1) % zone.points.length]; + + {zone.points.map((point, index: number) => { + const nextPoint = zone.points[(index + 1) % zone.points.length]; - const point1 = new Vector3(point.position[0], point.position[1], point.position[2]); - const point2 = new Vector3(nextPoint.position[0], nextPoint.position[1], nextPoint.position[2]); + const point1 = new Vector3(point.position[0], point.position[1], point.position[2]); + const point2 = new Vector3(nextPoint.position[0], nextPoint.position[1], nextPoint.position[2]); - const planeWidth = point1.distanceTo(point2); - const planeHeight = zone.zoneHeight; + const planeWidth = point1.distanceTo(point2); + const planeHeight = zone.zoneHeight; - const midpoint = new Vector3((point1.x + point2.x) / 2, zone.zoneHeight / 2 + (zoneLayer - 1) * zone.zoneHeight, (point1.z + point2.z) / 2); + const midpoint = new Vector3((point1.x + point2.x) / 2, zone.zoneHeight / 2 + (zoneLayer - 1) * zone.zoneHeight, (point1.z + point2.z) / 2); - const angle = Math.atan2(point2.z - point1.z, point2.x - point1.x); + const angle = Math.atan2(point2.z - point1.z, point2.x - point1.x); - return ( - - - - - ); - })} + return ( + + + + + ); + })} - - + ) } diff --git a/app/src/modules/builder/zone/zoneCreator/referenceZone.tsx b/app/src/modules/builder/zone/zoneCreator/referenceZone.tsx index e5cdf9f..545226d 100644 --- a/app/src/modules/builder/zone/zoneCreator/referenceZone.tsx +++ b/app/src/modules/builder/zone/zoneCreator/referenceZone.tsx @@ -135,7 +135,7 @@ function ReferenceZone({ tempPoints }: Readonly) { export default ReferenceZone; -function Zone({ zone }: { zone: Point[] }) { +function Zone({ zone }: { readonly zone: Point[] }) { const savedTheme: string | null = localStorage.getItem('theme'); const shape = useMemo(() => { diff --git a/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx index 6e9e97c..c7cce3c 100644 --- a/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx +++ b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx @@ -202,7 +202,6 @@ function ZoneCreator() { setTempPoints(prev => [...prev, newPoint]); setIsCreating(true); } - }; const onContext = (event: any) => { diff --git a/app/src/modules/collaboration/camera/collabCams.tsx b/app/src/modules/collaboration/camera/collabCams.tsx index ec313ec..02cd535 100644 --- a/app/src/modules/collaboration/camera/collabCams.tsx +++ b/app/src/modules/collaboration/camera/collabCams.tsx @@ -140,7 +140,6 @@ const CamModelsGroup = () => { }); socket.on("v1:camera:Response:update", (data: any) => { - // console.log('data: ', data); if ( !groupRef.current || socket.id === data.socketId || diff --git a/app/src/modules/collaboration/camera/collabUserIcon.tsx b/app/src/modules/collaboration/camera/collabUserIcon.tsx index e45d7a5..ce49c9a 100644 --- a/app/src/modules/collaboration/camera/collabUserIcon.tsx +++ b/app/src/modules/collaboration/camera/collabUserIcon.tsx @@ -4,66 +4,66 @@ import { useSelectedUserStore } from "../../../store/collaboration/useCollabStor import { useCamMode } from "../../../store/builder/store"; interface CollabUserIconProps { - userName: string; - userImage?: string; - color: string; - id: string; - position?: { - x: number; - y: number; - z: number; - }; - rotation?: { - x: number; - y: number; - z: number; - }; - target?: { - x: number; - y: number; - z: number; - }; + userName: string; + userImage?: string; + color: string; + id: string; + position?: { + x: number; + y: number; + z: number; + }; + rotation?: { + x: number; + y: number; + z: number; + }; + target?: { + x: number; + y: number; + z: number; + }; } const CollabUserIcon: React.FC = ({ - userImage, - userName, - id, - color, - position, - rotation, - target, + userImage, + userName, + id, + color, + position, + rotation, + target, }) => { - const { setSelectedUser } = useSelectedUserStore(); - const { setCamMode } = useCamMode(); - return ( -
- -
- {userName} -
-
- ); + const { setSelectedUser } = useSelectedUserStore(); + const { setCamMode } = useCamMode(); + return ( +
+ +
+ {userName} +
+
+ ); }; export default CollabUserIcon; diff --git a/app/src/modules/collaboration/comments/instances/commentInstance/commentInstance.tsx b/app/src/modules/collaboration/comments/instances/commentInstance/commentInstance.tsx index 8481b1a..5740b6e 100644 --- a/app/src/modules/collaboration/comments/instances/commentInstance/commentInstance.tsx +++ b/app/src/modules/collaboration/comments/instances/commentInstance/commentInstance.tsx @@ -6,7 +6,7 @@ import { useSelectedComment } from '../../../../../store/builder/store'; import { Group, Object3D, Vector2, Vector3 } from 'three'; import { useThree } from '@react-three/fiber'; -function CommentInstance({ comment }: { comment: CommentSchema }) { +function CommentInstance({ comment }: { readonly comment: CommentSchema }) { const { isPlaying } = usePlayButtonStore(); const CommentRef = useRef(null); const [selectedObject, setSelectedObject] = useState(null); @@ -14,6 +14,7 @@ function CommentInstance({ comment }: { comment: CommentSchema }) { const [transformMode, setTransformMode] = useState<"translate" | "rotate" | null>(null); const groupRef = useRef(null); const { size, camera } = useThree(); + // useEffect(() => { // const handleKeyDown = (e: KeyboardEvent) => { // const keyCombination = detectModifierKeys(e); @@ -76,7 +77,6 @@ function CommentInstance({ comment }: { comment: CommentSchema }) { onMouseUp={(e) => { console.log("sad"); }} - /> )} */} diff --git a/app/src/modules/collaboration/comments/instances/commentInstances.tsx b/app/src/modules/collaboration/comments/instances/commentInstances.tsx index aa363b1..a8d5ed8 100644 --- a/app/src/modules/collaboration/comments/instances/commentInstances.tsx +++ b/app/src/modules/collaboration/comments/instances/commentInstances.tsx @@ -14,13 +14,15 @@ function CommentInstances() { const { selectedVersionStore } = useVersionContext(); const { selectedVersion } = selectedVersionStore(); - const getThreads = async () => { - if (!projectId || !selectedVersion) return; - try { - const getComments = await getAllThreads(projectId, selectedVersion?.versionId); + useEffect(() => { + // console.log("comments", comments); + }, [comments]) - const formattedThreads = Array.isArray(getComments.data) - ? getComments.data.map((thread: any) => ({ + useEffect(() => { + if (!projectId || !selectedVersion) return; + getAllThreads(projectId, selectedVersion?.versionId).then((fetchedComments) => { + const formattedThreads = Array.isArray(fetchedComments.data) + ? fetchedComments.data.map((thread: any) => ({ ...thread, comments: Array.isArray(thread.comments) ? thread.comments.map((val: any) => ({ @@ -35,18 +37,11 @@ function CommentInstances() { })) : []; setComments(formattedThreads); - } catch (err) { - // console.error("Failed to fetch threads:", err); - } - } - - useEffect(() => { - getThreads(); + }).catch((err) => { + console.error("Failed to fetch threads:", err); + }) }, []); - useEffect(() => { - // console.log("comments", comments); - }, [comments]) return ( <> {comments?.map((comment: CommentSchema) => ( diff --git a/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx b/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx index 3b6eb10..db0ebc2 100644 --- a/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx +++ b/app/src/modules/collaboration/socket/threadSocketResponses.dev.tsx @@ -81,10 +81,7 @@ const ThreadSocketResponsesDev = ({ setMessages, modeRef, messages }: ThreadSock }) ); - } else { - } - }; threadSocket.on('v1-Comment:response:add', handleAddComment); // --- Delete Comment Handler --- diff --git a/app/src/modules/collaboration/users/Avatar.tsx b/app/src/modules/collaboration/users/Avatar.tsx index 899ecb4..3f1b7a8 100644 --- a/app/src/modules/collaboration/users/Avatar.tsx +++ b/app/src/modules/collaboration/users/Avatar.tsx @@ -2,57 +2,57 @@ import React, { useEffect, useState } from "react"; import { getInitials } from "../functions/getInitials"; interface AvatarProps { - name: string; // Name can be a full name or initials - size?: number; - textColor?: string; - color?: string; // Optional color prop for future use + name: string; // Name can be a full name or initials + size?: number; + textColor?: string; + color?: string; // Optional color prop for future use } const CustomAvatar: React.FC = ({ - name, - size = 100, - textColor = "#ffffff", - color, // Optional color prop for future use + name, + size = 100, + textColor = "#ffffff", + color, // Optional color prop for future use }) => { - const [imageSrc, setImageSrc] = useState(null); + const [imageSrc, setImageSrc] = useState(null); - useEffect(() => { - const canvas = document.createElement("canvas"); // Create an offscreen canvas - canvas.width = size; - canvas.height = size; - const ctx = canvas.getContext("2d"); - if (ctx) { - const initials = getInitials(name); // Convert name to initials if needed + useEffect(() => { + const canvas = document.createElement("canvas"); // Create an offscreen canvas + canvas.width = size; + canvas.height = size; + const ctx = canvas.getContext("2d"); + if (ctx) { + const initials = getInitials(name); // Convert name to initials if needed - // Draw background - ctx.fillStyle = color ?? "#323232"; // Use color prop or generate color based on index - ctx.fillRect(0, 0, size, size); + // Draw background + ctx.fillStyle = color ?? "#323232"; // Use color prop or generate color based on index + ctx.fillRect(0, 0, size, size); - // Draw initials - ctx.fillStyle = textColor; - ctx.font = `bold ${size / 2}px Arial`; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.fillText(initials, size / 2, size / 2); + // Draw initials + ctx.fillStyle = textColor; + ctx.font = `bold ${size / 2}px Arial`; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(initials, size / 2, size / 2); - // Generate image source - const dataURL = canvas.toDataURL("image/png"); - setImageSrc(dataURL); + // Generate image source + const dataURL = canvas.toDataURL("image/png"); + setImageSrc(dataURL); + } + }, [color, name, size, textColor]); + + if (!imageSrc) { + return null; // Return null while the image is being generated } - }, [color, name, size, textColor]); - if (!imageSrc) { - return null; // Return null while the image is being generated - } - - return ( - User Avatar - ); + return ( + User Avatar + ); }; export default CustomAvatar; diff --git a/app/src/modules/scene/camera/camMode.tsx b/app/src/modules/scene/camera/camMode.tsx index 60d0798..31ae372 100644 --- a/app/src/modules/scene/camera/camMode.tsx +++ b/app/src/modules/scene/camera/camMode.tsx @@ -19,8 +19,7 @@ const CamMode: React.FC = () => { useEffect(() => { const handlePointerLockChange = async () => { - if (document.pointerLockElement && !toggleView) { - } else if (camMode === "FirstPerson" && !toggleView) { + if (camMode === "FirstPerson" && !toggleView) { setCamMode("ThirdPerson"); await switchToThirdPerson(state.controls, state.camera); } diff --git a/app/src/modules/scene/camera/switchView.tsx b/app/src/modules/scene/camera/switchView.tsx index 489d46a..9f45ac1 100644 --- a/app/src/modules/scene/camera/switchView.tsx +++ b/app/src/modules/scene/camera/switchView.tsx @@ -5,35 +5,32 @@ import { PerspectiveCamera, OrthographicCamera, CameraControls } from '@react-th import { useParams } from "react-router-dom"; import * as CONSTANTS from '../../../types/world/worldConstants'; import { getCameraApi } from "../../../services/factoryBuilder/camera/getCameraApi"; -import { getUserData } from "../../../functions/getUserData"; import { useToggleView } from "../../../store/builder/store"; export default function SwitchView() { const { toggleView } = useToggleView(); const { controls } = useThree(); const { projectId } = useParams(); - const { organization } = getUserData(); useEffect(() => { if (toggleView && controls) { (controls as any).mouseButtons.left = CONSTANTS.twoDimension.leftMouse; (controls as any).mouseButtons.right = CONSTANTS.twoDimension.rightMouse; } else { - try { - getCameraApi(organization, localStorage.getItem('userId')!, projectId).then((data) => { - if (data && data.position && data.target) { - (controls as CameraControls)?.setPosition(data.position.x, data.position.y, data.position.z); - (controls as CameraControls)?.setTarget(data.target.x, data.target.y, data.target.z); - } else { - (controls as CameraControls)?.setPosition(...CONSTANTS.threeDimension.defaultPosition); - (controls as CameraControls)?.setTarget(...CONSTANTS.threeDimension.defaultTarget); - } - }); - } catch (error) { + if (!projectId) return; + getCameraApi(projectId).then((data) => { + if (data?.position && data?.target) { + (controls as CameraControls)?.setPosition(data.position.x, data.position.y, data.position.z); + (controls as CameraControls)?.setTarget(data.target.x, data.target.y, data.target.z); + } else { + (controls as CameraControls)?.setPosition(...CONSTANTS.threeDimension.defaultPosition); + (controls as CameraControls)?.setTarget(...CONSTANTS.threeDimension.defaultTarget); + } + }).catch(() => { echo.error("Failed to retrieve camera position or target"); (controls as CameraControls)?.setPosition(...CONSTANTS.threeDimension.defaultPosition); (controls as CameraControls)?.setTarget(...CONSTANTS.threeDimension.defaultTarget); - } + }) if (controls) { (controls as any).mouseButtons.left = CONSTANTS.threeDimension.leftMouse; diff --git a/app/src/modules/scene/clouds/clouds.tsx b/app/src/modules/scene/clouds/clouds.tsx index f876530..e20719f 100644 --- a/app/src/modules/scene/clouds/clouds.tsx +++ b/app/src/modules/scene/clouds/clouds.tsx @@ -10,7 +10,7 @@ interface CloudGroupProps { height: number; } -function CloudGroup({ initialX, initialZ, speed, height }: CloudGroupProps) { +function CloudGroup({ initialX, initialZ, speed, height }: Readonly) { const group = useRef(null); useFrame((_, delta) => { diff --git a/app/src/modules/scene/controls/controls.tsx b/app/src/modules/scene/controls/controls.tsx index 3e9dca3..3e34faf 100644 --- a/app/src/modules/scene/controls/controls.tsx +++ b/app/src/modules/scene/controls/controls.tsx @@ -37,8 +37,9 @@ export default function Controls() { (controlsRef.current as any).mouseButtons.right = CONSTANTS.thirdPersonControls.rightMouse; } - getCameraApi(organization, userId, projectId).then((data) => { - if (data && data.position && data.target) { + if (!projectId) return; + getCameraApi(projectId).then((data) => { + if (data?.position && data?.target) { controlsRef.current?.setPosition(data.position.x, data.position.y, data.position.z); controlsRef.current?.setTarget(data.target.x, data.target.y, data.target.z); } else { @@ -46,7 +47,7 @@ export default function Controls() { controlsRef.current?.setTarget(...CONSTANTS.threeDimension.defaultTarget); } }).catch((error) => console.error("Failed to fetch camera data:", error)); - }, []); + }, [projectId]); useEffect(() => { if (resetCamera && projectId) { diff --git a/app/src/modules/scene/controls/selectionControls/selectionHelper.ts b/app/src/modules/scene/controls/selectionControls/helper/selectionHelper.ts similarity index 100% rename from app/src/modules/scene/controls/selectionControls/selectionHelper.ts rename to app/src/modules/scene/controls/selectionControls/helper/selectionHelper.ts diff --git a/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx b/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx index b87323e..413e26f 100644 --- a/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection2D/moveControls2D.tsx @@ -512,7 +512,7 @@ function MoveControls2D({ undoPoints.push({ type: 'Wall', lineData: actions[0].lineData as Wall, - newData: wallData as Wall, + newData: wallData, timeStamp: new Date().toISOString() }); } @@ -538,7 +538,7 @@ function MoveControls2D({ undoPoints.push({ type: 'Aisle', lineData: actions[0].lineData as Aisle, - newData: aisleData as Aisle, + newData: aisleData, timeStamp: new Date().toISOString() }); } @@ -566,7 +566,7 @@ function MoveControls2D({ undoPoints.push({ type: 'Floor', lineData: actions[0].lineData as Floor, - newData: floorData as Floor, + newData: floorData, timeStamp: new Date().toISOString() }); } @@ -594,7 +594,7 @@ function MoveControls2D({ undoPoints.push({ type: 'Zone', lineData: actions[0].lineData as Zone, - newData: zoneData as Zone, + newData: zoneData, timeStamp: new Date().toISOString() }); } diff --git a/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx b/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx index 1b29174..6cf9307 100644 --- a/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection2D/selectionControls2D.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import * as THREE from "three"; import { useThree } from "@react-three/fiber"; -import { SelectionHelper } from "../selectionHelper"; +import { SelectionHelper } from "../helper/selectionHelper"; import { SelectionBox } from "three/examples/jsm/interactive/SelectionBox"; import useModuleStore from "../../../../../store/useModuleStore"; @@ -557,7 +557,7 @@ const SelectionControls2D: React.FC = () => { updatedPoints.push({ type: 'Floor', lineData: actions[0].lineData as Floor, - newData: floorData as Floor, + newData: floorData, timeStamp: new Date().toISOString() }); } @@ -593,7 +593,7 @@ const SelectionControls2D: React.FC = () => { updatedPoints.push({ type: 'Zone', lineData: actions[0].lineData as Zone, - newData: zoneData as Zone, + newData: zoneData, timeStamp: new Date().toISOString() }); } @@ -643,11 +643,9 @@ const SelectionControls2D: React.FC = () => { }; return ( - <> - + - ); }; diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx index 4aa8bc6..1f3dbe7 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/rotateControls3D.tsx @@ -270,7 +270,7 @@ function RotateControls3D() { const assetsToUpdate: AssetData[] = []; rotatedObjects.forEach((obj: THREE.Object3D) => { - if (obj && obj.userData.modelUuid) { + if (obj?.userData.modelUuid) { const asset = assetStore.getState().getAssetById(obj.userData.modelUuid); if (!asset) return; diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx index b512ca7..5de1f82 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/selectionControls3D.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useRef } from "react"; import * as THREE from "three"; import { useThree } from "@react-three/fiber"; -import { SelectionHelper } from "../selectionHelper"; +import { SelectionHelper } from "../helper/selectionHelper"; import { SelectionBox } from "three/examples/jsm/interactive/SelectionBox"; import useModuleStore from "../../../../../store/useModuleStore"; @@ -19,7 +19,7 @@ import RotateControls3D from "./rotateControls3D"; import TransformControls3D from "./transformControls3D"; import { useBuilderStore } from "../../../../../store/builder/useBuilderStore"; -import { deleteFloorAssetsApi } from '../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi'; +import { deleteFloorAssetApi } from '../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetApi'; const SelectionControls3D: React.FC = () => { const { camera, controls, gl, scene, raycaster, pointer } = useThree(); @@ -288,7 +288,7 @@ const SelectionControls3D: React.FC = () => { // REST - deleteFloorAssetsApi({ + deleteFloorAssetApi({ modelUuid: selectedMesh.userData.modelUuid, modelName: selectedMesh.userData.modelName, versionId: selectedVersion?.versionId || '', diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts index 1c56a0b..f434e13 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DRedoHandler.ts @@ -8,7 +8,7 @@ import { useSocketStore } from "../../../../../store/builder/store"; import { upsertProductOrEventApi } from "../../../../../services/simulation/products/UpsertProductOrEventApi"; import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; -import { deleteFloorAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi"; +import { deleteFloorAssetApi } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetApi"; function use3DRedoHandler() { const { undoRedo3DStore, assetStore, productStore, eventStore } = useSceneContext(); @@ -177,7 +177,7 @@ function use3DRedoHandler() { if (!socket?.connected) { // REST - deleteFloorAssetsApi({ + deleteFloorAssetApi({ modelUuid: assetData.modelUuid, modelName: assetData.modelName, versionId: selectedVersion?.versionId || '', diff --git a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts index 620832f..a8cc7d3 100644 --- a/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts +++ b/app/src/modules/scene/controls/undoRedoControls/handlers/use3DUndoHandler.ts @@ -8,7 +8,7 @@ import { useSocketStore } from "../../../../../store/builder/store"; import { upsertProductOrEventApi } from "../../../../../services/simulation/products/UpsertProductOrEventApi"; import { setAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; -import { deleteFloorAssetsApi } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi"; +import { deleteFloorAssetApi } from "../../../../../services/factoryBuilder/asset/floorAsset/deleteFloorAssetApi"; function use3DUndoHandler() { const { undoRedo3DStore, assetStore, productStore, eventStore } = useSceneContext(); @@ -176,7 +176,7 @@ function use3DUndoHandler() { if (!socket?.connected) { // REST - deleteFloorAssetsApi({ + deleteFloorAssetApi({ modelUuid: assetData.modelUuid, modelName: assetData.modelName, versionId: selectedVersion?.versionId || '', @@ -259,7 +259,7 @@ function use3DUndoHandler() { if (!socket?.connected) { // REST - deleteFloorAssetsApi({ + deleteFloorAssetApi({ modelUuid: assetData.modelUuid, modelName: assetData.modelName, versionId: selectedVersion?.versionId || '', @@ -301,7 +301,7 @@ function use3DUndoHandler() { if (!socket?.connected) { // REST - deleteFloorAssetsApi({ + deleteFloorAssetApi({ modelUuid: assetData.modelUuid, modelName: assetData.modelName, versionId: selectedVersion?.versionId || '', diff --git a/app/src/modules/scene/controls/undoRedoControls/undoRedo3D/undoRedo3DControls.tsx b/app/src/modules/scene/controls/undoRedoControls/undoRedo3D/undoRedo3DControls.tsx index 9331320..3ca5633 100644 --- a/app/src/modules/scene/controls/undoRedoControls/undoRedo3D/undoRedo3DControls.tsx +++ b/app/src/modules/scene/controls/undoRedoControls/undoRedo3D/undoRedo3DControls.tsx @@ -20,7 +20,7 @@ function UndoRedo3DControls() { const { selectedVersion } = selectedVersionStore(); useEffect(() => { - console.log(undoStack, redoStack); + // console.log(undoStack, redoStack); }, [undoStack, redoStack]); useEffect(() => { diff --git a/app/src/modules/scene/postProcessing/outlineInstances/outlineInstance/outlineInstance.tsx b/app/src/modules/scene/postProcessing/outlineInstances/outlineInstance/outlineInstance.tsx index cc7874b..e5d46d4 100644 --- a/app/src/modules/scene/postProcessing/outlineInstances/outlineInstance/outlineInstance.tsx +++ b/app/src/modules/scene/postProcessing/outlineInstances/outlineInstance/outlineInstance.tsx @@ -16,7 +16,7 @@ function OutlineInstance({ xRay = true, width = 2000, edgeStrength = 5, -}: OutlineInstanceProps) { +}: Readonly) { if (!selection) return null; const sel = Array.isArray(selection) ? selection : [selection]; diff --git a/app/src/modules/scene/tools/measurementTool.tsx b/app/src/modules/scene/tools/measurementTool.tsx index 9f8189d..b71bf1d 100644 --- a/app/src/modules/scene/tools/measurementTool.tsx +++ b/app/src/modules/scene/tools/measurementTool.tsx @@ -5,268 +5,266 @@ import { useToolMode } from "../../../store/builder/store"; import { Html, Line } from "@react-three/drei"; const MeasurementTool = () => { - const { gl, raycaster, pointer, camera, scene } = useThree(); - const { toolMode } = useToolMode(); + const { gl, raycaster, pointer, camera, scene } = useThree(); + const { toolMode } = useToolMode(); - const [points, setPoints] = useState([]); - const [linePoints, setLinePoints] = useState(null); - const [axisLock, setAxisLock] = useState<"x" | "y" | "z" | null>(null); - const groupRef = useRef(null); - const keysPressed = useRef>(new Set()); + const [points, setPoints] = useState([]); + const [linePoints, setLinePoints] = useState(null); + const [axisLock, setAxisLock] = useState<"x" | "y" | "z" | null>(null); + const groupRef = useRef(null); + const keysPressed = useRef>(new Set()); - // Axis lock key handling - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if (e.altKey) { - if (e.key.toLowerCase() === "x") keysPressed.current.add("x"); - else if (e.key.toLowerCase() === "y") keysPressed.current.add("y"); - else if (e.key.toLowerCase() === "z") keysPressed.current.add("z"); + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.altKey) { + if (e.key.toLowerCase() === "x") keysPressed.current.add("x"); + else if (e.key.toLowerCase() === "y") keysPressed.current.add("y"); + else if (e.key.toLowerCase() === "z") keysPressed.current.add("z"); - if (keysPressed.current.has("x")) setAxisLock("x"); - else if (keysPressed.current.has("y")) setAxisLock("y"); - else if (keysPressed.current.has("z")) setAxisLock("z"); - } else if (e.key === "Escape") { - setPoints([]); - setLinePoints(null); - setAxisLock(null); - } - }; + if (keysPressed.current.has("x")) setAxisLock("x"); + else if (keysPressed.current.has("y")) setAxisLock("y"); + else if (keysPressed.current.has("z")) setAxisLock("z"); + } else if (e.key === "Escape") { + setPoints([]); + setLinePoints(null); + setAxisLock(null); + } + }; - const handleKeyUp = (e: KeyboardEvent) => { - keysPressed.current.delete(e.key.toLowerCase()); - if (keysPressed.current.has("x")) setAxisLock("x"); - else if (keysPressed.current.has("y")) setAxisLock("y"); - else if (keysPressed.current.has("z")) setAxisLock("z"); - else setAxisLock(null); - }; + const handleKeyUp = (e: KeyboardEvent) => { + keysPressed.current.delete(e.key.toLowerCase()); + if (keysPressed.current.has("x")) setAxisLock("x"); + else if (keysPressed.current.has("y")) setAxisLock("y"); + else if (keysPressed.current.has("z")) setAxisLock("z"); + else setAxisLock(null); + }; - window.addEventListener("keydown", handleKeyDown); - window.addEventListener("keyup", handleKeyUp); - return () => { - window.removeEventListener("keydown", handleKeyDown); - window.removeEventListener("keyup", handleKeyUp); - }; - }, []); + window.addEventListener("keydown", handleKeyDown); + window.addEventListener("keyup", handleKeyUp); + return () => { + window.removeEventListener("keydown", handleKeyDown); + window.removeEventListener("keyup", handleKeyUp); + }; + }, []); - const getLineColor = useCallback(() => { - switch (axisLock) { - case "x": - return "#d94522"; // Red for X axis - case "y": - return "#22ab2e"; // Green for Y axis - case "z": - return "#227bd9"; // Blue for Z axis - default: - return "#b18ef1"; // Default purple - } - }, [axisLock]); - - // Apply axis lock to a point - const applyAxisLock = useCallback( - (point: THREE.Vector3, referencePoint: THREE.Vector3) => { - const lockedPoint = point.clone(); - - switch (axisLock) { - case "x": - lockedPoint.y = referencePoint.y; - lockedPoint.z = referencePoint.z; - break; - case "y": - lockedPoint.x = referencePoint.x; - lockedPoint.z = referencePoint.z; - break; - case "z": - lockedPoint.x = referencePoint.x; - lockedPoint.y = referencePoint.y; - break; - } - - return lockedPoint; - }, - [axisLock] - ); - - useEffect(() => { - const canvasElement = gl.domElement; - let drag = false; - let isLeftMouseDown = false; - - const onMouseDown = () => { - isLeftMouseDown = true; - drag = false; - }; - - const onMouseUp = (evt: any) => { - isLeftMouseDown = false; - if (evt.button === 0 && !drag) { - raycaster.setFromCamera(pointer, camera); - const intersects = raycaster - .intersectObjects(scene.children, true) - .filter( - (intersect) => - !intersect.object.name.includes("Roof") && - !intersect.object.name.includes("MeasurementReference") && - !intersect.object.name.includes("agv-collider") && - !intersect.object.name.includes("zonePlane") && - !intersect.object.name.includes("SelectionGroup") && - !intersect.object.name.includes("selectionAssetGroup") && - !intersect.object.name.includes( - "SelectionGroupBoundingBoxLine" - ) && - !intersect.object.name.includes("SelectionGroupBoundingBox") && - !intersect.object.name.includes("SelectionGroupBoundingLine") && - intersect.object.type !== "GridHelper" - ); - - if (intersects.length > 0) { - let intersectionPoint = intersects[0].point.clone(); - if (axisLock && points.length > 0) { - intersectionPoint = applyAxisLock( - intersectionPoint, - points[points.length - 1] - ); - } - if (points.length < 2) { - setPoints([...points, intersectionPoint]); - } else { - setPoints([intersectionPoint]); - } + const getLineColor = useCallback(() => { + switch (axisLock) { + case "x": + return "#d94522"; // Red for X axis + case "y": + return "#22ab2e"; // Green for Y axis + case "z": + return "#227bd9"; // Blue for Z axis + default: + return "#b18ef1"; // Default purple } - } - }; + }, [axisLock]); - const onMouseMove = () => { - if (isLeftMouseDown) drag = true; - }; + const applyAxisLock = useCallback( + (point: THREE.Vector3, referencePoint: THREE.Vector3) => { + const lockedPoint = point.clone(); - const onContextMenu = (evt: any) => { - evt.preventDefault(); - if (!drag) { - setPoints([]); - setLinePoints(null); - } - }; + switch (axisLock) { + case "x": + lockedPoint.y = referencePoint.y; + lockedPoint.z = referencePoint.z; + break; + case "y": + lockedPoint.x = referencePoint.x; + lockedPoint.z = referencePoint.z; + break; + case "z": + lockedPoint.x = referencePoint.x; + lockedPoint.y = referencePoint.y; + break; + } - if (toolMode === "MeasurementScale") { - canvasElement.addEventListener("pointerdown", onMouseDown); - canvasElement.addEventListener("pointermove", onMouseMove); - canvasElement.addEventListener("pointerup", onMouseUp); - canvasElement.addEventListener("contextmenu", onContextMenu); - } else { - setPoints([]); - setLinePoints(null); - } + return lockedPoint; + }, + [axisLock] + ); - return () => { - canvasElement.removeEventListener("pointerdown", onMouseDown); - canvasElement.removeEventListener("pointermove", onMouseMove); - canvasElement.removeEventListener("pointerup", onMouseUp); - canvasElement.removeEventListener("contextmenu", onContextMenu); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [toolMode, camera, raycaster, pointer, scene, points, axisLock]); + useEffect(() => { + const canvasElement = gl.domElement; + let drag = false; + let isLeftMouseDown = false; - useFrame(() => { - if (points.length === 1) { - // live preview for second point - raycaster.setFromCamera(pointer, camera); - const intersects = raycaster - .intersectObjects(scene.children, true) - .filter( - (intersect) => - !intersect.object.name.includes("Roof") && - !intersect.object.name.includes("MeasurementReference") && - !intersect.object.name.includes("agv-collider") && - !intersect.object.name.includes("zonePlane") && - !intersect.object.name.includes("SelectionGroup") && - !intersect.object.name.includes("selectionAssetGroup") && - !intersect.object.name.includes("SelectionGroupBoundingBoxLine") && - !intersect.object.name.includes("SelectionGroupBoundingBox") && - !intersect.object.name.includes("SelectionGroupBoundingLine") && - intersect.object.type !== "GridHelper" - ); + const onMouseDown = () => { + isLeftMouseDown = true; + drag = false; + }; - if (intersects.length > 0) { - let tempEnd = intersects[0].point.clone(); - if (axisLock) { - tempEnd = applyAxisLock(tempEnd, points[0]); + const onMouseUp = (evt: any) => { + isLeftMouseDown = false; + if (evt.button === 0 && !drag) { + raycaster.setFromCamera(pointer, camera); + const intersects = raycaster + .intersectObjects(scene.children, true) + .filter( + (intersect) => + !intersect.object.name.includes("Roof") && + !intersect.object.name.includes("MeasurementReference") && + !intersect.object.name.includes("agv-collider") && + !intersect.object.name.includes("zonePlane") && + !intersect.object.name.includes("SelectionGroup") && + !intersect.object.name.includes("selectionAssetGroup") && + !intersect.object.name.includes( + "SelectionGroupBoundingBoxLine" + ) && + !intersect.object.name.includes("SelectionGroupBoundingBox") && + !intersect.object.name.includes("SelectionGroupBoundingLine") && + intersect.object.type !== "GridHelper" + ); + + if (intersects.length > 0) { + let intersectionPoint = intersects[0].point.clone(); + if (axisLock && points.length > 0) { + intersectionPoint = applyAxisLock( + intersectionPoint, + points[points.length - 1] + ); + } + if (points.length < 2) { + setPoints([...points, intersectionPoint]); + } else { + setPoints([intersectionPoint]); + } + } + } + }; + + const onMouseMove = () => { + if (isLeftMouseDown) drag = true; + }; + + const onContextMenu = (evt: any) => { + evt.preventDefault(); + if (!drag) { + setPoints([]); + setLinePoints(null); + } + }; + + if (toolMode === "MeasurementScale") { + canvasElement.addEventListener("pointerdown", onMouseDown); + canvasElement.addEventListener("pointermove", onMouseMove); + canvasElement.addEventListener("pointerup", onMouseUp); + canvasElement.addEventListener("contextmenu", onContextMenu); + } else { + setPoints([]); + setLinePoints(null); } - updateMeasurement(points[0], tempEnd); - } - } else if (points.length === 2) { - // second point already fixed - updateMeasurement(points[0], points[1]); - } else { - setLinePoints(null); - } - }); - const updateMeasurement = (start: THREE.Vector3, end: THREE.Vector3) => { - setLinePoints([start.clone(), end.clone()]); - }; + return () => { + canvasElement.removeEventListener("pointerdown", onMouseDown); + canvasElement.removeEventListener("pointermove", onMouseMove); + canvasElement.removeEventListener("pointerup", onMouseUp); + canvasElement.removeEventListener("contextmenu", onContextMenu); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [toolMode, camera, raycaster, pointer, scene, points, axisLock]); - return ( - - {linePoints && ( - <> - {/* Outline line */} - + useFrame(() => { + if (points.length === 1) { + // live preview for second point + raycaster.setFromCamera(pointer, camera); + const intersects = raycaster + .intersectObjects(scene.children, true) + .filter( + (intersect) => + !intersect.object.name.includes("Roof") && + !intersect.object.name.includes("MeasurementReference") && + !intersect.object.name.includes("agv-collider") && + !intersect.object.name.includes("zonePlane") && + !intersect.object.name.includes("SelectionGroup") && + !intersect.object.name.includes("selectionAssetGroup") && + !intersect.object.name.includes("SelectionGroupBoundingBoxLine") && + !intersect.object.name.includes("SelectionGroupBoundingBox") && + !intersect.object.name.includes("SelectionGroupBoundingLine") && + intersect.object.type !== "GridHelper" + ); - {/* Main line */} - - - )} + if (intersects.length > 0) { + let tempEnd = intersects[0].point.clone(); + if (axisLock) { + tempEnd = applyAxisLock(tempEnd, points[0]); + } + updateMeasurement(points[0], tempEnd); + } + } else if (points.length === 2) { + // second point already fixed + updateMeasurement(points[0], points[1]); + } else { + setLinePoints(null); + } + }); - {points.map((point, index) => ( - -
- - ))} + const updateMeasurement = (start: THREE.Vector3, end: THREE.Vector3) => { + setLinePoints([start.clone(), end.clone()]); + }; - {linePoints && linePoints.length === 2 && ( - -
{linePoints[0].distanceTo(linePoints[1]).toFixed(2)} m
- - )} -
- ); + return ( + + {linePoints && ( + <> + {/* Outline line */} + + + {/* Main line */} + + + )} + + {points.map((point, index) => ( + +
+ + ))} + + {linePoints && linePoints.length === 2 && ( + +
{linePoints[0].distanceTo(linePoints[1]).toFixed(2)} m
+ + )} +
+ ); }; export default MeasurementTool; diff --git a/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts b/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts index 37c991c..feef780 100644 --- a/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts +++ b/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts @@ -192,7 +192,7 @@ export function useRetrieveHandler() { retrieveLogStatus(material.materialName, `is being picked by ${armBot?.modelName}`); } } - } else if (storageAction) { + } else { const material = createNewMaterial( lastMaterial.materialId, lastMaterial.materialType, diff --git a/app/src/modules/simulation/actions/useActionHandler.ts b/app/src/modules/simulation/actions/useActionHandler.ts index ec02943..73c34bb 100644 --- a/app/src/modules/simulation/actions/useActionHandler.ts +++ b/app/src/modules/simulation/actions/useActionHandler.ts @@ -27,25 +27,25 @@ export function useActionHandler() { try { switch (action.actionType) { case 'default': case 'spawn': case 'swap': case 'delay': case 'despawn': - handleConveyorAction(action as ConveyorAction, materialId as string); + handleConveyorAction(action, materialId as string); break; case 'travel': - handleVehicleAction(action as VehicleAction, materialId as string); + handleVehicleAction(action, materialId as string); break; case 'pickAndPlace': - handleRoboticArmAction(action as RoboticArmAction, materialId as string); + handleRoboticArmAction(action, materialId as string); break; case 'process': - handleMachineAction(action as MachineAction, materialId as string); + handleMachineAction(action, materialId as string); break; case 'store': case 'retrieve': - handleStorageAction(action as StorageAction, materialId as string); + handleStorageAction(action, materialId as string); break; case 'worker': case 'manufacturer': - handleHumanAction(action as HumanAction, materialId as string); + handleHumanAction(action, materialId as string); break; case 'pickAndDrop': - handleCraneAction(action as CraneAction, materialId as string); + handleCraneAction(action, materialId as string); break; default: console.warn(`Unknown action type: ${(action as Action).actionType}`); diff --git a/app/src/modules/simulation/analysis/ROI/roiData.tsx b/app/src/modules/simulation/analysis/ROI/roiData.tsx index b8bdf0f..662ba2b 100644 --- a/app/src/modules/simulation/analysis/ROI/roiData.tsx +++ b/app/src/modules/simulation/analysis/ROI/roiData.tsx @@ -51,7 +51,6 @@ export default function ROIData() { !isNaN(materialCost) && !isNaN(productionPeriod) && !isNaN(salvageValue) && !isNaN(sellingPrice) && !isNaN(shiftLength) && !isNaN(shiftsPerDay) && !isNaN(workingDaysPerYear) && productionCapacityData > 0) { - // const totalHoursPerYear = shiftLength * shiftsPerDay * workingDaysPerYear; // const annualProductionUnits = productionCapacityData * totalHoursPerYear; // const annualRevenue = annualProductionUnits * sellingPrice; diff --git a/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx b/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx index f6ea5c1..31fbf8a 100644 --- a/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx +++ b/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx @@ -100,7 +100,6 @@ export default function ThroughPutData() { .forEach(storage => { if (storage.activeTime > 0) { // totalActiveTime += storage.activeTime; - // } }); } @@ -178,7 +177,7 @@ export default function ThroughPutData() { } const allInactive = !anyArmActive && !anyVehicleActive && !anyMachineActive; - if (materials.length >= 0 && materialHistory.length > 0) { + if (materialHistory.length > 0) { let totalCycleTimeSum = 0; let cycleCount = 0; diff --git a/app/src/modules/simulation/conveyor/conveyor.tsx b/app/src/modules/simulation/conveyor/conveyor.tsx index bd21523..1067b5a 100644 --- a/app/src/modules/simulation/conveyor/conveyor.tsx +++ b/app/src/modules/simulation/conveyor/conveyor.tsx @@ -3,11 +3,9 @@ import ConveyorInstances from './instances/conveyorInstances' function Conveyor() { return ( - <> - + - ) } diff --git a/app/src/modules/simulation/conveyor/instances/conveyorInstances.tsx b/app/src/modules/simulation/conveyor/instances/conveyorInstances.tsx index 75557ed..dcdc40e 100644 --- a/app/src/modules/simulation/conveyor/instances/conveyorInstances.tsx +++ b/app/src/modules/simulation/conveyor/instances/conveyorInstances.tsx @@ -1,4 +1,3 @@ -import React from 'react' import ConveyorInstance from './conveyorInstance/conveyorInstance' import { useSceneContext } from '../../../scene/sceneContext'; diff --git a/app/src/modules/simulation/crane/crane.tsx b/app/src/modules/simulation/crane/crane.tsx index fdbb430..b8619ba 100644 --- a/app/src/modules/simulation/crane/crane.tsx +++ b/app/src/modules/simulation/crane/crane.tsx @@ -4,11 +4,9 @@ import CraneInstances from './instances/craneInstances' function Crane() { return ( - <> - + - ) } diff --git a/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx b/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx index 2af3223..cb4d863 100644 --- a/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx +++ b/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx @@ -12,14 +12,14 @@ function PillarJibAnimator({ animationPhase, setAnimationPhase, onAnimationComplete -}: { +}: Readonly<{ crane: CraneStatus; points: [THREE.Vector3, THREE.Vector3] | null; setPoints: (points: [THREE.Vector3, THREE.Vector3] | null) => void; animationPhase: string; setAnimationPhase: (phase: string) => void; onAnimationComplete: (action: string) => void; -}) { +}>) { const { scene } = useThree(); const { assetStore, productStore, materialStore } = useSceneContext(); const { getActionByUuid, getPointByUuid } = productStore(); @@ -95,7 +95,7 @@ function PillarJibAnimator({ useEffect(() => { const model = scene.getObjectByProperty('uuid', crane.modelUuid); - if (!model || !model.userData.fieldData) return; + if (!model?.userData.fieldData) return; const base = model.getObjectByName('base'); const trolley = model.getObjectByName('trolley'); diff --git a/app/src/modules/simulation/crane/instances/helper/pillarJibHelper.tsx b/app/src/modules/simulation/crane/instances/helper/pillarJibHelper.tsx index 40ac35a..0c07027 100644 --- a/app/src/modules/simulation/crane/instances/helper/pillarJibHelper.tsx +++ b/app/src/modules/simulation/crane/instances/helper/pillarJibHelper.tsx @@ -7,11 +7,11 @@ function PillarJibHelper({ crane, points, isHelperNeeded -}: { +}: Readonly<{ crane: CraneStatus, points: [THREE.Vector3, THREE.Vector3] | null; isHelperNeeded: boolean; -}) { +}>) { const { scene } = useThree(); const [clampedPoints, setClampedPoints] = useState<[THREE.Vector3, THREE.Vector3]>(); const [isInside, setIsInside] = useState<[boolean, boolean]>([false, false]); diff --git a/app/src/modules/simulation/crane/instances/instance/pillarJibInstance.tsx b/app/src/modules/simulation/crane/instances/instance/pillarJibInstance.tsx index 4e18eb2..67fcaab 100644 --- a/app/src/modules/simulation/crane/instances/instance/pillarJibInstance.tsx +++ b/app/src/modules/simulation/crane/instances/instance/pillarJibInstance.tsx @@ -9,7 +9,7 @@ import PillarJibAnimator from '../animator/pillarJibAnimator' import PillarJibHelper from '../helper/pillarJibHelper' import MaterialAnimator from '../animator/materialAnimator'; -function PillarJibInstance({ crane }: { crane: CraneStatus }) { +function PillarJibInstance({ crane }: { readonly crane: CraneStatus }) { const { isPlaying } = usePlayButtonStore(); const { craneStore, productStore, humanStore, assetStore } = useSceneContext(); const { triggerPointActions } = useTriggerHandler(); diff --git a/app/src/modules/simulation/events/arrows/arrows.tsx b/app/src/modules/simulation/events/arrows/arrows.tsx index 0b8e821..18db60c 100644 --- a/app/src/modules/simulation/events/arrows/arrows.tsx +++ b/app/src/modules/simulation/events/arrows/arrows.tsx @@ -190,12 +190,12 @@ export function ArrowOnQuadraticBezier({ mid, end, color = "#42a5f5", -}: { +}: Readonly<{ start: number[]; mid: number[]; end: number[]; color?: string; -}) { +}>) { const minScale = 0.5; const maxScale = 5; const segmentSize = 0.3; diff --git a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx index 9fb27a9..f2353dc 100644 --- a/app/src/modules/simulation/events/points/creator/pointsCreator.tsx +++ b/app/src/modules/simulation/events/points/creator/pointsCreator.tsx @@ -100,7 +100,7 @@ function PointsCreator() { const updatedEvents: EventsSchema[] = []; if (triggers.length > 0) { - triggers.map((trigger) => { + triggers.forEach((trigger) => { const event = removeTrigger(selectedProduct.productUuid, trigger.triggerUuid); if (event) { updatedEvents.push(event); @@ -115,7 +115,7 @@ function PointsCreator() { } if (updatedEvents.length > 0) { - updatedEvents.map((updatedEvent) => { + updatedEvents.forEach((updatedEvent) => { updateBackend( selectedProduct.productName, selectedProduct.productUuid, diff --git a/app/src/modules/simulation/events/points/functions/handleAddEventToProduct.ts b/app/src/modules/simulation/events/points/functions/handleAddEventToProduct.ts index 0ba13a7..7cafc1d 100644 --- a/app/src/modules/simulation/events/points/functions/handleAddEventToProduct.ts +++ b/app/src/modules/simulation/events/points/functions/handleAddEventToProduct.ts @@ -29,8 +29,6 @@ export const handleAddEventToProduct = ({ versionId, projectId: projectId || '', eventDatas: event - }).then((data) => { - // console.log(data); }) if (clearSelectedAsset) { diff --git a/app/src/modules/simulation/events/points/instances/instance/pointInstance.tsx b/app/src/modules/simulation/events/points/instances/instance/pointInstance.tsx index cfac4bb..6671b27 100644 --- a/app/src/modules/simulation/events/points/instances/instance/pointInstance.tsx +++ b/app/src/modules/simulation/events/points/instances/instance/pointInstance.tsx @@ -23,7 +23,7 @@ export default function PointInstance({ modelUuid, color, ...meshProps -}: PointInstanceProps) { +}: Readonly) { const ref = useRef(null); const { setSelectedEventSphere } = useSelectedEventSphere(); const { deletableEventSphere, setDeletableEventSphere, clearDeletableEventSphere } = useDeletableEventSphere(); @@ -59,7 +59,7 @@ export default function PointInstance({ const updatedEvents: EventsSchema[] = []; if (triggers.length > 0) { - triggers.map((trigger) => { + triggers.forEach((trigger) => { const event = removeTrigger(selectedProduct.productUuid, trigger.triggerUuid); if (event) { updatedEvents.push(event); @@ -74,7 +74,7 @@ export default function PointInstance({ } if (updatedEvents.length > 0) { - updatedEvents.map((updatedEvent) => { + updatedEvents.forEach((updatedEvent) => { updateBackend( selectedProduct.productName, selectedProduct.productUuid, diff --git a/app/src/modules/simulation/events/points/points.tsx b/app/src/modules/simulation/events/points/points.tsx index c8b9d6d..33335c4 100644 --- a/app/src/modules/simulation/events/points/points.tsx +++ b/app/src/modules/simulation/events/points/points.tsx @@ -1,10 +1,11 @@ import PointsCreator from './creator/pointsCreator' function Points() { + return ( - <> - - + + + ) } diff --git a/app/src/modules/simulation/events/triggerConnections/triggerConnector.tsx b/app/src/modules/simulation/events/triggerConnections/triggerConnector.tsx index 21a85c3..400eaf1 100644 --- a/app/src/modules/simulation/events/triggerConnections/triggerConnector.tsx +++ b/app/src/modules/simulation/events/triggerConnections/triggerConnector.tsx @@ -31,7 +31,7 @@ function TriggerConnector() { const { selectedProduct } = selectedProductStore(); const [hoveredLineKey, setHoveredLineKey] = useState(null); const groupRefs = useRef>({}); - const [helperlineColor, setHelperLineColor] = useState("red"); + const [helperLineColor, setHelperLineColor] = useState("red"); const [currentLine, setCurrentLine] = useState<{ start: THREE.Vector3; end: THREE.Vector3; mid: THREE.Vector3; } | null>(null); const { toolMode } = useToolMode(); const { isPlaying } = usePlayButtonStore(); @@ -81,7 +81,7 @@ function TriggerConnector() { event.points.forEach(point => { if (point.action?.triggers) { point.action.triggers.forEach(trigger => { - if (trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint) { + if (trigger.triggeredAsset?.triggeredPoint) { newConnections.push({ id: `${point.uuid}-${trigger.triggeredAsset.triggeredPoint.pointUuid}-${trigger.triggerUuid}`, startPointUuid: point.uuid, @@ -98,7 +98,7 @@ function TriggerConnector() { const point = event.point; if (point.action?.triggers) { point.action.triggers.forEach(trigger => { - if (trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint) { + if (trigger.triggeredAsset?.triggeredPoint) { newConnections.push({ id: `${point.uuid}-${trigger.triggeredAsset.triggeredPoint.pointUuid}-${trigger.triggerUuid}`, startPointUuid: point.uuid, @@ -114,7 +114,7 @@ function TriggerConnector() { const point = event.point; point.actions?.forEach(action => { action.triggers?.forEach(trigger => { - if (trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint) { + if (trigger.triggeredAsset?.triggeredPoint) { newConnections.push({ id: `${point.uuid}-${trigger.triggeredAsset.triggeredPoint.pointUuid}-${trigger.triggerUuid}`, startPointUuid: point.uuid, @@ -126,11 +126,11 @@ function TriggerConnector() { }); } // Handle Machine point - else if (event.type === "machine" && 'point' in event) { + else if ((event.type === "machine") && 'point' in event) { const point = event.point; if (point.action?.triggers) { point.action.triggers.forEach(trigger => { - if (trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint) { + if (trigger.triggeredAsset?.triggeredPoint) { newConnections.push({ id: `${point.uuid}-${trigger.triggeredAsset.triggeredPoint.pointUuid}-${trigger.triggerUuid}`, startPointUuid: point.uuid, @@ -146,7 +146,7 @@ function TriggerConnector() { const point = event.point; point.actions?.forEach(action => { action.triggers?.forEach(trigger => { - if (trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint) { + if (trigger.triggeredAsset?.triggeredPoint) { newConnections.push({ id: `${point.uuid}-${trigger.triggeredAsset.triggeredPoint.pointUuid}-${trigger.triggerUuid}`, startPointUuid: point.uuid, @@ -162,7 +162,7 @@ function TriggerConnector() { const point = event.point; point.actions?.forEach(action => { action.triggers?.forEach(trigger => { - if (trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint) { + if (trigger.triggeredAsset?.triggeredPoint) { newConnections.push({ id: `${point.uuid}-${trigger.triggeredAsset.triggeredPoint.pointUuid}-${trigger.triggerUuid}`, startPointUuid: point.uuid, @@ -178,7 +178,7 @@ function TriggerConnector() { const point = event.point; point.actions?.forEach(action => { action.triggers?.forEach(trigger => { - if (trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint) { + if (trigger.triggeredAsset?.triggeredPoint) { newConnections.push({ id: `${point.uuid}-${trigger.triggeredAsset.triggeredPoint.pointUuid}-${trigger.triggerUuid}`, startPointUuid: point.uuid, @@ -540,7 +540,7 @@ function TriggerConnector() { start={currentLine.start.toArray()} end={currentLine.end.toArray()} mid={currentLine.mid.toArray()} - color={helperlineColor} + color={helperLineColor} lineWidth={4} dashed dashSize={1} @@ -550,7 +550,7 @@ function TriggerConnector() { start={currentLine.start.toArray()} mid={currentLine.mid.toArray()} end={currentLine.end.toArray()} - color={helperlineColor} + color={helperLineColor} /> )} diff --git a/app/src/modules/simulation/human/human.tsx b/app/src/modules/simulation/human/human.tsx index 767269c..f3ae920 100644 --- a/app/src/modules/simulation/human/human.tsx +++ b/app/src/modules/simulation/human/human.tsx @@ -11,7 +11,7 @@ function Human() { const { selectedAnimation } = useSelectedAnimation(); const { selectedEventSphere } = useSelectedEventSphere(); const { isPlaying } = usePlayButtonStore(); - const [isVehicleSelected, setIsHumanSelected] = useState(false); + const [isHumanSelected, setIsHumanSelected] = useState(false); useEffect(() => { if (selectedEventSphere) { @@ -29,7 +29,7 @@ function Human() { - {isVehicleSelected && selectedEventSphere && !isPlaying && + {isHumanSelected && selectedEventSphere && !isPlaying && } diff --git a/app/src/modules/simulation/human/instances/animator/manufacturerAnimator.tsx b/app/src/modules/simulation/human/instances/animator/manufacturerAnimator.tsx index 45d7658..db8ff5f 100644 --- a/app/src/modules/simulation/human/instances/animator/manufacturerAnimator.tsx +++ b/app/src/modules/simulation/human/instances/animator/manufacturerAnimator.tsx @@ -28,7 +28,7 @@ function ManufacturerAnimator({ path, handleCallBack, human, reset }: Readonly(false); const action = getActionByUuid(selectedProduct.productUuid, human?.currentAction?.actionUuid || ''); const [objectRotation, setObjectRotation] = useState<[number, number, number] | null>((action as HumanAction)?.manufacturePoint?.rotation || [0, 0, 0]); - const [restRotation, setRestingRotation] = useState(true); + const [restingRotation, setRestingRotation] = useState(true); const [currentPath, setCurrentPath] = useState<[number, number, number][]>([]); const { scene } = useThree(); @@ -124,7 +124,7 @@ function ManufacturerAnimator({ path, handleCallBack, human, reset }: Readonly= totalDistance) { - if (restRotation && objectRotation) { + if (restingRotation && objectRotation) { const targetEuler = new THREE.Euler(0, objectRotation[1], 0); const baseQuaternion = new THREE.Quaternion().setFromEuler(targetEuler); const y180 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI); diff --git a/app/src/modules/simulation/human/instances/animator/operatorAnimator.tsx b/app/src/modules/simulation/human/instances/animator/operatorAnimator.tsx index 14934df..62fb8f4 100644 --- a/app/src/modules/simulation/human/instances/animator/operatorAnimator.tsx +++ b/app/src/modules/simulation/human/instances/animator/operatorAnimator.tsx @@ -29,7 +29,7 @@ function OperatorAnimator({ path, handleCallBack, human, reset }: Readonly(false); const action = getActionByUuid(selectedProduct.productUuid, human?.currentAction?.actionUuid || ''); const [objectRotation, setObjectRotation] = useState<[number, number, number] | null>((action as HumanAction)?.pickUpPoint?.rotation || [0, 0, 0]); - const [restRotation, setRestingRotation] = useState(true); + const [restingRotation, setRestingRotation] = useState(true); const [currentPath, setCurrentPath] = useState<[number, number, number][]>([]); const { scene } = useThree(); @@ -133,7 +133,7 @@ function OperatorAnimator({ path, handleCallBack, human, reset }: Readonly= totalDistance) { - if (restRotation && objectRotation) { + if (restingRotation && objectRotation) { const targetEuler = new THREE.Euler(0, objectRotation[1], 0); const baseQuaternion = new THREE.Quaternion().setFromEuler(targetEuler); const y180 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI); diff --git a/app/src/modules/simulation/human/instances/animator/workerAnimator.tsx b/app/src/modules/simulation/human/instances/animator/workerAnimator.tsx index 6e6d2fc..eb6c5f9 100644 --- a/app/src/modules/simulation/human/instances/animator/workerAnimator.tsx +++ b/app/src/modules/simulation/human/instances/animator/workerAnimator.tsx @@ -30,7 +30,7 @@ function WorkerAnimator({ path, handleCallBack, human, reset, startUnloadingProc const completedRef = useRef(false); const action = getActionByUuid(selectedProduct.productUuid, human?.currentAction?.actionUuid || ''); const [objectRotation, setObjectRotation] = useState<[number, number, number] | null>((action as HumanAction)?.pickUpPoint?.rotation || [0, 0, 0]); - const [restRotation, setRestingRotation] = useState(true); + const [restingRotation, setRestingRotation] = useState(true); const [currentPath, setCurrentPath] = useState<[number, number, number][]>([]); const { scene } = useThree(); @@ -132,7 +132,7 @@ function WorkerAnimator({ path, handleCallBack, human, reset, startUnloadingProc } else { setCurrentAnimation(human.modelUuid, 'walking', true, true, true); } - } else { + } else if (!isAligned) { if (human.currentMaterials.length > 0 && (human.currentPhase !== 'init-pickup' && human.currentPhase !== 'init-manufacture' && human.currentPhase !== 'drop-pickup')) { setCurrentAnimation(human.modelUuid, 'idle_with_box', true, true, true); } else { @@ -142,7 +142,7 @@ function WorkerAnimator({ path, handleCallBack, human, reset, startUnloadingProc } if (progressRef.current >= totalDistance) { - if (restRotation && objectRotation) { + if (restingRotation && objectRotation) { const targetEuler = new THREE.Euler(0, objectRotation[1], 0); const baseQuaternion = new THREE.Quaternion().setFromEuler(targetEuler); const y180 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI); diff --git a/app/src/modules/simulation/human/instances/instance/actions/manufacturerInstance.tsx b/app/src/modules/simulation/human/instances/instance/actions/manufacturerInstance.tsx index ae74a14..d9ec0d9 100644 --- a/app/src/modules/simulation/human/instances/instance/actions/manufacturerInstance.tsx +++ b/app/src/modules/simulation/human/instances/instance/actions/manufacturerInstance.tsx @@ -10,7 +10,7 @@ import { useProductContext } from '../../../../products/productContext'; import ManufacturerAnimator from '../../animator/manufacturerAnimator'; -function ManufacturerInstance({ human }: { human: HumanStatus }) { +function ManufacturerInstance({ human }: { readonly human: HumanStatus }) { const { navMesh } = useNavMesh(); const { isPlaying } = usePlayButtonStore(); const { scene } = useThree(); @@ -207,14 +207,12 @@ function ManufacturerInstance({ human }: { human: HumanStatus }) { } return ( - <> - - + ) } diff --git a/app/src/modules/simulation/human/instances/instance/actions/operatorInstance.tsx b/app/src/modules/simulation/human/instances/instance/actions/operatorInstance.tsx index fce077f..4500482 100644 --- a/app/src/modules/simulation/human/instances/instance/actions/operatorInstance.tsx +++ b/app/src/modules/simulation/human/instances/instance/actions/operatorInstance.tsx @@ -4,30 +4,21 @@ import { useThree } from '@react-three/fiber'; import { NavMeshQuery } from '@recast-navigation/core'; import { useNavMesh } from '../../../../../../store/builder/store'; import { useAnimationPlaySpeed, usePauseButtonStore, usePlayButtonStore } from '../../../../../../store/usePlayButtonStore'; -import { useTriggerHandler } from '../../../../triggers/triggerHandler/useTriggerHandler'; import { useSceneContext } from '../../../../../scene/sceneContext'; import { useProductContext } from '../../../../products/productContext'; import OperatorAnimator from '../../animator/operatorAnimator'; -function OperatorInstance({ human }: { human: HumanStatus }) { +function OperatorInstance({ human }: { readonly human: HumanStatus }) { const { navMesh } = useNavMesh(); const { isPlaying } = usePlayButtonStore(); const { scene } = useThree(); - const { assetStore, materialStore, armBotStore, conveyorStore, machineStore, vehicleStore, humanStore, storageUnitStore, craneStore, productStore } = useSceneContext(); - const { removeMaterial, setEndTime, setIsVisible } = materialStore(); - const { getStorageUnitById } = storageUnitStore(); - const { getArmBotById } = armBotStore(); - const { getConveyorById } = conveyorStore(); - const { getVehicleById } = vehicleStore(); - const { getMachineById } = machineStore(); - const { getCraneById } = craneStore(); - const { triggerPointActions } = useTriggerHandler(); + const { assetStore, humanStore, productStore } = useSceneContext(); const { setCurrentAnimation, resetAnimation, getAssetById } = assetStore(); - const { getActionByUuid, getEventByModelUuid, getTriggerByUuid } = productStore(); + const { getActionByUuid } = productStore(); const { selectedProductStore } = useProductContext(); const { selectedProduct } = selectedProductStore(); - const { setHumanActive, setHumanState, clearCurrentMaterials, setHumanLoad, setHumanScheduled, decrementHumanLoad, removeLastMaterial, incrementIdleTime, incrementActiveTime, resetTime, setCurrentPhase } = humanStore(); + const { setHumanActive, setHumanState, setHumanLoad, setHumanScheduled, resetTime, setCurrentPhase } = humanStore(); const [path, setPath] = useState<[number, number, number][]>([]); const pauseTimeRef = useRef(null); @@ -156,14 +147,12 @@ function OperatorInstance({ human }: { human: HumanStatus }) { } return ( - <> - - + ) } diff --git a/app/src/modules/simulation/human/instances/instance/actions/workerInstance.tsx b/app/src/modules/simulation/human/instances/instance/actions/workerInstance.tsx index 078f203..42d7d76 100644 --- a/app/src/modules/simulation/human/instances/instance/actions/workerInstance.tsx +++ b/app/src/modules/simulation/human/instances/instance/actions/workerInstance.tsx @@ -10,7 +10,7 @@ import { useProductContext } from '../../../../products/productContext'; import WorkerAnimator from '../../animator/workerAnimator'; -function WorkerInstance({ human }: { human: HumanStatus }) { +function WorkerInstance({ human }: { readonly human: HumanStatus }) { const { navMesh } = useNavMesh(); const { isPlaying } = usePlayButtonStore(); const { scene } = useThree(); @@ -625,15 +625,13 @@ function WorkerInstance({ human }: { human: HumanStatus }) { } return ( - <> - - + ) } diff --git a/app/src/modules/simulation/human/instances/instance/humanInstance.tsx b/app/src/modules/simulation/human/instances/instance/humanInstance.tsx index 593e82a..8db35e3 100644 --- a/app/src/modules/simulation/human/instances/instance/humanInstance.tsx +++ b/app/src/modules/simulation/human/instances/instance/humanInstance.tsx @@ -8,7 +8,7 @@ import ManufacturerInstance from './actions/manufacturerInstance'; import WorkerInstance from './actions/workerInstance'; import OperatorInstance from './actions/operatorInstance'; -function HumanInstance({ human }: { human: HumanStatus }) { +function HumanInstance({ human }: {readonly human: HumanStatus }) { const { isPlaying } = usePlayButtonStore(); const { humanStore, productStore } = useSceneContext(); const { getActionByUuid } = productStore(); diff --git a/app/src/modules/simulation/human/instances/instance/humanUi.tsx b/app/src/modules/simulation/human/instances/instance/humanUi.tsx index abaceb5..730cb81 100644 --- a/app/src/modules/simulation/human/instances/instance/humanUi.tsx +++ b/app/src/modules/simulation/human/instances/instance/humanUi.tsx @@ -72,7 +72,7 @@ function HumanUi() { if (!selectedEventSphere || !selectedAction?.actionId) return; const selectedHuman = getHumanById(selectedEventSphere.userData.modelUuid); - if (!selectedHuman || !selectedHuman.point?.actions) return; + if (!selectedHuman?.point?.actions) return; setSelectedHumanData({ position: selectedHuman.position, @@ -150,10 +150,14 @@ function HumanUi() { if (outerGroup.current) { localPoint = outerGroup.current.worldToLocal(intersection.clone()); } - const marker = - state === "start" ? startMarker.current : - state === "end" ? endMarker.current : - manufactureMarker.current; + let marker; + if (state === "start") { + marker = startMarker.current; + } else if (state === "end") { + marker = endMarker.current; + } else { + marker = manufactureMarker.current; + } if (marker && localPoint) { const markerPos = new Vector3().copy(marker.position); dragOffset.current.copy(markerPos.sub(localPoint)); @@ -257,11 +261,14 @@ function HumanUi() { const deltaX = currentPointerX - prevMousePos.current.x; prevMousePos.current.x = currentPointerX; - const marker = - isRotating === "start" ? startMarker.current : - isRotating === "end" ? endMarker.current : - manufactureMarker.current; - + let marker; + if (isRotating === "start") { + marker = startMarker.current; + } else if (isRotating === "end") { + marker = endMarker.current; + } else { + marker = manufactureMarker.current; + } if (marker) { const rotationSpeed = 10; marker.rotation.y += deltaX * rotationSpeed; diff --git a/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx b/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx index f45f909..297b22f 100644 --- a/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx +++ b/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx @@ -131,11 +131,9 @@ function MachineInstance({ machineDetail }: { readonly machineDetail: MachineSta } return ( - <> - + - ) } diff --git a/app/src/modules/simulation/machine/instances/machineInstances.tsx b/app/src/modules/simulation/machine/instances/machineInstances.tsx index 2db71f1..65331a4 100644 --- a/app/src/modules/simulation/machine/instances/machineInstances.tsx +++ b/app/src/modules/simulation/machine/instances/machineInstances.tsx @@ -5,20 +5,20 @@ import { useSceneContext } from "../../../scene/sceneContext"; import { useViewSceneStore } from "../../../../store/builder/store"; function MachineInstances() { - const { machineStore } = useSceneContext(); - const { machines } = machineStore(); - const { viewSceneLabels } = useViewSceneStore(); + const { machineStore } = useSceneContext(); + const { machines } = machineStore(); + const { viewSceneLabels } = useViewSceneStore(); - return ( - <> - {machines.map((machine: MachineStatus) => ( - - - {viewSceneLabels && } - - ))} - - ); + return ( + <> + {machines.map((machine: MachineStatus) => ( + + + {viewSceneLabels && } + + ))} + + ); } export default MachineInstances; diff --git a/app/src/modules/simulation/machine/machine.tsx b/app/src/modules/simulation/machine/machine.tsx index 9e16e83..5ebcbb6 100644 --- a/app/src/modules/simulation/machine/machine.tsx +++ b/app/src/modules/simulation/machine/machine.tsx @@ -3,11 +3,9 @@ import MachineInstances from './instances/machineInstances' function Machine() { return ( - <> - + - ) } diff --git a/app/src/modules/simulation/materials/materials.tsx b/app/src/modules/simulation/materials/materials.tsx index 296f96c..d7d3d4a 100644 --- a/app/src/modules/simulation/materials/materials.tsx +++ b/app/src/modules/simulation/materials/materials.tsx @@ -1,8 +1,8 @@ import { useEffect } from 'react' -import MaterialInstances from './instances/materialInstances' import { usePlayButtonStore, useResetButtonStore } from '../../../store/usePlayButtonStore'; -// import MaterialCollisionDetector from './collisionDetection/materialCollitionDetector'; import { useSceneContext } from '../../scene/sceneContext'; +import MaterialInstances from './instances/materialInstances' +// import MaterialCollisionDetector from './collisionDetection/materialCollitionDetector'; function Materials() { const { materialStore } = useSceneContext(); diff --git a/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx b/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx index d7a5058..0bc142d 100644 --- a/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx +++ b/app/src/modules/simulation/roboticArm/instances/animator/roboticArmAnimator.tsx @@ -21,7 +21,7 @@ interface RoboticArmAnimatorProps { currentPhase: string; } -function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone, armBot, path, currentPhase }: RoboticArmAnimatorProps) { +function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone, armBot, path, currentPhase }: Readonly) { const progressRef = useRef(0); const curveRef = useRef(null); const totalDistanceRef = useRef(0); diff --git a/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx b/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx index ee196f5..9c3fff6 100644 --- a/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx +++ b/app/src/modules/simulation/roboticArm/instances/armInstance/roboticArmInstance.tsx @@ -17,7 +17,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { const pauseTimeRef = useRef(null); const isPausedRef = useRef(false); const isSpeedRef = useRef(null); - let startTime: number; const { selectedProductStore } = useProductContext(); const { materialStore, armBotStore, vehicleStore, storageUnitStore, productStore, assetStore } = useSceneContext(); @@ -45,9 +44,9 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { const action = getActionByUuid(selectedProduct.productUuid, armBot.currentAction?.actionUuid || ''); const handlePickUpTrigger = () => { - if (armBot.currentAction && armBot.currentAction.materialId) { + if (armBot?.currentAction?.materialId) { const material = getMaterialById(armBot.currentAction.materialId); - if (material && material.previous && material.previous.modelUuid) { + if (material?.previous?.modelUuid) { const previousModel = getEventByActionUuid(selectedProduct.productUuid, material.previous.actionUuid); if (previousModel) { if (previousModel.type === 'transfer') { @@ -77,7 +76,7 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { if (armBot.currentAction) { const action = getActionByUuid(selectedProduct.productUuid, armBot.currentAction.actionUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action?.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || ''); - if (action && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid) { + if (action?.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid) { if (!model) return; if (model.type === 'transfer') { setIsVisible(armBot.currentAction.materialId || '', true); @@ -124,7 +123,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { resetAsset(armBot.modelUuid); isPausedRef.current = false pauseTimeRef.current = null - startTime = 0 activeSecondsElapsed.current = 0; idleSecondsElapsed.current = 0; previousTimeRef.current = null; @@ -235,7 +233,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { setArmBotActive(armBot.modelUuid, true); setArmBotState(armBot.modelUuid, "running"); setCurrentPhase("start-to-end"); - startTime = 0 if (!action) return; const startPoint = (action as RoboticArmAction).process.startPoint; const endPoint = (action as RoboticArmAction).process.endPoint; @@ -254,7 +251,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { setArmBotActive(armBot.modelUuid, true); setArmBotState(armBot.modelUuid, "running"); setCurrentPhase("end-to-rest"); - startTime = 0; if (!action) return; const endPoint = (action as RoboticArmAction).process.endPoint; if (endPoint) { @@ -280,7 +276,6 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) { isPausedRef.current = false pauseTimeRef.current = null isPausedRef.current = false - startTime = 0 activeSecondsElapsed.current = 0; idleSecondsElapsed.current = 0; previousTimeRef.current = null; diff --git a/app/src/modules/simulation/roboticArm/instances/ikInstance/ikInstance.tsx b/app/src/modules/simulation/roboticArm/instances/ikInstance/ikInstance.tsx index b43c7fa..d875905 100644 --- a/app/src/modules/simulation/roboticArm/instances/ikInstance/ikInstance.tsx +++ b/app/src/modules/simulation/roboticArm/instances/ikInstance/ikInstance.tsx @@ -9,7 +9,7 @@ type IKInstanceProps = { armBot: ArmBotStatus; }; -function IKInstance({ setIkSolver, armBot }: IKInstanceProps) { +function IKInstance({ setIkSolver, armBot }: Readonly) { const { scene } = useThree(); const { isPlaying } = usePlayButtonStore(); const { isReset } = useResetButtonStore(); @@ -22,7 +22,7 @@ function IKInstance({ setIkSolver, armBot }: IKInstanceProps) { const trySetup = () => { const targetMesh = scene?.getObjectByProperty("uuid", armBot.modelUuid); - if (!targetMesh || !targetMesh.userData.fieldData || targetMesh.userData.fieldData.length < 1) { + if (!targetMesh?.userData.fieldData || targetMesh?.userData.fieldData.length < 1) { retryId = setTimeout(trySetup, 100); return; } diff --git a/app/src/modules/simulation/simulator/functions/determineExecutionOrder.ts b/app/src/modules/simulation/simulator/functions/determineExecutionOrder.ts index f06992b..244a404 100644 --- a/app/src/modules/simulation/simulator/functions/determineExecutionOrder.ts +++ b/app/src/modules/simulation/simulator/functions/determineExecutionOrder.ts @@ -2,7 +2,6 @@ import { extractTriggersFromPoint } from "./extractTriggersFromPoint"; export function determineExecutionOrder(products: productsSchema): Action[] { // Create maps for all events and points - const eventMap = new Map(); const pointMap = new Map(); const allPoints: PointsScheme[] = []; const spawnActions: Action[] = []; @@ -10,7 +9,6 @@ export function determineExecutionOrder(products: productsSchema): Action[] { // First pass: collect all points and identify spawn actions products.forEach(product => { product.eventDatas.forEach(event => { - eventMap.set(event.modelUuid, event); if (event.type === 'transfer') { event.points.forEach(point => { @@ -34,7 +32,7 @@ export function determineExecutionOrder(products: productsSchema): Action[] { // Check for spawn actions in storage units and other types if (event.type === 'storageUnit') { - const storagePoint = event.point as StoragePointSchema; + const storagePoint = event.point; storagePoint.actions.forEach(action => { if (action.actionType === 'retrieve') { spawnActions.push(action); diff --git a/app/src/modules/simulation/spatialUI/arm/PickDropPoints.tsx b/app/src/modules/simulation/spatialUI/arm/PickDropPoints.tsx index c44eee8..744ee1c 100644 --- a/app/src/modules/simulation/spatialUI/arm/PickDropPoints.tsx +++ b/app/src/modules/simulation/spatialUI/arm/PickDropPoints.tsx @@ -3,59 +3,59 @@ import * as THREE from "three"; import { ThreeEvent } from "@react-three/fiber"; interface PickDropProps { - position: number[]; - modelUuid: string; - pointUuid: string; - actionType: "pick" | "drop"; - actionUuid: string; - gltfScene: THREE.Group; + position: number[]; + modelUuid: string; + pointUuid: string; + actionType: "pick" | "drop"; + actionUuid: string; + gltfScene: THREE.Group; - handlePointerDown: (e: ThreeEvent) => void; - isSelected: boolean; + handlePointerDown: (e: ThreeEvent) => void; + isSelected: boolean; } const PickDropPoints: React.FC = ({ - position, - modelUuid, - pointUuid, - actionType, - actionUuid, - gltfScene, - handlePointerDown, - isSelected, + position, + modelUuid, + pointUuid, + actionType, + actionUuid, + gltfScene, + handlePointerDown, + isSelected, }) => { - const groupRef = useRef(null); - return ( - { - - e.stopPropagation(); // Prevent event bubbling - if (!isSelected) return; - handlePointerDown(e); - }} - userData={{ modelUuid, pointUuid, actionType, actionUuid }} - > - { - const cloned = gltfScene.clone(); - cloned.traverse((child: any) => { - if (child.isMesh) { - child.userData = { modelUuid, pointUuid, actionType, actionUuid }; + const groupRef = useRef(null); + return ( + - - ); + onPointerDown={(e) => { + + e.stopPropagation(); // Prevent event bubbling + if (!isSelected) return; + handlePointerDown(e); + }} + userData={{ modelUuid, pointUuid, actionType, actionUuid }} + > + { + const cloned = gltfScene.clone(); + cloned.traverse((child: any) => { + if (child.isMesh) { + child.userData = { modelUuid, pointUuid, actionType, actionUuid }; + } + }); + return cloned; + })()} + position={[0, 0, 0]} + scale={[0.5, 0.5, 0.5]} + /> + + ); }; export default PickDropPoints; diff --git a/app/src/modules/simulation/spatialUI/vehicle/useDraggableGLTF.ts b/app/src/modules/simulation/spatialUI/vehicle/useDraggableGLTF.ts index b7e9272..8adec6b 100644 --- a/app/src/modules/simulation/spatialUI/vehicle/useDraggableGLTF.ts +++ b/app/src/modules/simulation/spatialUI/vehicle/useDraggableGLTF.ts @@ -5,126 +5,126 @@ import { ThreeEvent, useThree } from "@react-three/fiber"; type OnUpdateCallback = (object: THREE.Object3D) => void; export default function useDraggableGLTF(onUpdate: OnUpdateCallback) { - const { camera, gl, controls, scene } = useThree(); - const activeObjRef = useRef(null); - const planeRef = useRef( - new THREE.Plane(new THREE.Vector3(0, 1, 0), 0) - ); - const offsetRef = useRef(new THREE.Vector3()); - const initialPositionRef = useRef(new THREE.Vector3()); + const { camera, gl, controls, scene } = useThree(); + const activeObjRef = useRef(null); + const planeRef = useRef( + new THREE.Plane(new THREE.Vector3(0, 1, 0), 0) + ); + const offsetRef = useRef(new THREE.Vector3()); + const initialPositionRef = useRef(new THREE.Vector3()); - const raycaster = new THREE.Raycaster(); - const pointer = new THREE.Vector2(); + const raycaster = new THREE.Raycaster(); + const pointer = new THREE.Vector2(); - const handlePointerDown = (e: ThreeEvent) => { - e.stopPropagation(); + const handlePointerDown = (e: ThreeEvent) => { + e.stopPropagation(); - let obj: THREE.Object3D | null = e.object; + let obj: THREE.Object3D | null = e.object; - // Traverse up until we find modelUuid in userData - while (obj && !obj.userData?.modelUuid) { - obj = obj.parent; - } + // Traverse up until we find modelUuid in userData + while (obj && !obj.userData?.modelUuid) { + obj = obj.parent; + } - if (!obj) return; + if (!obj) return; - // Disable orbit controls while dragging - if (controls) (controls as any).enabled = false; + // Disable orbit controls while dragging + if (controls) (controls as any).enabled = false; - activeObjRef.current = obj; - initialPositionRef.current.copy(obj.position); + activeObjRef.current = obj; + initialPositionRef.current.copy(obj.position); - // Get world position - const objectWorldPos = new THREE.Vector3(); - obj.getWorldPosition(objectWorldPos); + // Get world position + const objectWorldPos = new THREE.Vector3(); + obj.getWorldPosition(objectWorldPos); - // Set plane at the object's Y level - planeRef.current.set(new THREE.Vector3(0, 1, 0), -objectWorldPos.y); + // Set plane at the object's Y level + planeRef.current.set(new THREE.Vector3(0, 1, 0), -objectWorldPos.y); - // Convert pointer to NDC - const rect = gl.domElement.getBoundingClientRect(); - pointer.x = ((e.clientX - rect.left) / rect.width) * 2 - 1; - pointer.y = -((e.clientY - rect.top) / rect.height) * 2 + 1; + // Convert pointer to NDC + const rect = gl.domElement.getBoundingClientRect(); + pointer.x = ((e.clientX - rect.left) / rect.width) * 2 - 1; + pointer.y = -((e.clientY - rect.top) / rect.height) * 2 + 1; - // Raycast to intersection - raycaster.setFromCamera(pointer, camera); - const intersection = new THREE.Vector3(); - raycaster.ray.intersectPlane(planeRef.current, intersection); + // Raycast to intersection + raycaster.setFromCamera(pointer, camera); + const intersection = new THREE.Vector3(); + raycaster.ray.intersectPlane(planeRef.current, intersection); - // Calculate offset - offsetRef.current.copy(objectWorldPos).sub(intersection); + // Calculate offset + offsetRef.current.copy(objectWorldPos).sub(intersection); - // Start listening for drag - gl.domElement.addEventListener("pointermove", handlePointerMove); - gl.domElement.addEventListener("pointerup", handlePointerUp); - }; + // Start listening for drag + gl.domElement.addEventListener("pointermove", handlePointerMove); + gl.domElement.addEventListener("pointerup", handlePointerUp); + }; - const handlePointerMove = (e: PointerEvent) => { - if (!activeObjRef.current) return; - - // Check if Shift key is pressed - const isShiftKeyPressed = e.shiftKey; - - // Get the mouse position relative to the canvas - const rect = gl.domElement.getBoundingClientRect(); - pointer.x = ((e.clientX - rect.left) / rect.width) * 2 - 1; - pointer.y = -((e.clientY - rect.top) / rect.height) * 2 + 1; - - // Update raycaster to point to the mouse position - raycaster.setFromCamera(pointer, camera); - - // Create a vector to store intersection point - const intersection = new THREE.Vector3(); - const intersects = raycaster.ray.intersectPlane(planeRef.current, intersection); - if (!intersects) return; - - // Add offset for dragging - intersection.add(offsetRef.current); - console.log('intersection: ', intersection); - - // Get the parent's world matrix if exists - const parent = activeObjRef.current.parent; - const targetPosition = new THREE.Vector3(); - - if (isShiftKeyPressed) { - console.log('isShiftKeyPressed: ', isShiftKeyPressed); - // For Y-axis only movement, maintain original X and Z - console.log('initialPositionRef: ', initialPositionRef); - console.log('intersection.y: ', intersection); - targetPosition.set( - initialPositionRef.current.x, - intersection.y, - initialPositionRef.current.z - ); - } else { - // For free movement - targetPosition.copy(intersection); - } - - // Convert world position to local if object is nested inside a parent - if (parent) { - parent.worldToLocal(targetPosition); - } - - // Update object position - activeObjRef.current.position.copy(targetPosition); - }; + const handlePointerMove = (e: PointerEvent) => { + if (!activeObjRef.current) return; - const handlePointerUp = () => { - if (controls) (controls as any).enabled = true; + // Check if Shift key is pressed + const isShiftKeyPressed = e.shiftKey; - if (activeObjRef.current) { - // Pass the updated position to the onUpdate callback to persist it - onUpdate(activeObjRef.current); - } + // Get the mouse position relative to the canvas + const rect = gl.domElement.getBoundingClientRect(); + pointer.x = ((e.clientX - rect.left) / rect.width) * 2 - 1; + pointer.y = -((e.clientY - rect.top) / rect.height) * 2 + 1; - gl.domElement.removeEventListener("pointermove", handlePointerMove); - gl.domElement.removeEventListener("pointerup", handlePointerUp); + // Update raycaster to point to the mouse position + raycaster.setFromCamera(pointer, camera); - activeObjRef.current = null; - }; + // Create a vector to store intersection point + const intersection = new THREE.Vector3(); + const intersects = raycaster.ray.intersectPlane(planeRef.current, intersection); + if (!intersects) return; - return { handlePointerDown }; + // Add offset for dragging + intersection.add(offsetRef.current); + console.log('intersection: ', intersection); + + // Get the parent's world matrix if exists + const parent = activeObjRef.current.parent; + const targetPosition = new THREE.Vector3(); + + if (isShiftKeyPressed) { + console.log('isShiftKeyPressed: ', isShiftKeyPressed); + // For Y-axis only movement, maintain original X and Z + console.log('initialPositionRef: ', initialPositionRef); + console.log('intersection.y: ', intersection); + targetPosition.set( + initialPositionRef.current.x, + intersection.y, + initialPositionRef.current.z + ); + } else { + // For free movement + targetPosition.copy(intersection); + } + + // Convert world position to local if object is nested inside a parent + if (parent) { + parent.worldToLocal(targetPosition); + } + + // Update object position + activeObjRef.current.position.copy(targetPosition); + }; + + const handlePointerUp = () => { + if (controls) (controls as any).enabled = true; + + if (activeObjRef.current) { + // Pass the updated position to the onUpdate callback to persist it + onUpdate(activeObjRef.current); + } + + gl.domElement.removeEventListener("pointermove", handlePointerMove); + gl.domElement.removeEventListener("pointerup", handlePointerUp); + + activeObjRef.current = null; + }; + + return { handlePointerDown }; } diff --git a/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx b/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx index b0f0514..4fcc093 100644 --- a/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx +++ b/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx @@ -1,14 +1,14 @@ -import React, { useEffect } from 'react' +import { useEffect } from 'react' import MaterialAnimator from '../animator/MaterialAnimator' function StorageUnitInstance({ storageUnit }: Readonly<{ storageUnit: StorageUnitStatus }>) { - useEffect(()=>{ + useEffect(() => { // console.log('storageUnit: ', storageUnit); - },[storageUnit]) + }, [storageUnit]) return ( - + ) } diff --git a/app/src/modules/simulation/storageUnit/storageUnit.tsx b/app/src/modules/simulation/storageUnit/storageUnit.tsx index 8d7f1b1..e230fa2 100644 --- a/app/src/modules/simulation/storageUnit/storageUnit.tsx +++ b/app/src/modules/simulation/storageUnit/storageUnit.tsx @@ -1,12 +1,11 @@ import StorageUnitInstances from './instances/storageUnitInstances' function StorageUnit() { + return ( - <> - + - ) } diff --git a/app/src/modules/simulation/triggers/trigger.tsx b/app/src/modules/simulation/triggers/trigger.tsx index 0af5881..bd3bd19 100644 --- a/app/src/modules/simulation/triggers/trigger.tsx +++ b/app/src/modules/simulation/triggers/trigger.tsx @@ -3,11 +3,9 @@ import TriggerConnector from '../events/triggerConnections/triggerConnector' function Trigger() { return ( - <> - + - ) } diff --git a/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts b/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts index 4072f9d..09a9b61 100644 --- a/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts +++ b/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts @@ -39,7 +39,7 @@ export function useTriggerHandler() { if (fromEvent?.type === 'transfer') { if (toEvent?.type === 'transfer') { // Transfer to Transfer - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger?.triggeredAsset?.triggeredAction) { const material = getMaterialById(materialId); if (material) { if (material.next) { @@ -66,7 +66,7 @@ export function useTriggerHandler() { } } else if (toEvent?.type === 'vehicle') { // Transfer to Vehicle - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -121,7 +121,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'roboticArm') { // Transfer to Robotic Arm - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -149,7 +149,7 @@ export function useTriggerHandler() { if (action) { if (armBot) { - if (action && action.triggers.length > 0 && + if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { @@ -211,7 +211,7 @@ export function useTriggerHandler() { const machine = getMachineById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || ''); if (machine) { setIsPaused(materialId, true); - + addMachineToMonitor(machine.modelUuid, () => { handleAction(action, materialId); }) @@ -262,7 +262,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'human') { // Transfer to Human - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -290,7 +290,7 @@ export function useTriggerHandler() { if (action) { if (human) { - if (action && action.triggers.length > 0 && + if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { @@ -364,7 +364,7 @@ export function useTriggerHandler() { } } else if (toEvent?.type === 'crane') { // Transfer to Crane - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -392,7 +392,7 @@ export function useTriggerHandler() { if (action) { if (crane) { - if (action && action.triggers.length > 0 && + if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { @@ -426,7 +426,7 @@ export function useTriggerHandler() { } else if (fromEvent?.type === 'vehicle') { if (toEvent?.type === 'transfer') { // Vehicle to Transfer - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const conveyor = getConveyorById(toEvent.modelUuid); const material = getMaterialById(materialId); @@ -449,10 +449,7 @@ export function useTriggerHandler() { setIsVisible(materialId, true); - if (action && - action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && - action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid - ) { + if (action?.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { setNextLocation(material.materialId, { modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', @@ -476,7 +473,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'roboticArm') { // Vehicle to Robotic Arm - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); @@ -509,7 +506,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'storageUnit') { // Vehicle to Storage Unit - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); @@ -549,7 +546,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'human') { // Vehicle to Human - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); @@ -581,7 +578,7 @@ export function useTriggerHandler() { } } else if (toEvent?.type === 'crane') { // Vehicle to Crane - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -609,7 +606,7 @@ export function useTriggerHandler() { if (action) { if (crane) { - if (action && action.triggers.length > 0 && + if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { @@ -652,7 +649,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'roboticArm') { // Machine to Robotic Arm - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); setIsPaused(materialId, true); @@ -753,7 +750,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'human') { // Machine to Human - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); setIsPaused(materialId, true); @@ -837,7 +834,7 @@ export function useTriggerHandler() { } else if (fromEvent?.type === 'roboticArm') { if (toEvent?.type === 'transfer') { // Robotic Arm to Transfer - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -868,78 +865,76 @@ export function useTriggerHandler() { } else if (model?.type === 'vehicle') { const nextAction = getActionByUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredAction.actionUuid); - if (action) { - handleAction(action, material.materialId); + handleAction(action, material.materialId); - const vehicle = getVehicleById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); + const vehicle = getVehicleById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); - setPreviousLocation(material.materialId, { - modelUuid: material.current.modelUuid, - pointUuid: material.current.pointUuid, - actionUuid: material.current.actionUuid, - }) + setPreviousLocation(material.materialId, { + modelUuid: material.current.modelUuid, + pointUuid: material.current.pointUuid, + actionUuid: material.current.actionUuid, + }) - setCurrentLocation(material.materialId, { - modelUuid: trigger.triggeredAsset?.triggeredModel.modelUuid, - pointUuid: trigger.triggeredAsset?.triggeredPoint?.pointUuid, - actionUuid: trigger.triggeredAsset?.triggeredAction?.actionUuid, - }); + setCurrentLocation(material.materialId, { + modelUuid: trigger.triggeredAsset?.triggeredModel.modelUuid, + pointUuid: trigger.triggeredAsset?.triggeredPoint?.pointUuid, + actionUuid: trigger.triggeredAsset?.triggeredAction?.actionUuid, + }); - setNextLocation(material.materialId, null); + setNextLocation(material.materialId, null); - if (nextAction) { + if (nextAction) { - if (vehicle) { + if (vehicle) { - if (vehicle.isActive === false && vehicle.state === 'idle' && vehicle.isPicking && vehicle.currentLoad < vehicle.point.action.loadCapacity) { + if (vehicle.isActive === false && vehicle.state === 'idle' && vehicle.isPicking && vehicle.currentLoad < vehicle.point.action.loadCapacity) { - setPreviousLocation(material.materialId, { - modelUuid: material.current.modelUuid, - pointUuid: material.current.pointUuid, - actionUuid: material.current.actionUuid, - }) + setPreviousLocation(material.materialId, { + modelUuid: material.current.modelUuid, + pointUuid: material.current.pointUuid, + actionUuid: material.current.actionUuid, + }) - setCurrentLocation(material.materialId, { - modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', - pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', - actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', - }); + setCurrentLocation(material.materialId, { + modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', + pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', + actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', + }); - setNextLocation(material.materialId, null); + setNextLocation(material.materialId, null); - setIsVisible(materialId, false); - setIsPaused(materialId, false); + setIsVisible(materialId, false); + setIsPaused(materialId, false); - // Handle current action from vehicle - handleAction(nextAction, materialId); + // Handle current action from vehicle + handleAction(nextAction, materialId); - } else { + } else { - // Handle current action using Event Manager - setIsPaused(materialId, true); + // Handle current action using Event Manager + setIsPaused(materialId, true); - addVehicleToMonitor(vehicle.modelUuid, - () => { - setPreviousLocation(material.materialId, { - modelUuid: material.current.modelUuid, - pointUuid: material.current.pointUuid, - actionUuid: material.current.actionUuid, - }) + addVehicleToMonitor(vehicle.modelUuid, + () => { + setPreviousLocation(material.materialId, { + modelUuid: material.current.modelUuid, + pointUuid: material.current.pointUuid, + actionUuid: material.current.actionUuid, + }) - setCurrentLocation(material.materialId, { - modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', - pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', - actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', - }); + setCurrentLocation(material.materialId, { + modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', + pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', + actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', + }); - setNextLocation(material.materialId, null); + setNextLocation(material.materialId, null); - setIsPaused(materialId, false); - setIsVisible(materialId, false); - handleAction(nextAction, materialId); - } - ) - } + setIsPaused(materialId, false); + setIsVisible(materialId, false); + handleAction(nextAction, materialId); + } + ) } } } @@ -973,7 +968,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'vehicle') { // Robotic Arm to Vehicle - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -1021,7 +1016,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'machine') { // Robotic Arm to Machine - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -1069,7 +1064,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'storageUnit') { // Robotic Arm to Storage Unit - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); @@ -1108,7 +1103,7 @@ export function useTriggerHandler() { } } else if (toEvent?.type === 'human') { // Robotic Arm to Human - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -1179,7 +1174,7 @@ export function useTriggerHandler() { if (toEvent?.type === 'transfer') { // Human to Transfer - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material && action.actionType === 'worker') { @@ -1210,78 +1205,76 @@ export function useTriggerHandler() { } else if (model?.type === 'vehicle') { const nextAction = getActionByUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredAction.actionUuid); - if (action) { - handleAction(action, material.materialId); + handleAction(action, material.materialId); - const vehicle = getVehicleById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); + const vehicle = getVehicleById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); - setPreviousLocation(material.materialId, { - modelUuid: material.current.modelUuid, - pointUuid: material.current.pointUuid, - actionUuid: material.current.actionUuid, - }) + setPreviousLocation(material.materialId, { + modelUuid: material.current.modelUuid, + pointUuid: material.current.pointUuid, + actionUuid: material.current.actionUuid, + }) - setCurrentLocation(material.materialId, { - modelUuid: trigger.triggeredAsset?.triggeredModel.modelUuid, - pointUuid: trigger.triggeredAsset?.triggeredPoint?.pointUuid, - actionUuid: trigger.triggeredAsset?.triggeredAction?.actionUuid, - }); + setCurrentLocation(material.materialId, { + modelUuid: trigger.triggeredAsset?.triggeredModel.modelUuid, + pointUuid: trigger.triggeredAsset?.triggeredPoint?.pointUuid, + actionUuid: trigger.triggeredAsset?.triggeredAction?.actionUuid, + }); - setNextLocation(material.materialId, null); + setNextLocation(material.materialId, null); - if (nextAction) { + if (nextAction) { - if (vehicle) { + if (vehicle) { - if (vehicle.isActive === false && vehicle.state === 'idle' && vehicle.isPicking && vehicle.currentLoad < vehicle.point.action.loadCapacity) { + if (vehicle.isActive === false && vehicle.state === 'idle' && vehicle.isPicking && vehicle.currentLoad < vehicle.point.action.loadCapacity) { - setPreviousLocation(material.materialId, { - modelUuid: material.current.modelUuid, - pointUuid: material.current.pointUuid, - actionUuid: material.current.actionUuid, - }) + setPreviousLocation(material.materialId, { + modelUuid: material.current.modelUuid, + pointUuid: material.current.pointUuid, + actionUuid: material.current.actionUuid, + }) - setCurrentLocation(material.materialId, { - modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', - pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', - actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', - }); + setCurrentLocation(material.materialId, { + modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', + pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', + actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', + }); - setNextLocation(material.materialId, null); + setNextLocation(material.materialId, null); - setIsVisible(materialId, false); - setIsPaused(materialId, false); + setIsVisible(materialId, false); + setIsPaused(materialId, false); - // Handle current action from vehicle - handleAction(nextAction, materialId); + // Handle current action from vehicle + handleAction(nextAction, materialId); - } else { + } else { - // Handle current action using Event Manager - setIsPaused(materialId, true); + // Handle current action using Event Manager + setIsPaused(materialId, true); - addVehicleToMonitor(vehicle.modelUuid, - () => { - setPreviousLocation(material.materialId, { - modelUuid: material.current.modelUuid, - pointUuid: material.current.pointUuid, - actionUuid: material.current.actionUuid, - }) + addVehicleToMonitor(vehicle.modelUuid, + () => { + setPreviousLocation(material.materialId, { + modelUuid: material.current.modelUuid, + pointUuid: material.current.pointUuid, + actionUuid: material.current.actionUuid, + }) - setCurrentLocation(material.materialId, { - modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', - pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', - actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', - }); + setCurrentLocation(material.materialId, { + modelUuid: action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || '', + pointUuid: action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid || '', + actionUuid: action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid || '', + }); - setNextLocation(material.materialId, null); + setNextLocation(material.materialId, null); - setIsPaused(materialId, false); - setIsVisible(materialId, false); - handleAction(nextAction, materialId); - } - ) - } + setIsPaused(materialId, false); + setIsVisible(materialId, false); + handleAction(nextAction, materialId); + } + ) } } } @@ -1561,7 +1554,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'vehicle') { // Human to Vehicle - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -1630,7 +1623,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'machine') { // Human to Machine - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { @@ -1675,7 +1668,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'roboticArm') { // Human to Robotic Arm - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); @@ -1716,7 +1709,7 @@ export function useTriggerHandler() { } else if (toEvent?.type === 'storageUnit') { // Human to Storage Unit - if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { + if (materialId && trigger?.triggeredAsset?.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); diff --git a/app/src/modules/simulation/vehicle/instances/animator/interactivePoint.tsx b/app/src/modules/simulation/vehicle/instances/animator/interactivePoint.tsx index 5705cc5..53b21b2 100644 --- a/app/src/modules/simulation/vehicle/instances/animator/interactivePoint.tsx +++ b/app/src/modules/simulation/vehicle/instances/animator/interactivePoint.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import * as THREE from 'three'; -import { Canvas, useThree, useFrame, ThreeEvent } from '@react-three/fiber'; -import { Line, OrbitControls } from '@react-three/drei'; +import { useThree, useFrame, ThreeEvent } from '@react-three/fiber'; +import { Line } from '@react-three/drei'; import { useAnimationPlaySpeed, usePauseButtonStore, usePlayButtonStore } from '../../../../../store/usePlayButtonStore'; import { useActiveTool, useSelectedPath } from '../../../../../store/builder/store'; @@ -10,7 +10,7 @@ interface InteractivePointsProps { } -export default function InteractivePoints({ agvUuid }: InteractivePointsProps) { +export default function InteractivePoints({ agvUuid }: Readonly) { const { gl, scene, raycaster } = useThree(); const [points, setPoints] = useState<[number, number, number][]>([]); const { isPaused } = usePauseButtonStore(); @@ -133,14 +133,12 @@ export default function InteractivePoints({ agvUuid }: InteractivePointsProps) { }; }, [isPlaying, handleClick, handleMouseDown]); - const updatePoint = (index: number, pos: THREE.Vector3) => { const updated = [...points]; updated[index] = pos.toArray() as [number, number, number]; setPoints(updated); }; - return ( <> {selectedPath === "manual" && @@ -165,28 +163,27 @@ export default function InteractivePoints({ agvUuid }: InteractivePointsProps) {
) } - {points && ( - points.map((pos, i) => { - if (i < points.length - 1) { - return ( - { - const updated = [...points]; - updated[i0] = p0.toArray() as [number, number, number]; - updated[i1] = p1.toArray() as [number, number, number]; - setPoints(updated); - }} - isAnyDragging={isAnyDragging} - setIsAnyDragging={setIsAnyDragging} - /> - ); - } - return null; - }) + {(points.map((_, i) => { + if (i < points.length - 1) { + return ( + { + const updated = [...points]; + updated[i0] = p0.toArray() as [number, number, number]; + updated[i1] = p1.toArray() as [number, number, number]; + setPoints(updated); + }} + isAnyDragging={isAnyDragging} + setIsAnyDragging={setIsAnyDragging} + /> + ); + } + return null; + }) )}
} @@ -195,20 +192,19 @@ export default function InteractivePoints({ agvUuid }: InteractivePointsProps) { } - function DraggableSphere({ index, position, onMove, isAnyDragging, setIsAnyDragging, -}: { +}: Readonly<{ index: number; position: THREE.Vector3; onMove: (index: number, pos: THREE.Vector3) => void; isAnyDragging: string; setIsAnyDragging: (val: string) => void; -}) { +}>) { const meshRef = useRef(null); const { gl, controls, raycaster } = useThree(); const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); @@ -267,14 +263,14 @@ function DraggableLineSegment({ updatePoints, isAnyDragging, setIsAnyDragging, -}: { +}: Readonly<{ index: number; start: THREE.Vector3; end: THREE.Vector3; updatePoints: (i0: number, p0: THREE.Vector3, i1: number, p1: THREE.Vector3) => void; isAnyDragging: string; setIsAnyDragging: (val: string) => void; -}) { +}>) { const { gl, raycaster, controls } = useThree(); const { activeTool } = useActiveTool(); const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); diff --git a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx index c8463cf..81fbadc 100644 --- a/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx +++ b/app/src/modules/simulation/vehicle/instances/animator/vehicleAnimator.tsx @@ -1,4 +1,3 @@ - import { useEffect, useRef, useState } from 'react' import { useFrame, useThree, ThreeEvent } from '@react-three/fiber'; import * as THREE from 'three'; @@ -7,7 +6,6 @@ import { useAnimationPlaySpeed, usePauseButtonStore, usePlayButtonStore, useRese import { useSceneContext } from '../../../../scene/sceneContext'; import { useActiveTool, useSelectedPath } from '../../../../../store/builder/store'; - interface VehicleAnimatorProps { path: [number, number, number][]; handleCallBack: () => void; @@ -29,13 +27,12 @@ function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid, agvDetai const movingForward = useRef(true); const completedRef = useRef(false); const [objectRotation, setObjectRotation] = useState<{ x: number; y: number; z: number } | undefined>(agvDetail.point?.action?.pickUpPoint?.rotation || { x: 0, y: 0, z: 0 }) - const [restRotation, setRestingRotation] = useState(true); + const [restingRotation, setRestingRotation] = useState(true); const [currentPath, setCurrentPath] = useState<[number, number, number][]>([]); const { scene, controls } = useThree(); const { selectedPath } = useSelectedPath(); const [isAnyDragging, setIsAnyDragging] = useState(""); - useEffect(() => { if (currentPhase === 'stationed-pickup' && path.length > 0 && selectedPath === "auto") { setCurrentPath(path); @@ -136,7 +133,7 @@ function VehicleAnimator({ path, handleCallBack, currentPhase, agvUuid, agvDetai } if (progressRef.current >= totalDistance) { - if (restRotation && objectRotation) { + if (restingRotation && objectRotation) { const targetEuler = new THREE.Euler(0, objectRotation.y - agvDetail.point.action.steeringAngle, 0); const baseQuaternion = new THREE.Quaternion().setFromEuler(targetEuler); @@ -243,13 +240,13 @@ function DraggableSphere({ onMove, isAnyDragging, setIsAnyDragging, -}: { +}: Readonly<{ index: number; position: THREE.Vector3; onMove: (index: number, pos: THREE.Vector3) => void; isAnyDragging: string; setIsAnyDragging: (val: string) => void; -}) { +}>) { const meshRef = useRef(null); const { gl, controls, raycaster } = useThree(); const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); @@ -308,14 +305,14 @@ function DraggableLineSegment({ updatePoints, isAnyDragging, setIsAnyDragging, -}: { +}: Readonly<{ index: number; start: THREE.Vector3; end: THREE.Vector3; updatePoints: (i0: number, p0: THREE.Vector3, i1: number, p1: THREE.Vector3) => void; isAnyDragging: string; setIsAnyDragging: (val: string) => void; -}) { +}>) { const { gl, raycaster, controls } = useThree(); const { activeTool } = useActiveTool(); const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); diff --git a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx index 26cc6b6..511f21a 100644 --- a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx +++ b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx @@ -487,7 +487,7 @@ function VehicleInstance({ agvDetail }: Readonly<{ agvDetail: VehicleStatus }>) const dropLoop = (currentTime: number) => { const conveyor = getConveyorById(conveyorId); - if (isPausedRef.current || (conveyor && conveyor.isPaused)) { + if (isPausedRef.current || (conveyor?.isPaused)) { if (pauseStartTime === null) { pauseStartTime = currentTime; } diff --git a/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx b/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx index 989242b..8f2b3f3 100644 --- a/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx +++ b/app/src/modules/simulation/vehicle/instances/vehicleInstances.tsx @@ -5,20 +5,20 @@ import { useSceneContext } from "../../../scene/sceneContext"; import { useViewSceneStore } from "../../../../store/builder/store"; function VehicleInstances() { - const { vehicleStore } = useSceneContext(); - const { vehicles } = vehicleStore(); - const { viewSceneLabels } = useViewSceneStore(); + const { vehicleStore } = useSceneContext(); + const { vehicles } = vehicleStore(); + const { viewSceneLabels } = useViewSceneStore(); - return ( - <> - {vehicles.map((vehicle: VehicleStatus) => ( - - - {viewSceneLabels && } - - ))} - - ); + return ( + <> + {vehicles.map((vehicle: VehicleStatus) => ( + + + {viewSceneLabels && } + + ))} + + ); } export default VehicleInstances; diff --git a/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx b/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx index 57f8ab2..338daf9 100644 --- a/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx +++ b/app/src/modules/simulation/vehicle/navMesh/polygonGenerator.tsx @@ -1,7 +1,6 @@ import * as THREE from "three"; import { useEffect } from "react"; import * as turf from "@turf/turf"; -import * as Types from "../../../../types/world/worldTypes"; import { useThree } from "@react-three/fiber"; import { useSceneContext } from "../../../scene/sceneContext"; @@ -47,7 +46,7 @@ export default function PolygonGenerator({ cloned.position.set(cloned.position.x, cloned.position.y + 5, cloned.position.z); cloned?.traverse((child) => { if (child instanceof THREE.Mesh && child.geometry instanceof THREE.ExtrudeGeometry) { - const extrudeGeometry = child.geometry as THREE.ExtrudeGeometry; + const extrudeGeometry = child.geometry; extrudeGeometry.scale(1, 1, 500); child.geometry = extrudeGeometry; child.position.set(cloned.position.x, cloned.position.y + 0.1, cloned.position.z) diff --git a/app/src/services/dashboard/deleteProject.ts b/app/src/services/dashboard/deleteProject.ts index b1c90a9..2063258 100644 --- a/app/src/services/dashboard/deleteProject.ts +++ b/app/src/services/dashboard/deleteProject.ts @@ -13,9 +13,9 @@ export const deleteProject = async ( { method: "PATCH", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, body: JSON.stringify({ userId, organization }), diff --git a/app/src/services/dashboard/deleteTrash.ts b/app/src/services/dashboard/deleteTrash.ts index 561ce28..42d60c9 100644 --- a/app/src/services/dashboard/deleteTrash.ts +++ b/app/src/services/dashboard/deleteTrash.ts @@ -8,9 +8,9 @@ export const deleteTrash = async (organization: string, projectId: string) => { { method: "PATCH", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, } diff --git a/app/src/services/dashboard/duplicateProject.ts b/app/src/services/dashboard/duplicateProject.ts index ca341de..47e7ccb 100644 --- a/app/src/services/dashboard/duplicateProject.ts +++ b/app/src/services/dashboard/duplicateProject.ts @@ -12,9 +12,9 @@ export const duplicateProject = async ( { method: "POST", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, body: JSON.stringify({ diff --git a/app/src/services/dashboard/recentlyViewed.ts b/app/src/services/dashboard/recentlyViewed.ts index 06fa3fd..3d78cb1 100644 --- a/app/src/services/dashboard/recentlyViewed.ts +++ b/app/src/services/dashboard/recentlyViewed.ts @@ -7,9 +7,9 @@ export const recentlyViewed = async (organization: string, userId: string) => { { method: "GET", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, } diff --git a/app/src/services/dashboard/restoreTrash.ts b/app/src/services/dashboard/restoreTrash.ts index fb52007..23f5a68 100644 --- a/app/src/services/dashboard/restoreTrash.ts +++ b/app/src/services/dashboard/restoreTrash.ts @@ -8,9 +8,9 @@ export const restoreTrash = async (organization: string, projectId: string) => { { method: "PATCH", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, } diff --git a/app/src/services/dashboard/searchProjects.ts b/app/src/services/dashboard/searchProjects.ts index 7486b9f..139734d 100644 --- a/app/src/services/dashboard/searchProjects.ts +++ b/app/src/services/dashboard/searchProjects.ts @@ -11,9 +11,9 @@ export const searchProject = async ( { method: "GET", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, } diff --git a/app/src/services/dashboard/trashSearchProject.ts b/app/src/services/dashboard/trashSearchProject.ts index 1e6c0f8..ae089af 100644 --- a/app/src/services/dashboard/trashSearchProject.ts +++ b/app/src/services/dashboard/trashSearchProject.ts @@ -11,9 +11,9 @@ export const trashSearchProject = async ( { method: "GET", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, } diff --git a/app/src/services/dashboard/viewProject.ts b/app/src/services/dashboard/viewProject.ts index c1aab67..731033c 100644 --- a/app/src/services/dashboard/viewProject.ts +++ b/app/src/services/dashboard/viewProject.ts @@ -11,9 +11,9 @@ export const viewProject = async ( { method: "GET", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string + token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", }, } diff --git a/app/src/services/factoryBuilder/aisle/deleteAisleApi.ts b/app/src/services/factoryBuilder/aisle/deleteAisleApi.ts index 28fde46..fa6ca6a 100644 --- a/app/src/services/factoryBuilder/aisle/deleteAisleApi.ts +++ b/app/src/services/factoryBuilder/aisle/deleteAisleApi.ts @@ -1,34 +1,28 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const deleteAisleApi = async (aisleUuid: string, projectId: string, versionId: string) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/DeleteAisle`, { - method: "PATCH", - headers: { - Authorization: "Bearer ", // Replace with actual token - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ aisleUuid, projectId, versionId }), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to clearPanel in the zone"); - } + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/DeleteAisle`, { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ aisleUuid, projectId, versionId }), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + if (!response.ok) { + echo.error("Failed to delete aisle"); + } - const result = await response.json(); - // console.log('result: ', result); - return result; - } catch (error) { - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to delete aisle"); } - } }; diff --git a/app/src/services/factoryBuilder/aisle/getAisleApi.ts b/app/src/services/factoryBuilder/aisle/getAisleApi.ts index dd79ac5..09bb6b1 100644 --- a/app/src/services/factoryBuilder/aisle/getAisleApi.ts +++ b/app/src/services/factoryBuilder/aisle/getAisleApi.ts @@ -1,33 +1,30 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getAisleApi = async (projectId: string, versionId: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Aisles/${projectId}/${versionId}`, - { - method: "GET", - headers: { - Authorization: "Bearer ", // Replace with actual token - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string - refresh_token: localStorage.getItem("refreshToken") || "", - }, - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Aisles/${projectId}/${versionId}`, + { + 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); + } - // console.log("response: ", response); - if (!response.ok) { - console.error("Failed to fetch"); - } + if (!response.ok) { + echo.error("Failed to fetch aisles"); + } - return await response.json(); - } catch (error: any) { - console.error("Failed to get asset image:", error); - console.log(error.message); - } + return await response.json(); + } catch { + echo.error("Failed to fetch aisles"); + } }; diff --git a/app/src/services/factoryBuilder/aisle/upsertAisleApi.ts b/app/src/services/factoryBuilder/aisle/upsertAisleApi.ts index b980c61..d6ef8d3 100644 --- a/app/src/services/factoryBuilder/aisle/upsertAisleApi.ts +++ b/app/src/services/factoryBuilder/aisle/upsertAisleApi.ts @@ -1,41 +1,35 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const upsertAisleApi = async ( - aisleUuid: string, - points: any, - type: Object, - projectId: string, - versionId: string, + aisleUuid: string, + points: any, + type: Object, + projectId: string, + versionId: string, ) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/UpsertAisle`, { - method: "POST", - headers: { - Authorization: "Bearer ", // Replace with actual token - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", // Coerce null to empty string - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ aisleUuid, points, type, projectId, versionId }), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/UpsertAisle`, { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ aisleUuid, points, type, projectId, versionId }), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - if (!response.ok) { - console.error("Failed to add project"); - } + if (!response.ok) { + echo.error("Failed to update aisle"); + } - const result = await response.json(); - // console.log("result: ", result); - return result; - } catch (error) { - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to update aisle"); } - } }; diff --git a/app/src/services/factoryBuilder/asset/assets/getAssetImages.ts b/app/src/services/factoryBuilder/asset/assets/getAssetImages.ts index 7bc7fca..e64768d 100644 --- a/app/src/services/factoryBuilder/asset/assets/getAssetImages.ts +++ b/app/src/services/factoryBuilder/asset/assets/getAssetImages.ts @@ -1,24 +1,23 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; export const getAssetImages = async (cursor?: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/v3/AssetDatas?limit=10${cursor ? `&cursor=${cursor}` : ""}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - } - ); + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/v3/AssetDatas?limit=10${cursor ? `&cursor=${cursor}` : ""}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); - if (!response.ok) { - console.error("Failed to fetch assets"); + if (!response.ok) { + echo.error("Failed to fetch assets"); + } + + return await response.json(); + } catch { + echo.error("Failed to fetch assets"); } - - return await response.json(); - } catch (error: any) { - echo.error("Failed to get asset image"); - console.log(error.message); - } }; diff --git a/app/src/services/factoryBuilder/asset/assets/getAssetModel.ts b/app/src/services/factoryBuilder/asset/assets/getAssetModel.ts index 27fe88a..d451bc4 100644 --- a/app/src/services/factoryBuilder/asset/assets/getAssetModel.ts +++ b/app/src/services/factoryBuilder/asset/assets/getAssetModel.ts @@ -1,29 +1,24 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; export const getAssetModel = async (modelId: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/v2/AssetFile/${modelId}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - } - ); + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/v2/AssetFile/${modelId}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); - if (!response.ok) { - console.error("Failed to fetch model"); - } + if (!response.ok) { + echo.error("Failed to fetch model"); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get asset model"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to fetch model"); } - } }; diff --git a/app/src/services/factoryBuilder/asset/assets/getAssetThumbnail.ts b/app/src/services/factoryBuilder/asset/assets/getAssetThumbnail.ts index 77469a0..3e3a8e3 100644 --- a/app/src/services/factoryBuilder/asset/assets/getAssetThumbnail.ts +++ b/app/src/services/factoryBuilder/asset/assets/getAssetThumbnail.ts @@ -1,7 +1,6 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; -export const getAssetThumbnail = async (assetId: String) => { - +export const getAssetThumbnail = async (assetId: string) => { try { const response = await fetch( `${url_Backend_dwinzo}/api/v2/getAssetThumbnail/${assetId}`, @@ -21,13 +20,11 @@ export const getAssetThumbnail = async (assetId: String) => { } if (!response.ok) { - throw new Error("Failed to fetch assets"); + echo.error("Failed to fetch asset thumbnail"); } - // return await response.json(); - } catch (error: any) { - echo.error("Failed to get asset image"); - + } catch { + echo.error("Failed to fetch asset thumbnail"); } }; diff --git a/app/src/services/factoryBuilder/asset/assets/getCategoryAsset.ts b/app/src/services/factoryBuilder/asset/assets/getCategoryAsset.ts index 478d240..0fbf9a1 100644 --- a/app/src/services/factoryBuilder/asset/assets/getCategoryAsset.ts +++ b/app/src/services/factoryBuilder/asset/assets/getCategoryAsset.ts @@ -1,20 +1,20 @@ let BackEnd_url = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; -export const getCategoryAsset = async (categoryName: any) => { - try { - const response = await fetch( - `${BackEnd_url}/api/v2/getCategoryAssets/${categoryName}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - } - ); - const result = await response.json(); - return result; - } catch (error: any) { - echo.error("Failed to get category asset"); - console.log(error.message); - } +export const getCategoryAsset = async (categoryName: string) => { + try { + const response = await fetch( + `${BackEnd_url}/api/v2/getCategoryAssets/${categoryName}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to get category assets"); + } }; diff --git a/app/src/services/factoryBuilder/asset/decals/getCategoryDecals.ts b/app/src/services/factoryBuilder/asset/decals/getCategoryDecals.ts index 9a4f2ba..f45a212 100644 --- a/app/src/services/factoryBuilder/asset/decals/getCategoryDecals.ts +++ b/app/src/services/factoryBuilder/asset/decals/getCategoryDecals.ts @@ -1,20 +1,20 @@ let BackEnd_url = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; -export const getCategoryDecals = async (category: any) => { - try { - const response = await fetch( - `${BackEnd_url}/api/v1/categoryDecalDatas/${category}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - } - ); - const result = await response.json(); - return result; - } catch (error: any) { - echo.error("Failed to get category asset"); - console.log(error.message); - } +export const getCategoryDecals = async (category: string) => { + try { + const response = await fetch( + `${BackEnd_url}/api/v1/categoryDecalDatas/${category}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to get category decals"); + } }; \ No newline at end of file diff --git a/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetApi.ts similarity index 72% rename from app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi.ts rename to app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetApi.ts index f752fe4..ae50916 100644 --- a/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetsApi.ts +++ b/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorAssetApi.ts @@ -7,7 +7,7 @@ export interface DeleteFloorAssetsParams { versionId: string; } -export const deleteFloorAssetsApi = async (params: DeleteFloorAssetsParams) => { +export const deleteFloorAssetApi = async (params: DeleteFloorAssetsParams) => { try { const response = await fetch(`${url_Backend_dwinzo}/api/V1/assetDelete`, { method: "PATCH", @@ -26,17 +26,12 @@ export const deleteFloorAssetsApi = async (params: DeleteFloorAssetsParams) => { } if (!response.ok) { - console.error("Failed to delete Floor Asset"); + echo.error("Failed to delete Floor Asset"); } const result = await response.json(); return result; - } catch (error) { - console.error("Failed to delete floor asset"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } + } catch { + echo.error("Failed to delete Floor Asset"); } }; diff --git a/app/src/services/factoryBuilder/asset/floorAsset/getAssetField.ts b/app/src/services/factoryBuilder/asset/floorAsset/getAssetField.ts index 83567a9..e63a889 100644 --- a/app/src/services/factoryBuilder/asset/floorAsset/getAssetField.ts +++ b/app/src/services/factoryBuilder/asset/floorAsset/getAssetField.ts @@ -20,17 +20,12 @@ export const getAssetFieldApi = async (assetId: string) => { } if (!response.ok) { - console.error("Failed to fetch asset field"); + echo.error("Failed to fetch asset field"); } const result = await response.json(); return result; - } catch (error) { - echo.error("Failed to get asset field"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } + } catch { + echo.error("Failed to fetch asset field"); } }; diff --git a/app/src/services/factoryBuilder/asset/floorAsset/getFloorItemsApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/getFloorItemsApi.ts index 5ead053..5e50734 100644 --- a/app/src/services/factoryBuilder/asset/floorAsset/getFloorItemsApi.ts +++ b/app/src/services/factoryBuilder/asset/floorAsset/getFloorItemsApi.ts @@ -1,39 +1,32 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -export const getFloorAssets = async (organization: string, projectId?: string, versionId?: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/floorAssets/${projectId}/${versionId}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } +export const getFloorAssets = async (projectId: string, versionId: string) => { + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/floorAssets/${projectId}/${versionId}`, + { + 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); + } - // console.log('response: ', response); - if (!response.ok) { - console.error("Failed to get assets"); - } + if (!response.ok) { + echo.error("Failed to get assets"); + } - const result = await response.json(); + const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get floor asset"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + return result; + } catch { + echo.error("Failed to get assets"); } - } }; diff --git a/app/src/services/factoryBuilder/asset/floorAsset/setAssetsApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/setAssetsApi.ts index 4b00bc3..ce63b60 100644 --- a/app/src/services/factoryBuilder/asset/floorAsset/setAssetsApi.ts +++ b/app/src/services/factoryBuilder/asset/floorAsset/setAssetsApi.ts @@ -1,34 +1,42 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -export const setAssetsApi = async (data: any) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/setAsset`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(data), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to set or update Floor Item"); - } +type assetType = { + modelUuid?: string; + modelName?: string; + assetId?: string; + position?: [number, number, number]; + rotation?: { x: number; y: number; z: number; }; + isLocked?: boolean; + isVisible?: boolean; + eventData?: any; + projectId?: string, + versionId?: string +} - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to set floor items"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); +export const setAssetsApi = async (data: assetType) => { + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/setAsset`, { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(data), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + echo.error("Failed to set or update Floor asset"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to set or update Floor asset"); } - } }; diff --git a/app/src/services/factoryBuilder/asset/wallAsset/deleteWallAssetApi.ts b/app/src/services/factoryBuilder/asset/wallAsset/deleteWallAssetApi.ts index 3751aae..11243dc 100644 --- a/app/src/services/factoryBuilder/asset/wallAsset/deleteWallAssetApi.ts +++ b/app/src/services/factoryBuilder/asset/wallAsset/deleteWallAssetApi.ts @@ -24,17 +24,12 @@ export const deleteWallAssetApi = async ( } if (!response.ok) { - console.error("Failed to delete wall asset:", response.statusText); + echo.error("Failed to delete wall asset"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to delete wall asset"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/asset/wallAsset/getWallAssetsApi.ts b/app/src/services/factoryBuilder/asset/wallAsset/getWallAssetsApi.ts index d6b12ed..59dd3fb 100644 --- a/app/src/services/factoryBuilder/asset/wallAsset/getWallAssetsApi.ts +++ b/app/src/services/factoryBuilder/asset/wallAsset/getWallAssetsApi.ts @@ -21,17 +21,12 @@ export const getWallAssetsApi = async ( } if (!response.ok) { - console.error("Failed to get wall assets:", response.statusText); + echo.error("Failed to get wall assets"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to get wall assets"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/asset/wallAsset/upsertWallAssetApi.ts b/app/src/services/factoryBuilder/asset/wallAsset/upsertWallAssetApi.ts index 9f94183..0150cdd 100644 --- a/app/src/services/factoryBuilder/asset/wallAsset/upsertWallAssetApi.ts +++ b/app/src/services/factoryBuilder/asset/wallAsset/upsertWallAssetApi.ts @@ -23,17 +23,12 @@ export const upsertWallAssetApi = async ( } if (!response.ok) { - console.error("Failed to upsert wall asset:", response.statusText); + echo.error("Failed to upsert wall asset"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to upsert wall asset"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/camera/getCameraApi.ts b/app/src/services/factoryBuilder/camera/getCameraApi.ts index 2ea25a9..b97085a 100644 --- a/app/src/services/factoryBuilder/camera/getCameraApi.ts +++ b/app/src/services/factoryBuilder/camera/getCameraApi.ts @@ -1,41 +1,35 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -export const getCameraApi = async (organization: string, userId: string, projectId?: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/cameras/${projectId}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } +export const getCameraApi = async (projectId: string) => { + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/cameras/${projectId}`, + { + 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 Camera position and target"); - } + if (!response.ok) { + echo.error("Failed to get Camera position and target"); + } - const result = await response.json(); - if (result === "user not found") { - return null; - } else { - return result; + const result = await response.json(); + if (result === "user not found") { + return null; + } else { + return result; + } + } catch { + echo.error("Failed to get Camera position and target"); } - } catch (error) { - echo.error("Failed to get camera"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } }; diff --git a/app/src/services/factoryBuilder/camera/setCameraApi.ts b/app/src/services/factoryBuilder/camera/setCameraApi.ts index b3a2f78..58e5df3 100644 --- a/app/src/services/factoryBuilder/camera/setCameraApi.ts +++ b/app/src/services/factoryBuilder/camera/setCameraApi.ts @@ -28,17 +28,12 @@ export const setCameraApi = async ( } if (!response.ok) { - console.error("Failed to set Camera Position and Target"); + echo.error("Failed to set Camera Position and Target"); } const result = await response.json(); return result; - } catch (error) { - echo.error("Failed to set camera"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } + } catch { + echo.error("Failed to set Camera Position and Target"); } }; diff --git a/app/src/services/factoryBuilder/collab/getActiveUsers.ts b/app/src/services/factoryBuilder/collab/getActiveUsers.ts index 21a33f2..91eae88 100644 --- a/app/src/services/factoryBuilder/collab/getActiveUsers.ts +++ b/app/src/services/factoryBuilder/collab/getActiveUsers.ts @@ -1,41 +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}`; + 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") || "", - }, - }); + 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); + 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"); } - - if (!response.ok) { - console.error(`Error: ${response.status} - ${response.statusText}`); - } - - if (!response.ok) { - console.error("Failed to get active cameras "); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get active users"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } } diff --git a/app/src/services/factoryBuilder/collab/getProjectSharedList.ts b/app/src/services/factoryBuilder/collab/getProjectSharedList.ts index 0c39b99..ee4b123 100644 --- a/app/src/services/factoryBuilder/collab/getProjectSharedList.ts +++ b/app/src/services/factoryBuilder/collab/getProjectSharedList.ts @@ -1,32 +1,31 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getProjectSharedList = async (projectId: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/projectsharedList?projectId=${projectId}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - throw new Error("Failed to get users"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/projectsharedList?projectId=${projectId}`, + { + 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); + } - return await response.json(); - } catch (error: any) { - echo.error("Failed to get users"); - console.log(error.message); - } + if (!response.ok) { + echo.error("Failed to get shared project users"); + } + + return await response.json(); + } catch { + echo.error("Failed to get shared project users"); + } }; diff --git a/app/src/services/factoryBuilder/collab/getSearchUsers.ts b/app/src/services/factoryBuilder/collab/getSearchUsers.ts index 01ab7a9..e24b909 100644 --- a/app/src/services/factoryBuilder/collab/getSearchUsers.ts +++ b/app/src/services/factoryBuilder/collab/getSearchUsers.ts @@ -1,32 +1,31 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getSearchUsers = async (searchMail: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/searchMail?searchMail=${searchMail}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - throw new Error("Failed to get users"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/searchMail?searchMail=${searchMail}`, + { + 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); + } - return await response.json(); - } catch (error: any) { - echo.error("Failed to get users"); - console.log(error.message); - } + if (!response.ok) { + echo.error("Failed to get users"); + } + + return await response.json(); + } catch { + echo.error("Failed to get users"); + } }; diff --git a/app/src/services/factoryBuilder/collab/getUsersApi.ts b/app/src/services/factoryBuilder/collab/getUsersApi.ts index a182c54..d1803df 100644 --- a/app/src/services/factoryBuilder/collab/getUsersApi.ts +++ b/app/src/services/factoryBuilder/collab/getUsersApi.ts @@ -1,40 +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}`; + 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") || "", - }, - }); + 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error(`Error: ${response.status} - ${response.statusText}`); - } + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - if (!response.ok) { - console.error("Failed to get users "); - } + if (!response.ok) { + console.error("Failed to get shared users"); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get user API"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to get shared users"); } - } } diff --git a/app/src/services/factoryBuilder/collab/giveCollabAccess.ts b/app/src/services/factoryBuilder/collab/giveCollabAccess.ts index 558bcba..f620639 100644 --- a/app/src/services/factoryBuilder/collab/giveCollabAccess.ts +++ b/app/src/services/factoryBuilder/collab/giveCollabAccess.ts @@ -1,39 +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 + 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to set Camera Position and Target"); - } + 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); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to give collab access"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + 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/shareAccess.ts index de7a824..2310aa3 100644 --- a/app/src/services/factoryBuilder/collab/shareAccess.ts +++ b/app/src/services/factoryBuilder/collab/shareAccess.ts @@ -1,48 +1,38 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -// let url_Backend_dwinzo = `http://192.168.0.102:5000`; export const shareAccess = async ( - projectId: string, - targetUserId: string, - newAccessPoint: string + projectId: string, + targetUserId: string, + newAccessPoint: string ) => { - const body: any = { - projectId, - targetUserId, - newAccessPoint, - }; + const body = { projectId, targetUserId, newAccessPoint }; - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/sharedAccespoint`, - { - method: "PATCH", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(body), - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/sharedAccespoint`, + { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(body), + } + ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - if (!response.ok) { - console.error("Failed to clearPanel in the zone"); - } + if (!response.ok) { + echo.error("Failed to share accesspoint"); + } - const result = await response.json(); - return result; - } catch (error) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to share accesspoint"); } - } }; diff --git a/app/src/services/factoryBuilder/collab/shareProject.ts b/app/src/services/factoryBuilder/collab/shareProject.ts index eb14ffe..77f0021 100644 --- a/app/src/services/factoryBuilder/collab/shareProject.ts +++ b/app/src/services/factoryBuilder/collab/shareProject.ts @@ -1,36 +1,31 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const shareProject = async (addUserId: string, projectId: string) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/projectshared`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ addUserId, projectId }), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to add project"); - } + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/projectshared`, { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ addUserId, projectId }), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - const result = await response.json(); - console.log("result: ", result); + if (!response.ok) { + echo.error("Failed to share project"); + } - return result; - } catch (error) { - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + + return result; + } catch { + echo.error("Failed to share project"); } - } }; diff --git a/app/src/services/factoryBuilder/comments/addCommentsApi.ts b/app/src/services/factoryBuilder/comments/addCommentsApi.ts index c222a99..3d40a89 100644 --- a/app/src/services/factoryBuilder/comments/addCommentsApi.ts +++ b/app/src/services/factoryBuilder/comments/addCommentsApi.ts @@ -1,54 +1,41 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const addCommentsApi = async ( - projectId: any, - comment: string, - threadId?: string, - commentId?: string, - versionId?: string + projectId: any, + comment: string, + threadId: string, + commentId: string, + versionId: string ) => { - console.log( - " projectId, comments, threadId: ", - projectId, - comment, - threadId, - commentId, - versionId - ); - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Thread/addComment`, - { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ projectId, comment, threadId, commentId }), - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - - if (!response.ok) { - console.error("Failed to add project"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Thread/addComment`, + { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ projectId, comment, threadId, commentId, versionId }), + } + ); - const result = await response.json(); - console.log("result: ", result); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - return result; - } catch (error) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error("An unknown error occurred"); + if (!response.ok) { + echo.error("Failed to add comment"); + } + + const result = await response.json(); + + return result; + } catch { + echo.error("Failed to add comment"); } - } }; diff --git a/app/src/services/factoryBuilder/comments/createThreadApi.ts b/app/src/services/factoryBuilder/comments/createThreadApi.ts index 576c7ba..f30578c 100644 --- a/app/src/services/factoryBuilder/comments/createThreadApi.ts +++ b/app/src/services/factoryBuilder/comments/createThreadApi.ts @@ -1,47 +1,37 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const createThreadApi = async ( - projectId: any, - state: string, - position: any, - rotation: any, - threadTitle: any, - versionId?: string + projectId: any, + state: string, + position: any, + rotation: any, + threadTitle: any, + versionId: string ) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/upsetThread`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ - projectId, - state, - position, - rotation, - threadTitle, - versionId, - }), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/upsetThread`, { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ projectId, state, position, rotation, threadTitle, versionId }), + }); + + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + echo.error("Failed to set or update thread"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to set or update thread"); } - if (!response.ok) { - console.error("Failed to add project"); - } - const result = await response.json(); - console.log("result: ", result); - return result; - } catch (error) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error("An unknown error occurred"); - } - } }; diff --git a/app/src/services/factoryBuilder/comments/deleteCommentApi.ts b/app/src/services/factoryBuilder/comments/deleteCommentApi.ts index 32371bb..8f3da5a 100644 --- a/app/src/services/factoryBuilder/comments/deleteCommentApi.ts +++ b/app/src/services/factoryBuilder/comments/deleteCommentApi.ts @@ -1,49 +1,43 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -// let url_Backend_dwinzo = `http://192.168.0.102:5000`; export const deleteCommentApi = async ( - projectId: string, - threadId: string, - commentId: string, - versionId?: string + projectId: string, + threadId: string, + commentId: string, + versionId: string ) => { - const body: any = { - projectId, - threadId, - commentId, - versionId, - }; + const body: any = { + projectId, + threadId, + commentId, + versionId, + }; - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Thread/deleteComment`, - { - method: "PATCH", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(body), - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to clearPanel in the zone"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Thread/deleteComment`, + { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(body), + } + ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + if (!response.ok) { + echo.error("Failed to delete comments"); + } - const result = await response.json(); - return result; - } catch (error) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to delete comments"); } - } }; diff --git a/app/src/services/factoryBuilder/comments/deleteThreadApi.ts b/app/src/services/factoryBuilder/comments/deleteThreadApi.ts index ab18ea1..8ff9dc6 100644 --- a/app/src/services/factoryBuilder/comments/deleteThreadApi.ts +++ b/app/src/services/factoryBuilder/comments/deleteThreadApi.ts @@ -1,44 +1,38 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -// let url_Backend_dwinzo = `http://192.168.0.102:5000`; export const deleteThreadApi = async ( - projectId: string, - threadId: string, - versionId: string + projectId: string, + threadId: string, + versionId: string ) => { - const body: any = { - projectId, - threadId, - versionId, - }; + const body: any = { + projectId, + threadId, + versionId, + }; - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/Thread/delete`, { - method: "PATCH", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(body), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to clearPanel in the zone"); - } + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/Thread/delete`, { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(body), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + if (!response.ok) { + echo.error("Failed to delete thread"); + } - const result = await response.json(); - return result; - } catch (error) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to delete thread"); } - } }; diff --git a/app/src/services/factoryBuilder/comments/editThreadTitleApi.ts b/app/src/services/factoryBuilder/comments/editThreadTitleApi.ts index 6ce11dc..89aeccd 100644 --- a/app/src/services/factoryBuilder/comments/editThreadTitleApi.ts +++ b/app/src/services/factoryBuilder/comments/editThreadTitleApi.ts @@ -1,49 +1,43 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -// let url_Backend_dwinzo = `http://192.168.0.102:5000`; export const editThreadTitleApi = async ( - projectId: string, - threadId: string, - threadTitle: string, - versionId?: string + projectId: string, + threadId: string, + threadTitle: string, + versionId: string ) => { - const body: any = { - projectId, - threadId, - threadTitle, - versionId, - }; + const body: any = { + projectId, + threadId, + threadTitle, + versionId, + }; - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Thread/updateTitle`, - { - method: "PATCH", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(body), - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to clearPanel in the zone"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Thread/updateTitle`, + { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(body), + } + ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + if (!response.ok) { + echo.error("Failed to edit thread title"); + } - const result = await response.json(); - return result; - } catch (error) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to edit thread title"); } - } }; diff --git a/app/src/services/factoryBuilder/comments/getAllThreads.ts b/app/src/services/factoryBuilder/comments/getAllThreads.ts index 15a189f..6222cf2 100644 --- a/app/src/services/factoryBuilder/comments/getAllThreads.ts +++ b/app/src/services/factoryBuilder/comments/getAllThreads.ts @@ -1,39 +1,33 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getAllThreads = async (projectId: string, versionId: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Threads/${projectId}/${versionId}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - - if (!response.ok) { - console.error("Failed to get assets"); - return; - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Threads/${projectId}/${versionId}`, + { + 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); + } - const result = await response.json(); + if (!response.ok) { + echo.error("Failed to fetch threads"); + return; + } - return result; - } catch (error) { - echo.error("Failed to get floor asset"); - if (error instanceof Error) { - console.error(error.message); - } else { - console.error("An unknown error occurred"); + const result = await response.json(); + + return result; + } catch { + echo.error("Failed to fetch threads"); } - } }; diff --git a/app/src/services/factoryBuilder/environment/findEnvironment.ts b/app/src/services/factoryBuilder/environment/findEnvironment.ts index f20663e..1f652ab 100644 --- a/app/src/services/factoryBuilder/environment/findEnvironment.ts +++ b/app/src/services/factoryBuilder/environment/findEnvironment.ts @@ -1,38 +1,33 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; -export const findEnvironment = async (organization: string, userId: string, projectId?: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Environments/${projectId}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } +export const findEnvironment = async (projectId: string) => { - if (!response.ok) { - console.error("Failed to get wall and roof visibility"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Environments/${projectId}`, + { + 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); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to find env"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + if (!response.ok) { + echo.error("Failed to get environment data"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to get environment data"); } - } }; diff --git a/app/src/services/factoryBuilder/environment/setEnvironment.ts b/app/src/services/factoryBuilder/environment/setEnvironment.ts index d9f6073..e7b5c4c 100644 --- a/app/src/services/factoryBuilder/environment/setEnvironment.ts +++ b/app/src/services/factoryBuilder/environment/setEnvironment.ts @@ -1,58 +1,41 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const setEnvironment = async ( - organization: string, - userId: string, - wallVisibility: boolean, - roofVisibility: boolean, - shadowVisibility: boolean, - renderDistance: number, - limitDistance: boolean, - projectId?: string + organization: string, + userId: string, + wallVisibility: boolean, + roofVisibility: boolean, + shadowVisibility: boolean, + renderDistance: number, + limitDistance: boolean, + projectId: string ) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/SetEnvironments`, - { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ - organization, - userId, - wallVisibility, - roofVisibility, - shadowVisibility, - renderDistance, - limitDistance, - projectId - }), - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - // console.log('responseenv: ', response); - if (!response.ok) { - console.error("Failed to set wall and roof visibility"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/SetEnvironments`, + { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ organization, userId, wallVisibility, roofVisibility, shadowVisibility, renderDistance, limitDistance, projectId }), + } + ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + if (!response.ok) { + echo.error("Failed to set environment data"); + } - const result = await response.json(); - // console.log('resultsetenv: ', result); - return result; - } catch (error) { - echo.error("Failed to set env"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to set environment data"); } - } }; diff --git a/app/src/services/factoryBuilder/floor/deleteFloorApi.ts b/app/src/services/factoryBuilder/floor/deleteFloorApi.ts index 3043646..1974052 100644 --- a/app/src/services/factoryBuilder/floor/deleteFloorApi.ts +++ b/app/src/services/factoryBuilder/floor/deleteFloorApi.ts @@ -23,17 +23,12 @@ export const deleteFloorApi = async ( } if (!response.ok) { - console.error("Failed to delete floor:", response.statusText); + echo.error("Failed to delete floor"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to delete floor"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/floor/getFloorsApi.ts b/app/src/services/factoryBuilder/floor/getFloorsApi.ts index 2659e61..3c17197 100644 --- a/app/src/services/factoryBuilder/floor/getFloorsApi.ts +++ b/app/src/services/factoryBuilder/floor/getFloorsApi.ts @@ -21,17 +21,12 @@ export const getFloorsApi = async ( } if (!response.ok) { - console.error("Failed to get floors:", response.statusText); + echo.error("Failed to get floors"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to get floors"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/floor/upsertFloorApi.ts b/app/src/services/factoryBuilder/floor/upsertFloorApi.ts index 45590c1..4656c77 100644 --- a/app/src/services/factoryBuilder/floor/upsertFloorApi.ts +++ b/app/src/services/factoryBuilder/floor/upsertFloorApi.ts @@ -23,17 +23,12 @@ export const upsertFloorApi = async ( } if (!response.ok) { - console.error("Failed to upsert floor:", response.statusText); + echo.error("Failed to upsert floor"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to upsert floor"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/signInSignUp/changePasswordApi.ts b/app/src/services/factoryBuilder/signInSignUp/changePasswordApi.ts index bc42635..7ab20ef 100644 --- a/app/src/services/factoryBuilder/signInSignUp/changePasswordApi.ts +++ b/app/src/services/factoryBuilder/signInSignUp/changePasswordApi.ts @@ -1,29 +1,30 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const changePasswordApi = async ( - resetToken: string, - newPassword: string, - confirmPassword: string + resetToken: string, + newPassword: string, + confirmPassword: string ) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Auth/reset-password/${resetToken}`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ newPassword, confirmPassword }), - } - ); - const result = await response.json(); + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Auth/reset-password/${resetToken}`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ newPassword, confirmPassword }), + } + ); - return result; - } catch (error) { - echo.error("Failed to create password"); - if (error instanceof Error) { - return { error: error.message }; - } else { - return { error: "An unknown error occurred" }; + const result = await response.json(); + + return result; + } catch (error) { + echo.error("Failed to create password"); + if (error instanceof Error) { + return { error: error.message }; + } else { + return { error: "An unknown error occurred" }; + } } - } }; diff --git a/app/src/services/factoryBuilder/signInSignUp/checkEmailApi.ts b/app/src/services/factoryBuilder/signInSignUp/checkEmailApi.ts index 6d8138a..59e2e85 100644 --- a/app/src/services/factoryBuilder/signInSignUp/checkEmailApi.ts +++ b/app/src/services/factoryBuilder/signInSignUp/checkEmailApi.ts @@ -1,25 +1,26 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const checkEmailApi = async (Email: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Auth/forgetPassword`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ Email }), - } - ); - const result = await response.json(); + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Auth/forgetPassword`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ Email }), + } + ); - return result; - } catch (error) { - echo.error("Failed to create password"); - if (error instanceof Error) { - return { error: error.message }; - } else { - return { error: "An unknown error occurred" }; + const result = await response.json(); + + return result; + } catch (error) { + echo.error("Failed to create password"); + if (error instanceof Error) { + return { error: error.message }; + } else { + return { error: "An unknown error occurred" }; + } } - } }; diff --git a/app/src/services/factoryBuilder/signInSignUp/signInApi.ts b/app/src/services/factoryBuilder/signInSignUp/signInApi.ts index 4082dac..57e1c67 100644 --- a/app/src/services/factoryBuilder/signInSignUp/signInApi.ts +++ b/app/src/services/factoryBuilder/signInSignUp/signInApi.ts @@ -1,22 +1,23 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const signInApi = async (Email: string, Password: Object, organization: Object, fingerprint: any) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/Auth/login`, { - method: "POST", - headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ Email, Password, organization, fingerprint }), - }); - const result = await response.json(); + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/Auth/login`, { + method: "POST", + headers: { "Content-Type": "application/json", }, + body: JSON.stringify({ Email, Password, organization, fingerprint }), + }); - return result; - } catch (error) { - echo.error("Failed to sign-in"); - if (error instanceof Error) { - return { error: error.message }; - } else { - return { error: "An unknown error occurred" }; - } - } + const result = await response.json(); + + return result; + } catch (error) { + echo.error("Failed to sign-in"); + if (error instanceof Error) { + return { error: error.message }; + } else { + return { error: "An unknown error occurred" }; + } + } }; diff --git a/app/src/services/factoryBuilder/signInSignUp/signUpApi.ts b/app/src/services/factoryBuilder/signInSignUp/signUpApi.ts index 91db59c..1ca1a16 100644 --- a/app/src/services/factoryBuilder/signInSignUp/signUpApi.ts +++ b/app/src/services/factoryBuilder/signInSignUp/signUpApi.ts @@ -1,30 +1,31 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const signUpApi = async ( - userName: string, - Email: string, - Password: Object, - organization: Object + userName: string, + Email: string, + Password: Object, + organization: Object ) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/Auth/signup`, { - method: "POST", - headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ userName, Email, Password, organization }), - }); - if (!response.ok) { - console.error("Failed to signUpApi"); - } + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/Auth/signup`, { + method: "POST", + headers: { "Content-Type": "application/json", }, + body: JSON.stringify({ userName, Email, Password, organization }), + }); - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to sign-up"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + if (!response.ok) { + console.error("Failed to signUpApi"); + } + + const result = await response.json(); + return result; + } catch (error) { + echo.error("Failed to sign-up"); + if (error instanceof Error) { + console.log(error.message); + } else { + console.log("An unknown error occurred"); + } } - } }; diff --git a/app/src/services/factoryBuilder/signInSignUp/verifyOtpApi.ts b/app/src/services/factoryBuilder/signInSignUp/verifyOtpApi.ts index 9b289e5..c3c091e 100644 --- a/app/src/services/factoryBuilder/signInSignUp/verifyOtpApi.ts +++ b/app/src/services/factoryBuilder/signInSignUp/verifyOtpApi.ts @@ -1,28 +1,29 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const verifyOtpApi = async (Email: string, Otp: number) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/Auth/validate-otp`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - Email, - otp: Number(Otp), - }), - } - ); - const result = await response.json(); + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/Auth/validate-otp`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + Email, + otp: Number(Otp), + }), + } + ); - return result; - } catch (error) { - echo.error("Failed to create password"); - if (error instanceof Error) { - return { error: error.message }; - } else { - return { error: "An unknown error occurred" }; - } - } + const result = await response.json(); + + return result; + } catch (error) { + echo.error("Failed to create password"); + if (error instanceof Error) { + return { error: error.message }; + } else { + return { error: "An unknown error occurred" }; + } + } }; diff --git a/app/src/services/factoryBuilder/versionControl/addVersionApi.ts b/app/src/services/factoryBuilder/versionControl/addVersionApi.ts index c554886..b3a545e 100644 --- a/app/src/services/factoryBuilder/versionControl/addVersionApi.ts +++ b/app/src/services/factoryBuilder/versionControl/addVersionApi.ts @@ -23,22 +23,16 @@ export const createVersionApi = async (projectId: string, createdBy: string, hie ); const newAccessToken = response.headers.get("x-access-token"); if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); + localStorage.setItem("token", newAccessToken); } if (!response.ok) { - console.error("Failed to create Version History"); + echo.error("Failed to create Version History"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to create Version History"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/versionControl/getVersionDataApi.ts b/app/src/services/factoryBuilder/versionControl/getVersionDataApi.ts index 5fbc205..50513e6 100644 --- a/app/src/services/factoryBuilder/versionControl/getVersionDataApi.ts +++ b/app/src/services/factoryBuilder/versionControl/getVersionDataApi.ts @@ -1,6 +1,7 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getVersionDataApi = async (projectId: string, versionId: string) => { + try { const response = await fetch( `${url_Backend_dwinzo}/api/V1/version/${versionId}/${projectId}`, @@ -16,22 +17,16 @@ export const getVersionDataApi = async (projectId: string, versionId: string) => ); const newAccessToken = response.headers.get("x-access-token"); if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); + localStorage.setItem("token", newAccessToken); } if (!response.ok) { - console.error("Failed to get Version Data"); + echo.error("Failed to get Version Data"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to get Version Data"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/versionControl/getVersionHistoryApi.ts b/app/src/services/factoryBuilder/versionControl/getVersionHistoryApi.ts index 005d6f6..53bd558 100644 --- a/app/src/services/factoryBuilder/versionControl/getVersionHistoryApi.ts +++ b/app/src/services/factoryBuilder/versionControl/getVersionHistoryApi.ts @@ -1,37 +1,31 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getVersionHistoryApi = async (projectId: string, page?: number, limit?: number) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/${projectId}/versions`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/${projectId}/versions`, + { + 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 Version History"); - } + if (!response.ok) { + echo.error("Failed to get Version History"); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get Version History"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to get Version History"); } - } }; diff --git a/app/src/services/factoryBuilder/wall/deleteWallApi.ts b/app/src/services/factoryBuilder/wall/deleteWallApi.ts index 8a91d11..4832941 100644 --- a/app/src/services/factoryBuilder/wall/deleteWallApi.ts +++ b/app/src/services/factoryBuilder/wall/deleteWallApi.ts @@ -5,6 +5,7 @@ export const deleteWallApi = async ( versionId: string, wallUuid: string ) => { + try { const response = await fetch(`${url_Backend_dwinzo}/api/V1/deleteWall`, { method: "PATCH", @@ -23,17 +24,12 @@ export const deleteWallApi = async ( } if (!response.ok) { - console.error("Failed to delete wall:", response.statusText); + echo.error("Failed to delete wall"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to delete wall"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/wall/getWallsApi.ts b/app/src/services/factoryBuilder/wall/getWallsApi.ts index b3f94b0..23cbb01 100644 --- a/app/src/services/factoryBuilder/wall/getWallsApi.ts +++ b/app/src/services/factoryBuilder/wall/getWallsApi.ts @@ -4,6 +4,7 @@ export const getWallsApi = async ( projectId: string, versionId: string, ) => { + try { const response = await fetch(`${url_Backend_dwinzo}/api/V1/Walls/${projectId}/${versionId}`, { method: "GET", @@ -21,17 +22,12 @@ export const getWallsApi = async ( } if (!response.ok) { - console.error("Failed to get walls:", response.statusText); + echo.error("Failed to get walls"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to get walls"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/wall/upsertWallApi.ts b/app/src/services/factoryBuilder/wall/upsertWallApi.ts index 023da68..5ad04c8 100644 --- a/app/src/services/factoryBuilder/wall/upsertWallApi.ts +++ b/app/src/services/factoryBuilder/wall/upsertWallApi.ts @@ -5,6 +5,7 @@ export const upsertWallApi = async ( versionId: string, wallData: Wall ) => { + try { const response = await fetch(`${url_Backend_dwinzo}/api/V1/UpsertWall`, { method: "POST", @@ -23,17 +24,12 @@ export const upsertWallApi = async ( } if (!response.ok) { - console.error("Failed to upsert wall:", response.statusText); + echo.error("Failed to upsert wall"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to upsert wall"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/webWorkers/distanceWorker.js b/app/src/services/factoryBuilder/webWorkers/distanceWorker.js index 44111c5..74d49b5 100644 --- a/app/src/services/factoryBuilder/webWorkers/distanceWorker.js +++ b/app/src/services/factoryBuilder/webWorkers/distanceWorker.js @@ -13,9 +13,7 @@ onmessage = function (e) { } else if (isRendered && distance > renderDistance) { postMessage({ shouldRender: false, modelUuid }); } - } else { - if (!isRendered) { - postMessage({ shouldRender: true, modelUuid }); - } + } else if (!isRendered) { + postMessage({ shouldRender: true, modelUuid }); } }; diff --git a/app/src/services/factoryBuilder/zone/deleteZoneApi.ts b/app/src/services/factoryBuilder/zone/deleteZoneApi.ts index 87b80dd..504505b 100644 --- a/app/src/services/factoryBuilder/zone/deleteZoneApi.ts +++ b/app/src/services/factoryBuilder/zone/deleteZoneApi.ts @@ -5,6 +5,7 @@ export const deleteZoneApi = async ( versionId: string, zoneUuid: string ) => { + try { const response = await fetch(`${url_Backend_dwinzo}/api/V1/zones/delete`, { method: "PATCH", @@ -23,17 +24,12 @@ export const deleteZoneApi = async ( } if (!response.ok) { - console.error("Failed to delete zone:", response.statusText); + echo.error("Failed to delete zone"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to delete zone"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/zone/getZonesApi.ts b/app/src/services/factoryBuilder/zone/getZonesApi.ts index 2714685..0186e30 100644 --- a/app/src/services/factoryBuilder/zone/getZonesApi.ts +++ b/app/src/services/factoryBuilder/zone/getZonesApi.ts @@ -1,6 +1,7 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getZonesApi = async (projectId: string, versionId: string,) => { + try { const response = await fetch(`${url_Backend_dwinzo}/api/V1/zones/${projectId}/${versionId}`, { method: "GET", @@ -18,17 +19,12 @@ export const getZonesApi = async (projectId: string, versionId: string,) => { } if (!response.ok) { - console.error("Failed to get zones:", response.statusText); + echo.error("Failed to get zones"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to get zones"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/factoryBuilder/zone/upsertZoneApi.ts b/app/src/services/factoryBuilder/zone/upsertZoneApi.ts index e19eae8..044148c 100644 --- a/app/src/services/factoryBuilder/zone/upsertZoneApi.ts +++ b/app/src/services/factoryBuilder/zone/upsertZoneApi.ts @@ -5,6 +5,7 @@ export const upsertZoneApi = async ( versionId: string, zoneData: Zone ) => { + try { const response = await fetch(`${url_Backend_dwinzo}/api/V1/upsertZone`, { method: "POST", @@ -23,17 +24,12 @@ export const upsertZoneApi = async ( } if (!response.ok) { - console.error("Failed to upsert zone:", response.statusText); + echo.error("Failed to upsert zone"); } const result = await response.json(); return result; - } catch (error) { + } catch { echo.error("Failed to upsert zone"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } } }; diff --git a/app/src/services/simulation/products/UpsertProductOrEventApi.ts b/app/src/services/simulation/products/UpsertProductOrEventApi.ts index 2382762..f5cab65 100644 --- a/app/src/services/simulation/products/UpsertProductOrEventApi.ts +++ b/app/src/services/simulation/products/UpsertProductOrEventApi.ts @@ -1,6 +1,7 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const upsertProductOrEventApi = async (body: any) => { + try { const response = await fetch( `${url_Backend_dwinzo}/api/V1/ProductUpsert`, @@ -21,17 +22,12 @@ export const upsertProductOrEventApi = async (body: any) => { } if (!response.ok) { - console.error("Failed to add product or event"); + echo.error("Failed to add product or event"); } const result = await response.json(); return result; - } catch (error) { - echo.error("Failed to upsert product Or eventApi"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } + } catch { + echo.error("Failed to upsert product or event"); } }; diff --git a/app/src/services/simulation/products/deleteEventDataApi.ts b/app/src/services/simulation/products/deleteEventDataApi.ts index 1faf312..0e5e728 100644 --- a/app/src/services/simulation/products/deleteEventDataApi.ts +++ b/app/src/services/simulation/products/deleteEventDataApi.ts @@ -1,40 +1,35 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const deleteEventDataApi = async (body: any) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/DeleteEvent`, - { - method: "PATCH", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(body), - } - ); - - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } + + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/DeleteEvent`, + { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(body), + } + ); + + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - if (!response.ok) { - console.error("Failed to delete event data"); - } + if (!response.ok) { + echo.error("Failed to delete event data"); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to delete event data API"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + const result = await response.json(); + return result; + } catch { + echo.error("Failed to delete event data"); } - } }; diff --git a/app/src/services/simulation/products/deleteProductApi.ts b/app/src/services/simulation/products/deleteProductApi.ts index 4e6ab1a..20b3447 100644 --- a/app/src/services/simulation/products/deleteProductApi.ts +++ b/app/src/services/simulation/products/deleteProductApi.ts @@ -1,38 +1,33 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const deleteProductApi = async (body: any) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/DeleteProduct`, - { - method: "PATCH", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(body), - } - ); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to delete product data"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/DeleteProduct`, + { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(body), + } + ); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to delete product API"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + if (!response.ok) { + echo.error("Failed to delete product data"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to delete product"); } - } }; diff --git a/app/src/services/simulation/products/getProductApi.ts b/app/src/services/simulation/products/getProductApi.ts index b25c781..c557e33 100644 --- a/app/src/services/simulation/products/getProductApi.ts +++ b/app/src/services/simulation/products/getProductApi.ts @@ -1,40 +1,35 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getProductApi = async ( - productUuid: string, - projectId: string + productUuid: string, + projectId: string ) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/EventsByProduct?productUuid=${productUuid}&projectId=${projectId}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to fetch product data"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/EventsByProduct?productUuid=${productUuid}&projectId=${projectId}`, + { + 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); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get product asset"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + if (!response.ok) { + echo.error("Failed to fetch product data"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to fetch product data"); } - } }; diff --git a/app/src/services/simulation/products/getallProductsApi.ts b/app/src/services/simulation/products/getallProductsApi.ts index 7d4902f..e7e54b0 100644 --- a/app/src/services/simulation/products/getallProductsApi.ts +++ b/app/src/services/simulation/products/getallProductsApi.ts @@ -1,37 +1,32 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const getAllProductsApi = async (projectId: string, versionId: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/ProjectProducts/${projectId}/${versionId}`, - { - 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) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to fetch all products data"); - } + try { + const response = await fetch( + `${url_Backend_dwinzo}/api/V1/ProjectProducts/${projectId}/${versionId}`, + { + 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); + } - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get all product API"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); + if (!response.ok) { + echo.error("Failed to fetch all products data"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to fetch all products data"); } - } }; diff --git a/app/src/services/simulation/products/renameProductApi.ts b/app/src/services/simulation/products/renameProductApi.ts index d43997e..fba1254 100644 --- a/app/src/services/simulation/products/renameProductApi.ts +++ b/app/src/services/simulation/products/renameProductApi.ts @@ -1,43 +1,35 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; export const renameProductApi = async (body: { - productName: string; - productUuid: string; - projectId: string; - versionId: string; + productName: string; + productUuid: string; + projectId: string; + versionId: string; }) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/RenameProduct`, { - method: "PATCH", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify(body), - }); - const newAccessToken = response.headers.get("x-access-token"); - if (newAccessToken) { - //console.log("New token received:", newAccessToken); - localStorage.setItem("token", newAccessToken); - } - if (!response.ok) { - console.error("Failed to rename product"); - echo.error("Failed to rename product"); - } + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V1/RenameProduct`, { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify(body), + }); + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } - const result = await response.json(); - // console.log('result: ', result); - return result; - } catch (error) { - echo.error("Failed to rename product Api"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - echo.log("An unknown error occurred"); + if (!response.ok) { + echo.error("Failed to rename product"); + } + + const result = await response.json(); + return result; + } catch { + echo.error("Failed to rename product"); } - } }; diff --git a/app/src/services/visulization/zone/zoneCameraUpdation.ts b/app/src/services/visulization/zone/zoneCameraUpdation.ts index 9bb3b24..11b5707 100644 --- a/app/src/services/visulization/zone/zoneCameraUpdation.ts +++ b/app/src/services/visulization/zone/zoneCameraUpdation.ts @@ -6,7 +6,7 @@ export const zoneCameraUpdate = async (zoneData: {}, organization: string, proje const response = await fetch(`${url_Backend_dwinzo}/api/V1/upsertZone`, { method: "POST", headers: { - Authorization: "Bearer ", // Replace with actual token + Authorization: "Bearer ", "Content-Type": "application/json", token: localStorage.getItem("token") || "", refresh_token: localStorage.getItem("refreshToken") || "", From 25e4628f757196a8428ba24cd3dafd5f5114a051 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 15:43:01 +0530 Subject: [PATCH 09/17] simulation crane rest bug resolved --- .../actions/storageUnit/actionHandler/useRetrieveHandler.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts b/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts index feef780..7f74744 100644 --- a/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts +++ b/app/src/modules/simulation/actions/storageUnit/actionHandler/useRetrieveHandler.ts @@ -544,8 +544,12 @@ export function useRetrieveHandler() { useEffect(() => { if (isReset || !isPlaying) { setActiveRetrievals(new Map()); + retrievalTimeRef.current.clear(); retrievalCountRef.current.clear(); + monitoredHumansRef.current.clear(); + cranePickupLockRef.current.clear(); setInitialDelayComplete(false); + delayTimerRef.current = null; } }, [isReset, isPlaying]); From 58007a96dcae5ba9239c742b954a882508b7a038 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 2 Sep 2025 18:00:12 +0530 Subject: [PATCH 10/17] pillar jib animation bug fix --- .../instances/animator/pillarJibAnimator.tsx | 209 +++++++++++------- 1 file changed, 131 insertions(+), 78 deletions(-) diff --git a/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx b/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx index cb4d863..a803cad 100644 --- a/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx +++ b/app/src/modules/simulation/crane/instances/animator/pillarJibAnimator.tsx @@ -167,7 +167,7 @@ function PillarJibAnimator({ const trolley = model.getObjectByName('trolley'); const hook = model.getObjectByName('hook'); - if (!base || !trolley || !hook || !trolley.parent) return; + if (!base || !trolley || !hook || !trolley.parent || !hook.parent) return; const baseWorld = new THREE.Vector3(); base.getWorldPosition(baseWorld); @@ -175,18 +175,6 @@ function PillarJibAnimator({ const hookWorld = new THREE.Vector3(); hook.getWorldPosition(hookWorld); - if (!model.userData.animationData) { - model.userData.animationData = { - originalHookY: hook.position.y, - targetHookY: clampedPoints[0].y - baseWorld.y, - targetDirection: new THREE.Vector2(), - targetTrolleyX: 0, - targetWorldPosition: clampedPoints[0].clone(), - finalHookTargetY: 0, - }; - } - - const { animationData } = model.userData; const hookSpeed = (model.userData.hookSpeed || 0.01) * speed; const rotationSpeed = (model.userData.rotationSpeed || 0.005) * speed; const trolleySpeed = (model.userData.trolleySpeed || 0.01) * speed; @@ -197,28 +185,37 @@ function PillarJibAnimator({ case 'init-hook-adjust': { const hookWorld = new THREE.Vector3(); hook.getWorldPosition(hookWorld); + const targetY = clampedPoints[0].y; - const direction = Math.sign(targetY - hookWorld.y); + const diff = targetY - hookWorld.y; - hook.position.y = THREE.MathUtils.lerp( - hook.position.y, - hook.position.y + direction * 0.1, - Math.min(hookSpeed, 0.9) - ); - - if (Math.abs(hookWorld.y - targetY) < threshold) { - hook.position.y = targetY - baseWorld.y; + if (Math.abs(diff) > threshold) { + const step = Math.sign(diff) * hookSpeed; + if (Math.abs(step) > Math.abs(diff)) { + const localTarget = hook.parent.worldToLocal(clampedPoints[0].clone()); + hook.position.y = localTarget.y; + setAnimationPhase('init-rotate-base'); + } else { + hook.position.y += step; + } + } else { + const localTarget = hook.parent.worldToLocal(clampedPoints[0].clone()); + hook.position.y = localTarget.y; setAnimationPhase('init-rotate-base'); } break; } case 'init-rotate-base': { + const baseWorld = new THREE.Vector3(); + base.getWorldPosition(baseWorld); + const baseForward = new THREE.Vector3(1, 0, 0); base.localToWorld(baseForward); baseForward.sub(baseWorld); const currentDir = new THREE.Vector2(baseForward.x, baseForward.z).normalize(); + const targetWorld = clampedPoints[0]; const targetDir = new THREE.Vector2( targetWorld.x - baseWorld.x, @@ -228,79 +225,102 @@ function PillarJibAnimator({ const currentAngle = Math.atan2(currentDir.y, currentDir.x); const targetAngle = Math.atan2(targetDir.y, targetDir.x); let angleDiff = currentAngle - targetAngle; + angleDiff = Math.atan2(Math.sin(angleDiff), Math.cos(angleDiff)); - if (Math.abs(angleDiff) > threshold) { - base.rotation.y = THREE.MathUtils.lerp( - base.rotation.y, - base.rotation.y - angleDiff, - Math.min(rotationSpeed, 0.9) - ); + if (parseFloat(Math.abs(angleDiff).toFixed(2)) > 0.05) { + const step = Math.sign(angleDiff) * rotationSpeed; + + if (Math.abs(step) > Math.abs(angleDiff)) { + base.rotation.y += angleDiff; + setAnimationPhase('init-move-trolley'); + } else { + base.rotation.y += step; + } } else { - base.rotation.y -= angleDiff; - const localTarget = trolley.parent.worldToLocal(clampedPoints[0].clone()); - animationData.targetTrolleyX = localTarget?.x; + base.rotation.y += angleDiff; setAnimationPhase('init-move-trolley'); } break; } case 'init-move-trolley': { - const dx = animationData.targetTrolleyX - trolley.position.x; + const baseWorld = new THREE.Vector3(); + base.getWorldPosition(baseWorld); - trolley.position.x = THREE.MathUtils.lerp( - trolley.position.x, - animationData.targetTrolleyX, - Math.min(trolleySpeed, 0.9) - ); + const targetWorld = clampedPoints[0].clone(); + const localTarget = trolley.parent.worldToLocal(targetWorld.clone()); - if (Math.abs(dx) < threshold) { - trolley.position.x = animationData.targetTrolleyX; - animationData.finalHookTargetY = clampedPoints[0].y - baseWorld.y; + const diff = localTarget.x - trolley.position.x; + + if (Math.abs(diff) > threshold) { + const step = Math.sign(diff) * trolleySpeed; + if (Math.abs(step) > Math.abs(diff)) { + trolley.position.x = localTarget.x; + setAnimationPhase('init-final-hook-adjust'); + } else { + trolley.position.x += step; + } + } else { + trolley.position.x = localTarget.x; setAnimationPhase('init-final-hook-adjust'); } break; } case 'init-final-hook-adjust': { - const targetY = clampedPoints[0].y - baseWorld.y; + const hookWorld = new THREE.Vector3(); + hook.getWorldPosition(hookWorld); - hook.position.y = THREE.MathUtils.lerp( - hook.position.y, - targetY, - Math.min(hookSpeed, 0.9) - ); + const targetY = clampedPoints[0].y; + const diff = targetY - hookWorld.y; - if (Math.abs(hook.position.y - targetY) < threshold) { - hook.position.y = targetY; - - model.userData.animationData = { - originalHookY: hook.position.y, - targetHookY: clampedPoints[1].y - baseWorld.y + 0.5, - targetDirection: new THREE.Vector2(), - targetTrolleyX: 0, - targetWorldPosition: clampedPoints[1].clone(), - finalHookTargetY: 0, - }; - - setAnimationPhase('starting'); - onAnimationComplete('starting'); + if (Math.abs(diff) > threshold) { + const step = Math.sign(diff) * hookSpeed; + if (Math.abs(step) > Math.abs(diff)) { + const localTarget = hook.parent.worldToLocal(clampedPoints[0].clone()); + hook.position.y = localTarget.y; + setAnimationPhase('first-hook-adjust'); + } else { + hook.position.y += step; + } + } else { + const localTarget = hook.parent.worldToLocal(clampedPoints[0].clone()); + hook.position.y = localTarget.y; + setAnimationPhase('first-hook-adjust'); } break; } case 'first-hook-adjust': { - const direction = Math.sign(animationData.targetHookY - hook.position.y); - hook.position.y += direction * hookSpeed; + const hookWorld = new THREE.Vector3(); + hook.getWorldPosition(hookWorld); - if (parseFloat(Math.abs(hook.position.y - animationData.targetHookY).toFixed(2)) < 0.05) { - hook.position.y = animationData.targetHookY; + const targetWorld = clampedPoints[1].clone().add(new THREE.Vector3(0, 0.5, 0)); + const targetY = targetWorld.y; + const diff = targetY - hookWorld.y; + + if (Math.abs(diff) > threshold) { + const step = Math.sign(diff) * hookSpeed; + if (Math.abs(step) > Math.abs(diff)) { + const localTarget = hook.parent.worldToLocal(targetWorld.clone()); + hook.position.y = localTarget.y; + setAnimationPhase('first-rotate-base'); + } else { + hook.position.y += step; + } + } else { + const localTarget = hook.parent.worldToLocal(targetWorld.clone()); + hook.position.y = localTarget.y; setAnimationPhase('first-rotate-base'); } break; } case 'first-rotate-base': { + const baseWorld = new THREE.Vector3(); + base.getWorldPosition(baseWorld); + const baseForward = new THREE.Vector3(1, 0, 0); base.localToWorld(baseForward); baseForward.sub(baseWorld); @@ -320,37 +340,70 @@ function PillarJibAnimator({ angleDiff = Math.atan2(Math.sin(angleDiff), Math.cos(angleDiff)); if (parseFloat(Math.abs(angleDiff).toFixed(2)) > 0.05) { - base.rotation.y += Math.sign(angleDiff) * rotationSpeed; + const step = Math.sign(angleDiff) * rotationSpeed; + + if (Math.abs(step) > Math.abs(angleDiff)) { + base.rotation.y += angleDiff; + setAnimationPhase('first-move-trolley'); + } else { + base.rotation.y += step; + } } else { base.rotation.y += angleDiff; - const localTarget = trolley.parent.worldToLocal(clampedPoints[1].clone()); - animationData.targetTrolleyX = localTarget?.x; setAnimationPhase('first-move-trolley'); } break; } case 'first-move-trolley': { - const dx = animationData.targetTrolleyX - trolley.position.x; - const direction = Math.sign(dx); - trolley.position.x += direction * trolleySpeed; + const baseWorld = new THREE.Vector3(); + base.getWorldPosition(baseWorld); - if (parseFloat(Math.abs(dx).toFixed(2)) < 0.05) { - trolley.position.x = animationData.targetTrolleyX; + const targetWorld = clampedPoints[1].clone(); + const localTarget = trolley.parent.worldToLocal(targetWorld.clone()); - animationData.finalHookTargetY = hook.position.y - 0.5; + const diff = localTarget.x - trolley.position.x; + + if (Math.abs(diff) > threshold) { + const step = Math.sign(diff) * trolleySpeed; + if (Math.abs(step) > Math.abs(diff)) { + trolley.position.x = localTarget.x; + setAnimationPhase('first-final-hook-adjust'); + } else { + trolley.position.x += step; + } + } else { + trolley.position.x = localTarget.x; setAnimationPhase('first-final-hook-adjust'); } break; } case 'first-final-hook-adjust': { - const dy = animationData.finalHookTargetY - hook.position.y; - const direction = Math.sign(dy); - hook.position.y += direction * hookSpeed; + const hookWorld = new THREE.Vector3(); + hook.getWorldPosition(hookWorld); - if (parseFloat(Math.abs(dy).toFixed(2)) < 0.05) { - hook.position.y = animationData.finalHookTargetY; + const targetY = clampedPoints[1].y; + const diff = targetY - hookWorld.y; + + if (Math.abs(diff) > threshold) { + const step = Math.sign(diff) * hookSpeed; + if (Math.abs(step) > Math.abs(diff)) { + const localTarget = hook.parent.worldToLocal(clampedPoints[1].clone()); + hook.position.y = localTarget.y; + if (crane.currentPhase === 'init-pickup') { + setAnimationPhase('picking'); + onAnimationComplete('picking'); + } else if (crane.currentPhase === 'pickup-drop') { + setAnimationPhase('dropping'); + onAnimationComplete('dropping'); + } + } else { + hook.position.y += step; + } + } else { + const localTarget = hook.parent.worldToLocal(clampedPoints[1].clone()); + hook.position.y = localTarget.y; if (crane.currentPhase === 'init-pickup') { setAnimationPhase('picking'); onAnimationComplete('picking'); From dac81894c09a6435e23ee5404fe6a55a35050c0e Mon Sep 17 00:00:00 2001 From: Vishnu Date: Wed, 3 Sep 2025 16:42:40 +0530 Subject: [PATCH 11/17] Refactor Dashboard components and styles; update icon colors - Updated icon stroke and fill colors from `var(--text-button-color)` to `var(--text-color)` for consistency. - Refactored `Dashboard` component to utilize a new `DashboardMain` component for better structure. - Enhanced `DashboardMain` to manage project data fetching and rendering based on active folder and subfolder. - Implemented socket handling for project actions (add, delete, update, duplicate) in `ProjectSocketRes`. - Improved styles in `_dashboard.scss` for buttons and project cards, including hover effects and layout adjustments. --- .../components/Dashboard/DashboardCard.tsx | 334 +++++++++--------- .../components/Dashboard/DashboardHome.tsx | 166 --------- .../components/Dashboard/DashboardMain.tsx | 272 ++++++++++++++ .../components/Dashboard/DashboardNavBar.tsx | 32 +- .../Dashboard/DashboardProjects.tsx | 228 ------------ .../components/Dashboard/DashboardTrash.tsx | 157 -------- .../Dashboard/DashboardTutorial.tsx | 8 + .../Dashboard/MarketPlaceBanner.tsx | 1 - app/src/components/Dashboard/SidePannel.tsx | 56 ++- .../Dashboard/socket/projectSocketRes.dev.tsx | 101 ------ .../Dashboard/socket/projectSocketRes.tsx | 90 +++++ app/src/components/footer/Footer.tsx | 94 +++-- app/src/components/icons/DashboardIcon.tsx | 82 ++--- app/src/pages/Dashboard.tsx | 46 +-- app/src/styles/pages/_dashboard.scss | 69 +++- 15 files changed, 743 insertions(+), 993 deletions(-) delete mode 100644 app/src/components/Dashboard/DashboardHome.tsx create mode 100644 app/src/components/Dashboard/DashboardMain.tsx delete mode 100644 app/src/components/Dashboard/DashboardProjects.tsx delete mode 100644 app/src/components/Dashboard/DashboardTrash.tsx delete mode 100644 app/src/components/Dashboard/socket/projectSocketRes.dev.tsx create mode 100644 app/src/components/Dashboard/socket/projectSocketRes.tsx diff --git a/app/src/components/Dashboard/DashboardCard.tsx b/app/src/components/Dashboard/DashboardCard.tsx index 7dfb283..c15765e 100644 --- a/app/src/components/Dashboard/DashboardCard.tsx +++ b/app/src/components/Dashboard/DashboardCard.tsx @@ -1,7 +1,7 @@ -import React, { useState, useRef } from "react"; +import React, { useState, useRef, useCallback, useEffect } from "react"; import { createPortal } from "react-dom"; -import img from "../../assets/image/image.png"; import { useNavigate } from "react-router-dom"; +import img from "../../assets/image/image.png"; import { getUserData } from "../../functions/getUserData"; import { useLoadingProgress, @@ -16,7 +16,7 @@ import { getAllProjects } from "../../services/dashboard/getAllProjects"; interface DashBoardCardProps { projectName: string; - thumbnail: any; + thumbnail: string; projectId: string; createdAt?: string; isViewed?: string; @@ -35,13 +35,29 @@ interface DashBoardCardProps { projectName: string, thumbnail: string ) => Promise; - active?: string; + active?: "shared" | "trash" | "recent" | string; setIsSearchActive?: React.Dispatch>; - setRecentDuplicateData?: React.Dispatch>; - setProjectDuplicateData?: React.Dispatch>; + setRecentDuplicateData?: React.Dispatch>; + setProjectDuplicateData?: React.Dispatch>; setActiveFolder?: React.Dispatch>; + openKebabProjectId: string | null; + setOpenKebabProjectId: React.Dispatch>; } -type RelativeTimeFormatUnit = any; + +type RelativeTimeFormatUnit = + | "year" + | "month" + | "week" + | "day" + | "hour" + | "minute" + | "second"; + +const kebabOptionsMap: Record = { + default: ["rename", "delete", "duplicate", "open in new tab"], + trash: ["restore", "delete"], + shared: ["duplicate", "open in new tab"], +}; const DashboardCard: React.FC = ({ projectName, @@ -58,131 +74,143 @@ const DashboardCard: React.FC = ({ setRecentDuplicateData, setProjectDuplicateData, setActiveFolder, + openKebabProjectId, + setOpenKebabProjectId, }) => { const navigate = useNavigate(); const { setProjectName } = useProjectName(); const { userId, organization, userName } = getUserData(); - const [isKebabOpen, setIsKebabOpen] = useState(false); - const [renameValue, setRenameValue] = useState(projectName); - const [isRenaming, setIsRenaming] = useState(false); const { projectSocket } = useSocketStore(); const { setLoadingProgress } = useLoadingProgress(); + + const isKebabOpen = openKebabProjectId === projectId; + const [renameValue, setRenameValue] = useState(projectName); + const [isRenaming, setIsRenaming] = useState(false); const kebabRef = useRef(null); - const navigateToProject = async (e: any) => { - if (active && active === "trash") return; - try { - // const viewProjects = await viewProject(organization, projectId, userId); + // Close kebab when clicking outside + OuterClick({ + contextClassName: [`tag-${projectId}`], + setMenuVisible: () => { + if (isKebabOpen) setOpenKebabProjectId(null); + }, + }); - setLoadingProgress(1); - setProjectName(projectName); - navigate(`/projects/${projectId}`); - } catch {} - }; + const navigateToProject = useCallback(() => { + if (active === "trash") return; + setLoadingProgress(1); + setProjectName(projectName); + navigate(`/projects/${projectId}`); + }, [ + active, + projectId, + projectName, + navigate, + setLoadingProgress, + setProjectName, + ]); - const handleOptionClick = async (option: string) => { - switch (option) { - case "delete": - if (handleDeleteProject) { - handleDeleteProject(projectId); - } else if (handleTrashDeleteProject) { - handleTrashDeleteProject(projectId); + const getOptions = useCallback(() => { + if (active === "trash") return kebabOptionsMap.trash; + if (active === "shared" || (createdBy && createdBy._id !== userId)) { + return kebabOptionsMap.shared; + } + return kebabOptionsMap.default; + }, [active, createdBy, userId]); + + const handleProjectName = useCallback( + async (newName: string) => { + setRenameValue(newName); + if (!projectId) return; + + try { + const projects = await getAllProjects(userId, organization); + const projectUuid = projects?.Projects?.find( + (val: any) => val.projectUuid === projectId || val._id === projectId + ); + if (!projectUuid) return; + + const updatePayload = { + projectId: projectUuid._id, + organization, + userId, + projectName: newName, + }; + + if (projectSocket) { + projectSocket.emit("v1:project:update", updatePayload); } - break; - case "restore": - if (handleRestoreProject) { - await handleRestoreProject(projectId); - } - break; - case "open in new tab": - try { - if (active === "shared" && createdBy) { - // const newTab = await viewProject( - // organization, - // projectId, - // createdBy?._id - // ); - } else { - // const newTab = await viewProject(organization, projectId, userId); + } catch { + // silent fail + } + }, + [projectId, userId, organization, projectSocket] + ); - setProjectName(projectName); - setIsKebabOpen(false); - } - } catch (error) {} - window.open(`/projects/${projectId}`, "_blank"); - break; - case "rename": - setIsRenaming(true); - break; - case "duplicate": - if (handleDuplicateWorkspaceProject) { - setProjectDuplicateData && - setProjectDuplicateData({ + const handleOptionClick = useCallback( + async (option: string) => { + switch (option) { + case "delete": + await (handleDeleteProject?.(projectId) ?? + handleTrashDeleteProject?.(projectId)); + break; + case "restore": + await handleRestoreProject?.(projectId); + break; + case "open in new tab": + setProjectName(projectName); + window.open(`/projects/${projectId}`, "_blank"); + break; + case "rename": + setIsRenaming(true); + break; + case "duplicate": + if (handleDuplicateWorkspaceProject) { + setProjectDuplicateData?.({ projectId, projectName, thumbnail }); + await handleDuplicateWorkspaceProject( projectId, projectName, thumbnail, - }); - await handleDuplicateWorkspaceProject( - projectId, - projectName, - thumbnail, - userId - ); - if (active === "shared" && setActiveFolder) { - setActiveFolder("myProjects"); - } - } else if (handleDuplicateRecentProject) { - setRecentDuplicateData && - setRecentDuplicateData({ + userId + ); + if (active === "shared") { + setActiveFolder?.("myProjects"); + } + } else if (handleDuplicateRecentProject) { + setRecentDuplicateData?.({ projectId, projectName, thumbnail, userId, }); - await handleDuplicateRecentProject(projectId, projectName, thumbnail); - } - break; - default: - break; - } - setIsKebabOpen(false); - }; - - OuterClick({ - contextClassName: ["kebab-wrapper", "kebab-options-wrapper"], - setMenuVisible: () => setIsKebabOpen(false), - }); - - const handleProjectName = async (projectName: string) => { - setRenameValue(projectName); - if (!projectId) return; - try { - const projects = await getAllProjects(userId, organization); - if (!projects || !projects.Projects) return; - let projectUuid = projects.Projects.find( - (val: any) => val.projectUuid === projectId || val._id === projectId - ); - const updateProjects = { - projectId: projectUuid?._id, - organization, - userId, - projectName, - thumbnail: undefined, - }; - // const updatedProjectName = await updateProject( - // projectUuid._id, - // userId, - // organization, - // undefined, - // projectName - // ); - if (projectSocket) { - projectSocket.emit("v1:project:update", updateProjects); + await handleDuplicateRecentProject( + projectId, + projectName, + thumbnail + ); + } + break; } - } catch (error) {} - }; + }, + [ + projectId, + projectName, + thumbnail, + userId, + active, + handleDeleteProject, + handleTrashDeleteProject, + handleRestoreProject, + handleDuplicateWorkspaceProject, + handleDuplicateRecentProject, + setProjectName, + setProjectDuplicateData, + setRecentDuplicateData, + setActiveFolder, + ] + ); - function getRelativeTime(dateString: string): string { + const getRelativeTime = useCallback((dateString: string): string => { const date = new Date(dateString); const now = new Date(); const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); @@ -198,69 +226,56 @@ const DashboardCard: React.FC = ({ }; const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" }); - - for (const key in intervals) { - const unit = key as RelativeTimeFormatUnit; - const diff = Math.floor(diffInSeconds / intervals[unit]); - if (diff >= 1) { - return rtf.format(-diff, unit); - } + for (const [unit, seconds] of Object.entries(intervals)) { + const diff = Math.floor(diffInSeconds / seconds); + if (diff >= 1) return rtf.format(-diff, unit as RelativeTimeFormatUnit); } return "just now"; - } + }, []); - const kebabOptionsMap: Record = { - default: ["rename", "delete", "duplicate", "open in new tab"], - trash: ["restore", "delete"], - shared: ["duplicate", "open in new tab"], - }; + const [kebabPosition, setKebabPosition] = useState({ top: 0, left: 0 }); - const getOptions = () => { - if (active === "trash") return kebabOptionsMap.trash; - if (active === "shared") return kebabOptionsMap.shared; - if (createdBy && createdBy?._id !== userId) return kebabOptionsMap.shared; - return kebabOptionsMap.default; - }; + useEffect(() => { + if (isKebabOpen && kebabRef.current) { + const rect = kebabRef.current.getBoundingClientRect(); + setKebabPosition({ + top: rect.bottom + window.scrollY, + left: rect.left + window.scrollX - 80, + }); + } + }, [isKebabOpen]); return ( -
+ {isKebabOpen && createPortal(
{getOptions().map((option) => (
, document.body )} - +
); }; diff --git a/app/src/components/Dashboard/DashboardHome.tsx b/app/src/components/Dashboard/DashboardHome.tsx deleted file mode 100644 index 96761f8..0000000 --- a/app/src/components/Dashboard/DashboardHome.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import React, { useEffect, useState } from "react"; -import DashboardCard from "./DashboardCard"; -import DashboardNavBar from "./DashboardNavBar"; -import MarketPlaceBanner from "./MarketPlaceBanner"; -import { getUserData } from "../../functions/getUserData"; -import { useSocketStore } from "../../store/builder/store"; -import { recentlyViewed } from "../../services/dashboard/recentlyViewed"; -import { searchProject } from "../../services/dashboard/searchProjects"; -import { deleteProject } from "../../services/dashboard/deleteProject"; -import ProjectSocketRes from "./socket/projectSocketRes.dev"; -import { generateUniqueId } from "../../functions/generateUniqueId"; - -interface Project { - _id: string; - projectName: string; - thumbnail: string; - createdBy: { _id: string; userName: string }; - projectUuid?: string; - createdAt: string; - isViewed?: string; -} - -interface RecentProjectsData { - [key: string]: Project[]; -} - -const DashboardHome: React.FC = () => { - const [recentProjects, setRecentProjects] = useState({}); - - const [isSearchActive, setIsSearchActive] = useState(false); - const { userId, organization } = getUserData(); - const { projectSocket } = useSocketStore(); - const [recentDuplicateData, setRecentDuplicateData] = useState({}); - - const fetchRecentProjects = async () => { - try { - const projects = await recentlyViewed(organization, userId); - - if (JSON.stringify(projects) !== JSON.stringify(recentProjects)) { - setRecentProjects(projects); - } - } catch (error) { } - }; - - const handleRecentProjectSearch = async (inputValue: string) => { - if (!inputValue.trim()) { - setIsSearchActive(false); - return; - } - const filterRecentProcess = await searchProject( - organization, - userId, - inputValue - ); - setIsSearchActive(true); - setRecentProjects(filterRecentProcess.message ? {} : filterRecentProcess); - }; - - const handleDeleteProject = async (projectId: any) => { - try { - //API for delete project - // const deletedProject = await deleteProject( - // projectId, - // userId, - // organization - // ); - // - - // SOCKET for delete Project - const deleteProject = { - projectId, - organization, - userId, - }; - - if (projectSocket) { - projectSocket.emit("v1:project:delete", deleteProject); - } - - setRecentProjects((prevDiscardedProjects: RecentProjectsData) => { - if (!Array.isArray(prevDiscardedProjects?.RecentlyViewed)) { - return prevDiscardedProjects; - } - const updatedProjectDatas = prevDiscardedProjects.RecentlyViewed.filter( - (project) => project._id !== projectId - ); - return { - ...prevDiscardedProjects, - RecentlyViewed: updatedProjectDatas, - }; - }); - setIsSearchActive(false); - } catch (error) { } - }; - - const handleDuplicateRecentProject = async ( - projectId: string, - projectName: string, - thumbnail: string - ) => { - if (projectSocket) { - - const duplicateRecentProjectData = { - userId, - thumbnail, - organization, - projectUuid: generateUniqueId(), - refProjectID: projectId, - projectName, - }; - projectSocket.emit("v1:project:Duplicate", duplicateRecentProjectData); - } - }; - - const renderProjects = () => { - const projectList = recentProjects[Object.keys(recentProjects)[0]]; - - if (!projectList?.length) { - return
No recent projects found
; - } - - return ( - projectList.map((project) => ( - - )) - ); - }; - - useEffect(() => { - if (!isSearchActive) { - fetchRecentProjects(); - } - }, [isSearchActive]); - - return ( -
- - -
-

Recents

-
{renderProjects()}
-
- {recentDuplicateData && Object.keys(recentDuplicateData).length > 0 && ( - - )} -
- ); -}; - -export default DashboardHome; diff --git a/app/src/components/Dashboard/DashboardMain.tsx b/app/src/components/Dashboard/DashboardMain.tsx new file mode 100644 index 0000000..c8f6ea7 --- /dev/null +++ b/app/src/components/Dashboard/DashboardMain.tsx @@ -0,0 +1,272 @@ +import React, { useEffect, useState } from "react"; +import DashboardNavBar from "./DashboardNavBar"; +import DashboardCard from "./DashboardCard"; +import MarketPlaceBanner from "./MarketPlaceBanner"; +import { getUserData } from "../../functions/getUserData"; +import { useSocketStore } from "../../store/builder/store"; +import { getAllProjects } from "../../services/dashboard/getAllProjects"; +import { sharedWithMeProjects } from "../../services/dashboard/sharedWithMeProject"; +import { recentlyViewed } from "../../services/dashboard/recentlyViewed"; +import { getTrash } from "../../services/dashboard/getTrash"; +import { searchProject } from "../../services/dashboard/searchProjects"; +import { trashSearchProject } from "../../services/dashboard/trashSearchProject"; +import { restoreTrash } from "../../services/dashboard/restoreTrash"; +import { generateUniqueId } from "../../functions/generateUniqueId"; +import ProjectSocketRes from "./socket/projectSocketRes"; + +interface Project { + _id: string; + projectName: string; + thumbnail: string; + createdBy: { _id: string; userName: string }; + projectUuid?: string; + createdAt?: string; + DeletedAt?: string; +} + +interface ProjectCollection { + [key: string]: Project[]; +} + +type Folder = "home" | "projects" | "shared" | "trash"; + +interface DashboardMainProps { + activeFolder: Folder; +} + +const DashboardMain: React.FC = ({ activeFolder }) => { + const [activeSubFolder, setActiveSubFolder] = useState("myProjects"); + const [projectsData, setProjectsData] = useState({}); + const [isSearchActive, setIsSearchActive] = useState(false); + const [duplicateData, setDuplicateData] = useState({}); + const [openKebabProjectId, setOpenKebabProjectId] = useState( + null + ); + const [projectsCache, setProjectsCache] = useState<{ + [key: string]: ProjectCollection; + }>({}); + + const { userId, organization } = getUserData(); + const { projectSocket } = useSocketStore(); + + // #region API Fetchers + const fetchData = async () => { + const cacheKey = + activeFolder + (activeFolder === "projects" ? `-${activeSubFolder}` : ""); + + if (projectsCache[cacheKey] && !isSearchActive) { + setProjectsData(projectsCache[cacheKey]); + return; + } + + try { + let projects: ProjectCollection = {}; // initialize as empty object + + switch (activeFolder) { + case "home": + projects = await recentlyViewed(organization, userId); + break; + case "projects": + if (activeSubFolder === "myProjects") { + projects = await getAllProjects(userId, organization); + } else { + projects = await sharedWithMeProjects(); + } + break; + case "trash": + projects = await getTrash(organization); + break; + } + + // Only update cache if projects is not empty + if ( + projects && + JSON.stringify(projects) !== JSON.stringify(projectsData) + ) { + setProjectsCache((prev) => ({ ...prev, [cacheKey]: projects })); + setProjectsData(projects); + } + } catch (error) { + console.error(error); + } + }; + + // #region Search Handlers + const handleSearch = async (inputValue: string) => { + if (!inputValue.trim()) { + setIsSearchActive(false); + return; + } + + let results; + if (activeFolder === "trash") { + results = await trashSearchProject(organization, userId, inputValue); + } else { + results = await searchProject(organization, userId, inputValue); + } + + setIsSearchActive(true); + setProjectsData(results?.message ? {} : results); + }; + + // #region Socket Actions + const handleDelete = async (projectId: string): Promise => { + if (projectSocket) { + projectSocket.emit("v1:project:delete", { + projectId, + organization, + userId, + }); + } + updateStateAfterRemove(projectId); + }; + + const handlePermanentDelete = async (projectId: string): Promise => { + if (projectSocket) { + projectSocket.emit("v1:trash:delete", { + projectId, + organization, + userId, + }); + } + updateStateAfterRemove(projectId); + }; + + const handleRestore = async (projectId: string): Promise => { + await restoreTrash(organization, projectId); + updateStateAfterRemove(projectId); + }; + + const handleDuplicate = async ( + projectId: string, + projectName: string, + thumbnail: string + ): Promise => { + if (projectSocket) { + projectSocket.emit("v1:project:Duplicate", { + userId, + thumbnail, + organization, + projectUuid: generateUniqueId(), + refProjectID: projectId, + projectName, + }); + } + }; + + // #region Project Map + const updateStateAfterRemove = (projectId: string) => { + setProjectsData((prev: ProjectCollection) => { + const key = Object.keys(prev)[0]; + const updatedList = prev[key]?.filter((p) => p._id !== projectId) || []; + return { ...prev, [key]: updatedList }; + }); + setIsSearchActive(false); + }; + + const renderProjects = () => { + const key = Object.keys(projectsData)[0]; + const projectList = projectsData[key]; + + if (!projectList?.length) { + return
No projects found
; + } + + return projectList.map((project) => ( + + )); + }; + + // #region Use Effects + useEffect(() => { + if (!isSearchActive) fetchData(); + // eslint-disable-next-line + }, [activeFolder, isSearchActive, activeSubFolder]); + + return ( +
+ + + {activeFolder === "home" && } + +
+ {activeFolder === "projects" && ( +
+ + +
+ )} + +
{renderProjects()}
+ + {duplicateData && Object.keys(duplicateData).length > 0 && ( + + )} +
+
+ ); +}; + +export default DashboardMain; diff --git a/app/src/components/Dashboard/DashboardNavBar.tsx b/app/src/components/Dashboard/DashboardNavBar.tsx index c86ef69..7ebec4d 100644 --- a/app/src/components/Dashboard/DashboardNavBar.tsx +++ b/app/src/components/Dashboard/DashboardNavBar.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useCallback, useMemo } from "react"; import Search from "../ui/inputs/Search"; import { CartIcon } from "../icons/ExportModuleIcons"; @@ -15,19 +15,23 @@ const DashboardNavBar: React.FC = ({ handleTrashSearch, handleRecentProjectSearch, }) => { - const handleSearch = async (inputValue: string) => { - try { - if (handleProjectsSearch) { - await handleProjectsSearch(inputValue); - } else if (handleTrashSearch) { - await handleTrashSearch(inputValue); - } else if (handleRecentProjectSearch) { - await handleRecentProjectSearch(inputValue); + // Determine active search handler + const activeSearchHandler = useMemo( + () => handleProjectsSearch || handleTrashSearch || handleRecentProjectSearch, + [handleProjectsSearch, handleTrashSearch, handleRecentProjectSearch] + ); + + const handleSearch = useCallback( + async (inputValue: string) => { + if (!activeSearchHandler) return; + try { + await activeSearchHandler(inputValue); + } catch (error) { + console.error("Search failed:", error); } - } catch (error) { - console.error("Search failed:", error); - } - }; + }, + [activeSearchHandler] + ); return (
@@ -40,4 +44,4 @@ const DashboardNavBar: React.FC = ({ ); }; -export default DashboardNavBar; \ No newline at end of file +export default DashboardNavBar; diff --git a/app/src/components/Dashboard/DashboardProjects.tsx b/app/src/components/Dashboard/DashboardProjects.tsx deleted file mode 100644 index 536dd24..0000000 --- a/app/src/components/Dashboard/DashboardProjects.tsx +++ /dev/null @@ -1,228 +0,0 @@ -import React, { useEffect, useState } from "react"; -import DashboardNavBar from "./DashboardNavBar"; -import DashboardCard from "./DashboardCard"; -import { getUserData } from "../../functions/getUserData"; -import { useSocketStore } from "../../store/builder/store"; -import { getAllProjects } from "../../services/dashboard/getAllProjects"; -import { searchProject } from "../../services/dashboard/searchProjects"; -import { deleteProject } from "../../services/dashboard/deleteProject"; -import ProjectSocketRes from "./socket/projectSocketRes.dev"; -import { sharedWithMeProjects } from "../../services/dashboard/sharedWithMeProject"; -import { duplicateProject } from "../../services/dashboard/duplicateProject"; -import { generateUniqueId } from "../../functions/generateUniqueId"; - -interface Project { - _id: string; - projectName: string; - thumbnail: string; - createdBy: string; - projectUuid?: string; - createdAt: string; -} - -interface WorkspaceProjects { - [key: string]: Project[]; -} - -const DashboardProjects: React.FC = () => { - const [workspaceProjects, setWorkspaceProjects] = useState( - {} - ); - const [sharedwithMeProject, setSharedWithMeProjects] = useState([]); - const [projectDuplicateData, setProjectDuplicateData] = useState({}); - const [isSearchActive, setIsSearchActive] = useState(false); - const [activeFolder, setActiveFolder] = useState("myProjects"); - const { projectSocket } = useSocketStore(); - const { userId, organization } = getUserData(); - - const handleProjectsSearch = async (inputValue: string) => { - if (!inputValue.trim()) { - setIsSearchActive(false); - return; - } - if (!setWorkspaceProjects || !setIsSearchActive) return; - - const searchedProject = await searchProject( - organization, - userId, - inputValue - ); - setIsSearchActive(true); - setWorkspaceProjects(searchedProject.message ? {} : searchedProject); - }; - - const fetchAllProjects = async () => { - try { - const projects = await getAllProjects(userId, organization); - - if (!projects || !projects.Projects) return; - - if (JSON.stringify(projects) !== JSON.stringify(workspaceProjects)) { - setWorkspaceProjects(projects); - } - } catch (error) { } - }; - - const handleDeleteProject = async (projectId: any) => { - try { - // const deletedProject = await deleteProject( - // projectId, - // userId, - // organization - // ); - // - const deleteProjects = { - projectId, - organization, - userId, - }; - - // SOCKET for deleting the project - if (projectSocket) { - projectSocket.emit("v1:project:delete", deleteProjects); - } else { - } - setWorkspaceProjects((prevDiscardedProjects: WorkspaceProjects) => { - if (!Array.isArray(prevDiscardedProjects?.Projects)) { - return prevDiscardedProjects; - } - const updatedProjectDatas = prevDiscardedProjects.Projects.filter( - (project) => project._id !== projectId - ); - return { - ...prevDiscardedProjects, - Projects: updatedProjectDatas, - }; - }); - setIsSearchActive(false); - } catch (error) { } - }; - - const handleDuplicateWorkspaceProject = async ( - projectId: string, - projectName: string, - thumbnail: string - ) => { - // const duplicatedProject = await duplicateProject( - // projectId, - // generateUniqueId(), - // thumbnail, - // projectName - // ); - // console.log("duplicatedProject: ", duplicatedProject); - if (projectSocket) { - const duplicateProjectData = { - userId, - thumbnail, - organization, - projectUuid: generateUniqueId(), - refProjectID: projectId, - projectName, - }; - projectSocket.emit("v1:project:Duplicate", duplicateProjectData); - } - }; - - const renderProjects = () => { - if (activeFolder !== "myProjects") return null; - const projectList = workspaceProjects[Object.keys(workspaceProjects)[0]]; - if (!projectList?.length) { - return
No projects found
; - } - - return projectList.map((project) => ( - - )); - }; - - const renderSharedProjects = () => { - return sharedwithMeProject?.map((project: any) => ( - - )); - }; - - const sharedProject = async () => { - try { - const sharedWithMe = await sharedWithMeProjects(); - setSharedWithMeProjects(sharedWithMe); - } catch { } - }; - - useEffect(() => { - if (!isSearchActive) { - fetchAllProjects(); - } - }, [isSearchActive]); - - useEffect(() => { - if (activeFolder === "shared") { - sharedProject(); - } - }, [activeFolder]); - - return ( -
- - -
-
- - -
-
- {activeFolder == "myProjects" - ? renderProjects() - : renderSharedProjects()} -
- - {projectDuplicateData && - Object.keys(projectDuplicateData).length > 0 && ( - - )} -
-
- ); -}; - -export default DashboardProjects; diff --git a/app/src/components/Dashboard/DashboardTrash.tsx b/app/src/components/Dashboard/DashboardTrash.tsx deleted file mode 100644 index 8bac359..0000000 --- a/app/src/components/Dashboard/DashboardTrash.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import React, { useEffect, useState } from "react"; -import DashboardCard from "./DashboardCard"; -import DashboardNavBar from "./DashboardNavBar"; -import { getUserData } from "../../functions/getUserData"; -import { trashSearchProject } from "../../services/dashboard/trashSearchProject"; -import { restoreTrash } from "../../services/dashboard/restoreTrash"; -import { getTrash } from "../../services/dashboard/getTrash"; -import { deleteTrash } from "../../services/dashboard/deleteTrash"; -import { useSocketStore } from "../../store/builder/store"; - -interface Project { - _id: string; - projectName: string; - thumbnail: string; - createdBy: string; - projectUuid?: string; - DeletedAt: string; -} - -interface DiscardedProjects { - [key: string]: Project[]; -} - -const DashboardTrash: React.FC = () => { - const [discardedProjects, setDiscardedProjects] = useState({}); - const [isSearchActive, setIsSearchActive] = useState(false); - const { userId, organization } = getUserData(); - const { projectSocket } = useSocketStore(); - - const fetchTrashProjects = async () => { - try { - const projects = await getTrash(organization); - - if (JSON.stringify(projects) !== JSON.stringify(discardedProjects)) { - setDiscardedProjects(projects); - } - } catch (error) { - console.error("Error fetching trash projects:", error); - } - }; - - const handleTrashSearch = async (inputValue: string) => { - if (!inputValue.trim()) { - setIsSearchActive(false); - return; - } - if (!setDiscardedProjects || !setIsSearchActive) return; - - const filterTrashedProcess = await trashSearchProject( - organization, - userId, - inputValue - ); - setIsSearchActive(true); - setDiscardedProjects( - filterTrashedProcess.message ? {} : filterTrashedProcess - ); - }; - - const handleRestoreProject = async (projectId: any) => { - try { - const restoreProject = await restoreTrash(organization, projectId); - // console.log('restoreProject: ', restoreProject); - - setDiscardedProjects((prevDiscardedProjects: DiscardedProjects) => { - // Check if TrashDatas exists and is an array - if (!Array.isArray(prevDiscardedProjects?.TrashDatas)) { - console.error("TrashDatas is not an array", prevDiscardedProjects); - return prevDiscardedProjects; - } - const updatedTrashDatas = prevDiscardedProjects.TrashDatas.filter( - (project) => project._id !== projectId - ); - return { - ...prevDiscardedProjects, - TrashDatas: updatedTrashDatas, - }; - }); - setIsSearchActive(false); - } catch (error) { - console.error("Error deleting project:", error); - } - }; - - const handleTrashDeleteProject = async (projectId: any) => { - try { - // const deletedProject = await deleteTrash( - // organization, projectId - // ); - - const deleteProjectTrash = { - projectId, - organization, - userId, - }; - if (projectSocket) { - projectSocket.emit("v1:trash:delete", deleteProjectTrash); - } - setDiscardedProjects((prevDiscardedProjects: DiscardedProjects) => { - if (!Array.isArray(prevDiscardedProjects?.TrashDatas)) { - return prevDiscardedProjects; - } - const updatedProjectDatas = prevDiscardedProjects.TrashDatas.filter( - (project) => project._id !== projectId - ); - // console.log('updatedProjectDatas: ', updatedProjectDatas); - return { - ...prevDiscardedProjects, - TrashDatas: updatedProjectDatas, - }; - }); - setIsSearchActive(false); - } catch (error) { - console.error("Error deleting project:", error); - } - }; - - const renderTrashProjects = () => { - const projectList = discardedProjects[Object.keys(discardedProjects)[0]]; - - if (!projectList?.length) { - return
No deleted projects found
; - } - - return projectList.map((project) => ( - - )); - }; - - useEffect(() => { - if (!isSearchActive) { - fetchTrashProjects(); - } - }, [isSearchActive]); - - return ( -
- - -
-
-
{renderTrashProjects()}
-
-
- ); -}; - -export default DashboardTrash; \ No newline at end of file diff --git a/app/src/components/Dashboard/DashboardTutorial.tsx b/app/src/components/Dashboard/DashboardTutorial.tsx index dedcccf..5003793 100644 --- a/app/src/components/Dashboard/DashboardTutorial.tsx +++ b/app/src/components/Dashboard/DashboardTutorial.tsx @@ -24,6 +24,12 @@ const DashboardTutorial = () => { } } + + + const [openKebabProjectId, setOpenKebabProjectId] = useState( + null + ); + useEffect(() => { handleIcon() }, []) @@ -40,6 +46,8 @@ const DashboardTutorial = () => { projectName={tutorials.projectName} thumbnail={tutorials.thumbnail} projectId={tutorials._id} + openKebabProjectId={openKebabProjectId} + setOpenKebabProjectId={setOpenKebabProjectId} /> )); }; diff --git a/app/src/components/Dashboard/MarketPlaceBanner.tsx b/app/src/components/Dashboard/MarketPlaceBanner.tsx index 68b631a..7480538 100644 --- a/app/src/components/Dashboard/MarketPlaceBanner.tsx +++ b/app/src/components/Dashboard/MarketPlaceBanner.tsx @@ -1,4 +1,3 @@ -import React from "react"; import banner from "../../assets/image/banner.png"; const MarketPlaceBanner = () => { diff --git a/app/src/components/Dashboard/SidePannel.tsx b/app/src/components/Dashboard/SidePannel.tsx index 15e704c..114d122 100644 --- a/app/src/components/Dashboard/SidePannel.tsx +++ b/app/src/components/Dashboard/SidePannel.tsx @@ -39,12 +39,13 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => { const token = localStorage.getItem("token"); const refreshToken = localStorage.getItem("refreshToken"); if (!token || !refreshToken) { - console.error('token expired'); return; } try { const projectId = generateProjectId(); - useSocketStore.getState().initializeSocket(email, organization, token, refreshToken); + useSocketStore + .getState() + .initializeSocket(email, organization, token, refreshToken); //API for creating new Project // const project = await createProject( @@ -73,11 +74,8 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => { projectSocket.emit("v1:project:add", addProject); } else { - console.error("Socket is not connected."); } - } catch (error) { - console.error("Error creating project:", error); - } + } catch (error) {} }; return ( @@ -90,7 +88,7 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => {
{userName ? userName.charAt(0).toUpperCase() + - userName.slice(1).toLowerCase() + userName.slice(1).toLowerCase() : "Anonymous"}
@@ -98,16 +96,12 @@ const SidePannel: React.FC = ({ setActiveTab, activeTab }) => { -
+
+ New project
-
= ({ setActiveTab, activeTab }) => { > Home -
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+ +
+
diff --git a/app/src/components/Dashboard/socket/projectSocketRes.dev.tsx b/app/src/components/Dashboard/socket/projectSocketRes.dev.tsx deleted file mode 100644 index 9fac261..0000000 --- a/app/src/components/Dashboard/socket/projectSocketRes.dev.tsx +++ /dev/null @@ -1,101 +0,0 @@ - -import React, { useEffect } from 'react'; -import { useSocketStore } from '../../../store/builder/store'; -import { getUserData } from '../../../functions/getUserData'; -import { getAllProjects } from '../../../services/dashboard/getAllProjects'; -import { recentlyViewed } from '../../../services/dashboard/recentlyViewed'; - -interface Project { - _id: string; - projectName: string; - thumbnail: string; - createdBy: string; - projectUuid?: string; - createdAt: string; - isViewed?: string -} -interface RecentProject { - _id: string; - projectName: string; - thumbnail: string; - createdBy: { _id: string, userName: string }; - projectUuid?: string; - createdAt: string; - isViewed?: string -} - -interface RecentProjectData { - [key: string]: RecentProject[]; -} -interface ProjectsData { - [key: string]: Project[]; -} -interface ProjectSocketResProps { - setRecentProjects?: React.Dispatch>; - setWorkspaceProjects?: React.Dispatch>; - setIsSearchActive?: React.Dispatch>; -} - -const ProjectSocketRes = ({ - setRecentProjects, - setWorkspaceProjects, - setIsSearchActive, -}: ProjectSocketResProps) => { - const { projectSocket } = useSocketStore(); - const { userId, organization } = getUserData(); - - useEffect(() => { - if (!projectSocket) return; - - const handleAdd = (data: any) => { - // console.log('Add:', data); - }; - - const handleDelete = (data: any) => { - // console.log('Delete:', data); - }; - - const handleUpdate = (data: any) => { - // console.log('Update:', data); - }; - - const handleTrashDelete = (data: any) => { - // console.log('Trash Delete:', data); - }; - - const handleDuplicate = async (data: any) => { - console.log("Project duplicate response:", data); - if (data?.message === "Project Duplicated successfully") { - if (setWorkspaceProjects) { - const allProjects = await getAllProjects(userId, organization); - // console.log('allProjects: ', allProjects); - setWorkspaceProjects(allProjects); - } else if (setRecentProjects) { - const recentProjects = await recentlyViewed(organization, userId); - setRecentProjects && setRecentProjects(recentProjects); - } - setIsSearchActive && setIsSearchActive(false); - } else { - console.warn("Duplication failed or unexpected response."); - } - }; - - projectSocket.on("v1-project:response:add", handleAdd); - projectSocket.on("v1-project:response:delete", handleDelete); - projectSocket.on("v1-project:response:update", handleUpdate); - projectSocket.on("v1-project:response:Duplicate", handleDuplicate); - projectSocket.on("v1:trash:response:delete", handleTrashDelete); - - return () => { - projectSocket.off("v1-project:response:add", handleAdd); - projectSocket.off("v1-project:response:delete", handleDelete); - projectSocket.off("v1-project:response:update", handleUpdate); - projectSocket.off("v1-project:response:Duplicate", handleDuplicate); - projectSocket.off("v1:trash:response:delete", handleTrashDelete); - }; - }, [projectSocket, userId, organization]); - - return null; -}; - -export default ProjectSocketRes; diff --git a/app/src/components/Dashboard/socket/projectSocketRes.tsx b/app/src/components/Dashboard/socket/projectSocketRes.tsx new file mode 100644 index 0000000..49285c2 --- /dev/null +++ b/app/src/components/Dashboard/socket/projectSocketRes.tsx @@ -0,0 +1,90 @@ +import React, { useEffect } from "react"; +import { useSocketStore } from "../../../store/builder/store"; +import { getUserData } from "../../../functions/getUserData"; +import { getAllProjects } from "../../../services/dashboard/getAllProjects"; +import { recentlyViewed } from "../../../services/dashboard/recentlyViewed"; + +interface Project { + _id: string; + projectName: string; + thumbnail: string; + createdBy: { _id: string; userName: string }; + projectUuid?: string; + createdAt?: string; + DeletedAt?: string; + isViewed?: string; +} + +interface ProjectCollection { + [key: string]: Project[]; +} + +interface ProjectSocketResProps { + setRecentProjects?: React.Dispatch>; + setWorkspaceProjects?: React.Dispatch>; + setIsSearchActive?: React.Dispatch>; +} + +const ProjectSocketRes = ({ + setRecentProjects, + setWorkspaceProjects, + setIsSearchActive, +}: ProjectSocketResProps) => { + const { projectSocket } = useSocketStore(); + const { userId, organization } = getUserData(); + + useEffect(() => { + if (!projectSocket) return; + + const handleAdd = (data: any) => { + // console.log("Add:", data); + }; + + const handleDelete = (data: any) => { + // console.log("Delete:", data); + }; + + const handleUpdate = (data: any) => { + // console.log("Update:", data); + }; + + const handleTrashDelete = (data: any) => { + // console.log("Trash Delete:", data); + }; + + const handleDuplicate = async (data: any) => { + console.log("Project duplicate response:", data); + if (data?.message === "Project Duplicated successfully") { + if (setWorkspaceProjects) { + const allProjects = await getAllProjects(userId, organization); + setWorkspaceProjects(allProjects); + } else if (setRecentProjects) { + const recentProjects = await recentlyViewed(organization, userId); + setRecentProjects(recentProjects); + } + setIsSearchActive && setIsSearchActive(false); + } else { + console.warn("Duplication failed or unexpected response."); + } + }; + + projectSocket.on("v1-project:response:add", handleAdd); + projectSocket.on("v1-project:response:delete", handleDelete); + projectSocket.on("v1-project:response:update", handleUpdate); + projectSocket.on("v1-project:response:Duplicate", handleDuplicate); + projectSocket.on("v1:trash:response:delete", handleTrashDelete); + + return () => { + projectSocket.off("v1-project:response:add", handleAdd); + projectSocket.off("v1-project:response:delete", handleDelete); + projectSocket.off("v1-project:response:update", handleUpdate); + projectSocket.off("v1-project:response:Duplicate", handleDuplicate); + projectSocket.off("v1:trash:response:delete", handleTrashDelete); + }; + // eslint-disable-next-line + }, [projectSocket, userId, organization]); + + return null; +}; + +export default ProjectSocketRes; diff --git a/app/src/components/footer/Footer.tsx b/app/src/components/footer/Footer.tsx index 39273df..daa4741 100644 --- a/app/src/components/footer/Footer.tsx +++ b/app/src/components/footer/Footer.tsx @@ -1,16 +1,10 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, useMemo, useCallback } from "react"; import { HelpIcon, WifiIcon } from "../icons/DashboardIcon"; import { useLogger } from "../ui/log/LoggerContext"; import { GetLogIcon } from "./getLogIcons"; -import { - CurserLeftIcon, - CurserMiddleIcon, - CurserRightIcon, -} from "../icons/LogIcons"; +import { CurserLeftIcon, CurserMiddleIcon, CurserRightIcon } from "../icons/LogIcons"; import ShortcutHelper from "./shortcutHelper"; -import useVersionHistoryVisibleStore, { - useShortcutStore, -} from "../../store/builder/store"; +import useVersionHistoryVisibleStore, { useShortcutStore } from "../../store/builder/store"; import { usePlayButtonStore } from "../../store/usePlayButtonStore"; import useModuleStore, { useSubModuleStore } from "../../store/useModuleStore"; import { useVersionContext } from "../../modules/builder/version/versionContext"; @@ -19,7 +13,7 @@ import { useMouseNoteStore } from "../../store/useUIToggleStore"; const Footer: React.FC = () => { const { logs, setIsLogListVisible } = useLogger(); - const lastLog = logs.length > 0 ? logs[logs.length - 1] : null; + const lastLog = logs[logs.length - 1] || null; const { setActiveModule } = useModuleStore(); const { setSubModule } = useSubModuleStore(); @@ -30,46 +24,40 @@ const Footer: React.FC = () => { const { selectedVersion } = selectedVersionStore(); const { Leftnote, Middlenote, Rightnote } = useMouseNoteStore(); - const [isOnline, setIsOnline] = useState(navigator.onLine); - useEffect(() => { - const handleOnline = () => { - echo.success('You are back Online'); - setIsOnline(true); - }; - const handleOffline = () => { - echo.warn('Changes made now might not be saved'); - echo.error('You are now Offline.'); - setIsOnline(false); - }; + // -------------------- Online/Offline Handlers -------------------- + const handleOnline = useCallback(() => { + echo.success("You are back Online"); + setIsOnline(true); + }, []); + const handleOffline = useCallback(() => { + echo.warn("Changes made now might not be saved"); + echo.error("You are now Offline."); + setIsOnline(false); + }, []); + + useEffect(() => { window.addEventListener("online", handleOnline); window.addEventListener("offline", handleOffline); - return () => { window.removeEventListener("online", handleOnline); window.removeEventListener("offline", handleOffline); }; - }, []); - const mouseButtons = [ - { - icon: , - label: Leftnote !== "" ? Leftnote : "Pan", - mouse: "left", - }, - { - icon: , - label: Middlenote !== "" ? Middlenote : "Scroll Zoom", - mouse: "middle", - }, - { - icon: , - label: Rightnote !== "" ? Rightnote : "Orbit / Cancel action", - mouse: "right", - }, - ]; + }, [handleOnline, handleOffline]); + // -------------------- Mouse Buttons -------------------- + const mouseButtons = useMemo( + () => [ + { icon: , label: Leftnote || "Pan", mouse: "left" }, + { icon: , label: Middlenote || "Scroll Zoom", mouse: "middle" }, + { icon: , label: Rightnote || "Orbit / Cancel action", mouse: "right" }, + ], + [Leftnote, Middlenote, Rightnote] + ); + + // -------------------- Mouse Helper -------------------- useEffect(() => { const cleanup = mouseActionHelper(); return () => cleanup(); @@ -78,6 +66,7 @@ const Footer: React.FC = () => { return (
+ {/* Mouse Button Info */}
{mouseButtons.map(({ icon, label, mouse }) => (
@@ -87,13 +76,15 @@ const Footer: React.FC = () => { ))}
+ {/* Logs and Version */}
-
-
+
+
+
+
{ @@ -119,11 +111,8 @@ const Footer: React.FC = () => {
-
+ +
@@ -132,12 +121,9 @@ const Footer: React.FC = () => {
- {!isPlaying && ( -
+ {/* Shortcut Helper */} + {!isPlaying && showShortcuts && ( +
)} diff --git a/app/src/components/icons/DashboardIcon.tsx b/app/src/components/icons/DashboardIcon.tsx index 3eb5301..dbcfb7b 100644 --- a/app/src/components/icons/DashboardIcon.tsx +++ b/app/src/components/icons/DashboardIcon.tsx @@ -34,7 +34,7 @@ export function HomeIcon() { > ); @@ -51,7 +51,7 @@ export function ProjectsIcon() { > ); @@ -70,103 +70,103 @@ export function TutorialsIcon() { cx="8.157" cy="8.35866" r="6.17928" - stroke="var(--text-button-color)" + stroke="var(--text-color)" strokeWidth="0.562865" /> @@ -184,12 +184,12 @@ export function DocumentationIcon() { > @@ -208,7 +208,7 @@ export function HelpIcon() { @@ -236,17 +236,17 @@ export function LogoutIcon() { > diff --git a/app/src/pages/Dashboard.tsx b/app/src/pages/Dashboard.tsx index 93cc51a..2481adc 100644 --- a/app/src/pages/Dashboard.tsx +++ b/app/src/pages/Dashboard.tsx @@ -1,34 +1,36 @@ import React, { useEffect, useState } from "react"; import { useSocketStore } from "../store/builder/store"; -import DashboardHome from "../components/Dashboard/DashboardHome"; -import DashboardProjects from "../components/Dashboard/DashboardProjects"; -import DashboardTrash from "../components/Dashboard/DashboardTrash"; import { getUserData } from "../functions/getUserData"; import SidePannel from "../components/Dashboard/SidePannel"; import DashboardTutorial from "../components/Dashboard/DashboardTutorial"; +import DashboardMain from "../components/Dashboard/DashboardMain"; const Dashboard: React.FC = () => { - const [activeTab, setActiveTab] = useState("Home"); - const { socket } = useSocketStore(); - const { organization, email } = getUserData(); + const [activeTab, setActiveTab] = useState("Home"); + const { socket } = useSocketStore(); + const { organization, email } = getUserData(); - useEffect(() => { - const token = localStorage.getItem("token"); - const refreshToken = localStorage.getItem("refreshToken") - if (token && refreshToken) { - useSocketStore.getState().initializeSocket(email, organization, token, refreshToken); + useEffect(() => { + const token = localStorage.getItem("token"); + const refreshToken = localStorage.getItem("refreshToken"); + if (token && refreshToken) { + useSocketStore + .getState() + .initializeSocket(email, organization, token, refreshToken); + } + }, [socket, email, organization]); + + return ( +
+ + - - {activeTab === "Home" && } - {activeTab === "Projects" && } - {activeTab === "Trash" && } - {activeTab === "Tutorials" && } -
- ); + /> + {activeTab === "Tutorials" && } +
+ ); }; export default Dashboard; diff --git a/app/src/styles/pages/_dashboard.scss b/app/src/styles/pages/_dashboard.scss index cfb2770..a87c966 100644 --- a/app/src/styles/pages/_dashboard.scss +++ b/app/src/styles/pages/_dashboard.scss @@ -51,11 +51,36 @@ } .new-project-button { + position: relative; padding: 12px 16px; - cursor: not-allowed; color: var(--text-color); - background: var(--background-color-secondary); + background: #7b4cd323; border-radius: #{$border-radius-xxx}; + overflow: hidden; + cursor: pointer; + transition: color 0.3s; + &::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + transform: translate(-50%, -50%); + height: 0px; + width: 0px; + border-radius: 50%; + background: var(--background-color-accent); + z-index: -1; + transition: all 0.25s ease-in-out; + } + &:hover { + color: var(--text-button-color); + &::after { + height: 260px; + width: 260px; + left: 50%; + scale: 1; + } + } } .side-bar-content-container { @@ -72,8 +97,13 @@ padding: 8px 10px; margin: 4px 0; border-radius: #{$border-radius-extra-large}; + width: 100%; cursor: pointer; + &:disabled { + cursor: help; + } + &:hover { background: var(--background-color-secondary); } @@ -164,20 +194,31 @@ min-width: 260px; position: relative; border: 1px solid var(--border-color); - border-radius: #{$border-radius-extra-large}; + border-radius: 22px; cursor: pointer; - overflow: visible; + overflow: hidden; + &:hover { + border-color: var(--accent-color); + .preview-container { + img { + scale: 1.05; + } + } + } .dashboard-card-wrapper { width: 100%; height: 100%; position: relative; overflow: hidden; + padding-bottom: 1px; } .preview-container { height: 100%; width: 100%; + border-radius: #{$border-radius-extra-large}; + overflow: hidden; img { height: 100%; @@ -186,21 +227,21 @@ vertical-align: top; border: none; outline: none; - border-radius: #{$border-radius-extra-large}; + transition: scale 0.2s; } } .project-details-container { @include flex-space-between; position: absolute; - bottom: 0; + bottom: 1px; width: 100%; padding: 13px 16px; background: var(--background-color); - - border-radius: #{$border-radius-xlarge}; + border-radius: #{$border-radius-extra-large}; + backdrop-filter: blur(6px); // transform: translateY(100%);///////hovered - transition: transform 0.25s linear; + transition: transform 0.2s linear; .project-details { display: flex; @@ -212,6 +253,7 @@ } .project-data { + text-align: start; color: var(--input-text-color); } } @@ -226,8 +268,8 @@ width: 26px; line-height: 26px; text-align: center; - background: var(--accent-color); - color: var(--text-color); + background: var(--background-color-accent); + color: var(--text-button-color); border-radius: #{$border-radius-circle}; } @@ -308,10 +350,7 @@ } .kebab-options-wrapper { - // position: absolute; - // bottom: 40px; - // right: 40px; - // z-index: 100; + min-width: 140px; background: var(--background-color); border: 1px solid var(--border-color); border-radius: 8px; From e208d79ce60894eaee85cf81a0ff34195a902a41 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Thu, 4 Sep 2025 10:14:14 +0530 Subject: [PATCH 12/17] wall asset movement bug fixed --- .../builder/line/helpers/getClosestPointOnLineSegment.ts | 2 +- .../builder/wallAsset/Instances/Instance/wallAssetInstance.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts b/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts index b22c3da..8b65282 100644 --- a/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts +++ b/app/src/modules/builder/line/helpers/getClosestPointOnLineSegment.ts @@ -1,7 +1,7 @@ import { Vector3 } from "three"; export default function closestPointOnLineSegment(p: Vector3, a: Vector3, b: Vector3) { - const ab = new Vector3().subVectors(a, b); + const ab = new Vector3().subVectors(b, a); const ap = new Vector3().subVectors(p, a); const abLengthSq = ab.lengthSq(); diff --git a/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx b/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx index cf92957..73503ff 100644 --- a/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx +++ b/app/src/modules/builder/wallAsset/Instances/Instance/wallAssetInstance.tsx @@ -17,7 +17,7 @@ import closestPointOnLineSegment from '../../../line/helpers/getClosestPointOnLi import { upsertWallAssetApi } from '../../../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; import { deleteWallAssetApi } from '../../../../../services/factoryBuilder/asset/wallAsset/deleteWallAssetApi'; -function WallAssetInstance({ wallAsset }: { wallAsset: WallAsset }) { +function WallAssetInstance({ wallAsset }: { readonly wallAsset: WallAsset }) { const url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; const { socket } = useSocketStore(); const { raycaster, pointer, camera, scene, controls, gl } = useThree(); From 0d7f5d280f3e4fc4ca446d5036c01590ecaefeb4 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Thu, 4 Sep 2025 12:41:49 +0530 Subject: [PATCH 13/17] first person bug fix --- .../components/layout/scenes/MainScene.tsx | 2 +- .../versionHisory/VersionHistory.tsx | 11 +- .../versionHisory/VersionSaved.tsx | 251 +++++++++--------- .../eventHandler/useDecalEventHandlers.ts | 2 + app/src/modules/builder/builder.tsx | 6 +- app/src/modules/scene/camera/camMode.tsx | 4 +- app/src/modules/scene/clouds/clouds.tsx | 30 +-- app/src/modules/scene/setup/setup.tsx | 3 +- 8 files changed, 149 insertions(+), 160 deletions(-) diff --git a/app/src/components/layout/scenes/MainScene.tsx b/app/src/components/layout/scenes/MainScene.tsx index 1234246..58e4da2 100644 --- a/app/src/components/layout/scenes/MainScene.tsx +++ b/app/src/components/layout/scenes/MainScene.tsx @@ -80,7 +80,7 @@ function MainScene() { } }) } - }, [setSelectedVersion, versionHistory]) + }, [setSelectedVersion, versionHistory, projectId]) const handleSelectVersion = (option: string) => { const version = versionHistory.find((version) => version.versionName === option); diff --git a/app/src/components/layout/sidebarRight/versionHisory/VersionHistory.tsx b/app/src/components/layout/sidebarRight/versionHisory/VersionHistory.tsx index a0255f4..8cc35e1 100644 --- a/app/src/components/layout/sidebarRight/versionHisory/VersionHistory.tsx +++ b/app/src/components/layout/sidebarRight/versionHisory/VersionHistory.tsx @@ -1,10 +1,4 @@ -import { - AddIcon, - ArrowIcon, - CloseIcon, - KebabIcon, - LocationIcon, -} from "../../../icons/ExportCommonIcons"; +import { AddIcon, ArrowIcon, CloseIcon, KebabIcon, LocationIcon } from "../../../icons/ExportCommonIcons"; import RenameInput from "../../../ui/inputs/RenameInput"; import { useVersionHistoryStore } from "../../../../store/builder/useVersionHistoryStore"; import { useSubModuleStore } from "../../../../store/useModuleStore"; @@ -30,9 +24,8 @@ const VersionHistory = () => { getVersionDataApi(projectId, version.versionId).then((versionData) => { setSelectedVersion(version); - // console.log(versionData); }).catch((err) => { - // console.log(err); + echo.error(err); }) }; diff --git a/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx b/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx index fb60ecc..d099b6f 100644 --- a/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx +++ b/app/src/components/layout/sidebarRight/versionHisory/VersionSaved.tsx @@ -1,8 +1,5 @@ import { useEffect, useState } from "react"; -import { - FinishEditIcon, - RenameVersionIcon, -} from "../../../icons/ExportCommonIcons"; +import { FinishEditIcon, RenameVersionIcon } from "../../../icons/ExportCommonIcons"; import RenderOverlay from "../../../templates/Overlay"; import { useVersionHistoryStore } from "../../../../store/builder/useVersionHistoryStore"; import { createVersionApi } from "../../../../services/factoryBuilder/versionControl/addVersionApi"; @@ -11,144 +8,144 @@ import { getUserData } from "../../../../functions/getUserData"; import { useVersionContext } from "../../../../modules/builder/version/versionContext"; const VersionSaved = () => { - const { addVersion, createNewVersion, setCreateNewVersion } = useVersionHistoryStore(); - const { selectedVersionStore } = useVersionContext(); - const { selectedVersion, setSelectedVersion } = selectedVersionStore(); - const [newName, setNewName] = useState(new Date().toLocaleString("en-US", { - month: "short", - day: "numeric", - year: "numeric", - hour: "numeric", - minute: "2-digit", - })); - const [description, setDescription] = useState(""); - const [showSaveFinish, setSaveFinish] = useState(false); - const { projectId } = useParams(); - const { userId } = getUserData(); - - useEffect(() => { - if (createNewVersion) { - const defaultName = new Date().toLocaleString("en-US", { + const { addVersion, createNewVersion, setCreateNewVersion } = useVersionHistoryStore(); + const { selectedVersionStore } = useVersionContext(); + const { selectedVersion, setSelectedVersion } = selectedVersionStore(); + const [newName, setNewName] = useState(new Date().toLocaleString("en-US", { month: "short", day: "numeric", year: "numeric", hour: "numeric", minute: "2-digit", - }); - setNewName(defaultName); - setDescription(""); - } - }, [createNewVersion]); + })); + const [description, setDescription] = useState(""); + const [saveFinish, setSaveFinish] = useState(false); + const { projectId } = useParams(); + const { userId } = getUserData(); - const handleSave = () => { - if (!selectedVersion || !projectId) return; + useEffect(() => { + if (createNewVersion) { + const defaultName = new Date().toLocaleString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + hour: "numeric", + minute: "2-digit", + }); + setNewName(defaultName); + setDescription(""); + } + }, [createNewVersion]); - const updatedName = (newName.trim() || selectedVersion.versionName) ?? selectedVersion.timeStamp; - const updatedDescription = (description.trim() || selectedVersion.versionName) ?? selectedVersion.timeStamp; + const handleSave = () => { + if (!selectedVersion || !projectId) return; - createVersionApi(projectId, userId, selectedVersion.versionId, updatedName, updatedDescription).then((data) => { - setSaveFinish(true); - setCreateNewVersion(false); + const updatedName = (newName.trim() || selectedVersion.versionName) ?? selectedVersion.timeStamp; + const updatedDescription = (description.trim() || selectedVersion.versionName) ?? selectedVersion.timeStamp; - addVersion({ - version: data.version, - versionId: data.versionId, - versionName: data.versionName, - versionDescription: data.description, - timeStamp: data.createdAt, - createdBy: data.createdBy.userName - }) + createVersionApi(projectId, userId, selectedVersion.versionId, updatedName, updatedDescription).then((data) => { + setSaveFinish(true); + setCreateNewVersion(false); - setSelectedVersion({ - version: data.version, - versionId: data.versionId, - versionName: data.versionName, - versionDescription: data.description, - timeStamp: data.createdAt, - createdBy: data.createdBy.userName - }) + addVersion({ + version: data.version, + versionId: data.versionId, + versionName: data.versionName, + versionDescription: data.description, + timeStamp: data.createdAt, + createdBy: data.createdBy.userName + }) - setTimeout(() => { + setSelectedVersion({ + version: data.version, + versionId: data.versionId, + versionName: data.versionName, + versionDescription: data.description, + timeStamp: data.createdAt, + createdBy: data.createdBy.userName + }) + + setTimeout(() => { + setSaveFinish(false); + }, 3000); + }).catch((err) => { + setSaveFinish(false); + setCreateNewVersion(false); + }) + }; + + const handleCancel = () => { setSaveFinish(false); - }, 3000); - }).catch((err) => { - setSaveFinish(false); - setCreateNewVersion(false); - }) - }; + setCreateNewVersion(false); + }; - const handleCancel = () => { - setSaveFinish(false); - setCreateNewVersion(false); - }; + if (!selectedVersion) return null; - if (!selectedVersion) return null; + return ( +
+ {createNewVersion && + +
+
+
+ +
Create Version
+
+
+
+ setNewName(e.target.value)} + placeholder="Enter new version name" + /> +
+ by @{selectedVersion.createdBy}{" "}{new Date(selectedVersion.timeStamp).toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "2-digit", + })} +
+
+
+