From fa6506c0be224881e6b1a054ba8a9764992acb37 Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Fri, 27 Jun 2025 17:51:57 +0530 Subject: [PATCH] Refactor: Remove deprecated API endpoints and implement new zone management features - Deleted obsolete API files for wall items, layers, lines, and points. - Introduced new zone management APIs including create, delete, and update functionalities. - Enhanced zone state management in the store with new properties for height and color. - Implemented 2D and 3D zone rendering components for better visualization. - Added asset fetching functionalities for marketplace integration. - Updated types to accommodate new zone properties and API responses. --- .../components/layout/scenes/MainScene.tsx | 2 +- .../components/layout/sidebarLeft/Assets.tsx | 2 +- app/src/components/ui/list/List.tsx | 2 +- .../IntialLoad/loadInitialWallItems.ts | 2 +- app/src/modules/builder/asset/assetsGroup.tsx | 2 +- .../builder/asset/functions/addAssetModel.ts | 2 +- app/src/modules/builder/builder.tsx | 39 +- .../Instances/Instance/floor2DInstance.tsx | 1 - app/src/modules/builder/groups/zoneGroup.tsx | 1302 ++++++++--------- .../builder/wall/Instances/wallInstances.tsx | 2 +- .../Instances/Instance/zone2DInstance.tsx | 50 + .../zone/Instances/Instance/zoneInstance.tsx | 73 + .../builder/zone/Instances/zoneInstances.tsx | 132 ++ .../builder/zone/zoneCreator/zoneCreator.tsx | 10 + app/src/modules/builder/zone/zoneGroup.tsx | 54 + app/src/modules/market/MarketPlace.tsx | 2 +- .../selectionControls/copyPasteControls.tsx | 2 +- .../selectionControls/duplicationControls.tsx | 2 +- .../selectionControls/moveControls.tsx | 2 +- .../selectionControls/rotateControls.tsx | 2 +- .../selectionControls/selectionControls.tsx | 2 +- .../transformControls/transformControls.tsx | 2 +- .../assest/wallAsset/deleteWallItemApi.ts | 42 - .../assest/wallAsset/getWallItemsApi.ts | 37 - .../assest/wallAsset/setWallItemApi.ts | 55 - .../assets/getAssetImages.ts | 48 +- .../{assest => asset}/assets/getAssetModel.ts | 58 +- .../assets/getCategoryAsset.ts | 0 .../floorAsset/deleteFloorItemApi.ts | 84 +- .../floorAsset/getFloorItemsApi.ts | 78 +- .../floorAsset/setAssetsApi.ts | 0 .../factoryBuilder/lines/deleteLayerApi.ts | 34 - .../factoryBuilder/lines/deleteLineApi.ts | 34 - .../factoryBuilder/lines/deletePointApi.ts | 35 - .../factoryBuilder/lines/getLinesApi.ts | 38 - .../factoryBuilder/lines/setLineApi.ts | 41 - .../factoryBuilder/lines/updatePointApi.ts | 38 - .../factoryBuilder/zone/deleteZoneApi.ts | 39 + .../factoryBuilder/zone/getZonesApi.ts | 37 + .../factoryBuilder/zone/upsertZoneApi.ts | 39 + .../factoryBuilder/zones/deleteZoneApi.ts | 39 - .../factoryBuilder/zones/getZonesApi.ts | 40 - .../factoryBuilder/zones/setZonesApi.ts | 38 - app/src/store/builder/useBuilderStore.ts | 34 + app/src/store/builder/useZoneStore.ts | 24 +- app/src/types/builderTypes.d.ts | 1 + 46 files changed, 1301 insertions(+), 1301 deletions(-) create mode 100644 app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx create mode 100644 app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx create mode 100644 app/src/modules/builder/zone/Instances/zoneInstances.tsx create mode 100644 app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx create mode 100644 app/src/modules/builder/zone/zoneGroup.tsx delete mode 100644 app/src/services/factoryBuilder/assest/wallAsset/deleteWallItemApi.ts delete mode 100644 app/src/services/factoryBuilder/assest/wallAsset/getWallItemsApi.ts delete mode 100644 app/src/services/factoryBuilder/assest/wallAsset/setWallItemApi.ts rename app/src/services/factoryBuilder/{assest => asset}/assets/getAssetImages.ts (96%) rename app/src/services/factoryBuilder/{assest => asset}/assets/getAssetModel.ts (96%) rename app/src/services/factoryBuilder/{assest => asset}/assets/getCategoryAsset.ts (100%) rename app/src/services/factoryBuilder/{assest => asset}/floorAsset/deleteFloorItemApi.ts (96%) rename app/src/services/factoryBuilder/{assest => asset}/floorAsset/getFloorItemsApi.ts (96%) rename app/src/services/factoryBuilder/{assest => asset}/floorAsset/setAssetsApi.ts (100%) delete mode 100644 app/src/services/factoryBuilder/lines/deleteLayerApi.ts delete mode 100644 app/src/services/factoryBuilder/lines/deleteLineApi.ts delete mode 100644 app/src/services/factoryBuilder/lines/deletePointApi.ts delete mode 100644 app/src/services/factoryBuilder/lines/getLinesApi.ts delete mode 100644 app/src/services/factoryBuilder/lines/setLineApi.ts delete mode 100644 app/src/services/factoryBuilder/lines/updatePointApi.ts create mode 100644 app/src/services/factoryBuilder/zone/deleteZoneApi.ts create mode 100644 app/src/services/factoryBuilder/zone/getZonesApi.ts create mode 100644 app/src/services/factoryBuilder/zone/upsertZoneApi.ts delete mode 100644 app/src/services/factoryBuilder/zones/deleteZoneApi.ts delete mode 100644 app/src/services/factoryBuilder/zones/getZonesApi.ts delete mode 100644 app/src/services/factoryBuilder/zones/setZonesApi.ts diff --git a/app/src/components/layout/scenes/MainScene.tsx b/app/src/components/layout/scenes/MainScene.tsx index 25d579f..6b55a26 100644 --- a/app/src/components/layout/scenes/MainScene.tsx +++ b/app/src/components/layout/scenes/MainScene.tsx @@ -33,7 +33,7 @@ import { import { useProductContext } from "../../../modules/simulation/products/productContext"; import RegularDropDown from "../../ui/inputs/RegularDropDown"; import RenameTooltip from "../../ui/features/RenameTooltip"; -import { setAssetsApi } from "../../../services/factoryBuilder/assest/floorAsset/setAssetsApi"; +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"; diff --git a/app/src/components/layout/sidebarLeft/Assets.tsx b/app/src/components/layout/sidebarLeft/Assets.tsx index 391675b..0420d2a 100644 --- a/app/src/components/layout/sidebarLeft/Assets.tsx +++ b/app/src/components/layout/sidebarLeft/Assets.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from "react"; import Search from "../../ui/inputs/Search"; -import { getCategoryAsset } from "../../../services/factoryBuilder/assest/assets/getCategoryAsset"; +import { getCategoryAsset } from "../../../services/factoryBuilder/asset/assets/getCategoryAsset"; import { fetchAssets } from "../../../services/marketplace/fetchAssets"; import { useSelectedItem } from "../../../store/builder/store"; diff --git a/app/src/components/ui/list/List.tsx b/app/src/components/ui/list/List.tsx index 0d81bda..cf13a4f 100644 --- a/app/src/components/ui/list/List.tsx +++ b/app/src/components/ui/list/List.tsx @@ -17,7 +17,7 @@ import { useZones, } from "../../../store/builder/store"; import { zoneCameraUpdate } from "../../../services/visulization/zone/zoneCameraUpdation"; -import { setAssetsApi } from "../../../services/factoryBuilder/assest/floorAsset/setAssetsApi"; +import { setAssetsApi } from "../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; import { useParams } from "react-router-dom"; import { getUserData } from "../../../functions/getUserData"; import { useSceneContext } from "../../../modules/scene/sceneContext"; diff --git a/app/src/modules/builder/IntialLoad/loadInitialWallItems.ts b/app/src/modules/builder/IntialLoad/loadInitialWallItems.ts index fd74916..80fdcb9 100644 --- a/app/src/modules/builder/IntialLoad/loadInitialWallItems.ts +++ b/app/src/modules/builder/IntialLoad/loadInitialWallItems.ts @@ -2,7 +2,7 @@ // import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader"; // import * as THREE from "three"; // import * as Types from "../../../types/world/worldTypes"; -// import { getWallItems } from "../../../services/factoryBuilder/assest/wallAsset/getWallItemsApi"; +// import { getWallItems } from "../../../services/factoryBuilder/asset/wallAsset/getWallItemsApi"; // import { retrieveGLTF, storeGLTF } from "../../../utils/indexDB/idbUtils"; // import { getUserData } from "../../../functions/getUserData"; diff --git a/app/src/modules/builder/asset/assetsGroup.tsx b/app/src/modules/builder/asset/assetsGroup.tsx index 72e8033..fad2338 100644 --- a/app/src/modules/builder/asset/assetsGroup.tsx +++ b/app/src/modules/builder/asset/assetsGroup.tsx @@ -1,6 +1,6 @@ import * as THREE from "three" import { useEffect } from 'react' -import { getFloorAssets } from '../../../services/factoryBuilder/assest/floorAsset/getFloorItemsApi'; +import { getFloorAssets } from '../../../services/factoryBuilder/asset/floorAsset/getFloorItemsApi'; import { useLoadingProgress, useRenameModeStore, useSelectedFloorItem, useSelectedItem, useSocketStore } from '../../../store/builder/store'; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader"; diff --git a/app/src/modules/builder/asset/functions/addAssetModel.ts b/app/src/modules/builder/asset/functions/addAssetModel.ts index 3977fa7..7c85a49 100644 --- a/app/src/modules/builder/asset/functions/addAssetModel.ts +++ b/app/src/modules/builder/asset/functions/addAssetModel.ts @@ -3,7 +3,7 @@ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader"; import * as Types from "../../../../types/world/worldTypes"; import { retrieveGLTF, storeGLTF } from "../../../../utils/indexDB/idbUtils"; -// import { setAssetsApi } from '../../../../services/factoryBuilder/assest/floorAsset/setAssetsApi'; +// import { setAssetsApi } from '../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; import { Socket } from "socket.io-client"; import * as CONSTANTS from "../../../../types/world/worldConstants"; import PointsCalculator from "../../../simulation/events/points/functions/pointsCalculator"; diff --git a/app/src/modules/builder/builder.tsx b/app/src/modules/builder/builder.tsx index 66a3502..adea2c6 100644 --- a/app/src/modules/builder/builder.tsx +++ b/app/src/modules/builder/builder.tsx @@ -24,7 +24,7 @@ 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 ZoneGroup from "./groups/zoneGroup"; + import MeasurementTool from "../scene/tools/measurementTool"; import NavMesh from "../simulation/vehicle/navMesh/navMesh"; import CalculateAreaGroup from "./groups/calculateAreaGroup"; @@ -34,21 +34,19 @@ import DxfFile from "./dfx/LoadBlueprint"; import AislesGroup from "./aisle/aislesGroup"; import WallGroup from "./wall/wallGroup"; import FloorGroup from "./floor/floorGroup"; +import ZoneGroup from "./zone/zoneGroup"; + import { useParams } from "react-router-dom"; import { useBuilderStore } from "../../store/builder/useBuilderStore"; import { getUserData } from "../../functions/getUserData"; export default function Builder() { const state = useThree(); // Importing the state from the useThree hook, which contains the scene, camera, and other Three.js elements. - const dragPointControls = useRef() as Types.RefDragControl; // Reference for drag point controls, an array for drag control. // Assigning the scene and camera from the Three.js state to the references. const plane = useRef(null); // Reference for a plane object for raycaster reference. const grid = useRef() as any; // Reference for a grid object for raycaster reference. - const floorPlanGroupLine = useRef() as Types.RefGroup; // Reference for a THREE.Group that has the lines that are drawn. - const floorPlanGroupPoint = useRef() as Types.RefGroup; // Reference for a THREE.Group that has the points that are created. - const currentLayerPoint = useRef([]) as Types.RefMeshArray; // Reference for points that re in the current layer used to update the points in drag controls. const { toggleView } = useToggleView(); // State for toggling between 2D and 3D. const { setToolMode } = useToolMode(); @@ -111,28 +109,25 @@ export default function Builder() { hoveredDeletableWallItem={hoveredDeletableWallItem} /> */} - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + ); } diff --git a/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx b/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx index 166b1de..2f12360 100644 --- a/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx +++ b/app/src/modules/builder/floor/Instances/Instance/floor2DInstance.tsx @@ -32,7 +32,6 @@ function Floor2DInstance({ floor }: { floor: Floor }) { name={`Floor-${floor.floorUuid}`} args={[shape, { depth: Constants.floorConfig.height, - bevelEnabled: floor.isBeveled, }]} userData={floor} > diff --git a/app/src/modules/builder/groups/zoneGroup.tsx b/app/src/modules/builder/groups/zoneGroup.tsx index 24f6ee4..3339c20 100644 --- a/app/src/modules/builder/groups/zoneGroup.tsx +++ b/app/src/modules/builder/groups/zoneGroup.tsx @@ -1,651 +1,651 @@ -import React, { useState, useEffect, useMemo, useRef } from "react"; -import { Html, Line, Sphere } from "@react-three/drei"; -import { useThree, useFrame } from "@react-three/fiber"; -import * as THREE from "three"; -import { - useActiveLayer, - useSocketStore, - useToggleView, - useToolMode, - useRemovedLayer, - useZones, - useZonePoints, -} from "../../../store/builder/store"; -import { getZonesApi } from "../../../services/factoryBuilder/zones/getZonesApi"; - -import * as CONSTANTS from "../../../types/world/worldConstants"; -import * as turf from "@turf/turf"; -import { computeArea } from "../functions/computeArea"; -import { useSelectedZoneStore } from "../../../store/visualization/useZoneStore"; -import { useParams } from "react-router-dom"; -import { getUserData } from "../../../functions/getUserData"; -import { useVersionContext } from "../version/versionContext"; - -const ZoneGroup: React.FC = () => { - const { camera, pointer, gl, raycaster, scene, controls } = useThree(); - const [startPoint, setStartPoint] = useState(null); - const [endPoint, setEndPoint] = useState(null); - const { zones, setZones } = useZones(); - const { zonePoints, setZonePoints } = useZonePoints(); - const [isDragging, setIsDragging] = useState(false); - const { selectedZone } = useSelectedZoneStore(); - const [draggedSphere, setDraggedSphere] = useState(null); - const plane = useMemo(() => new THREE.Plane(new THREE.Vector3(0, 1, 0), 0), []); - const { toggleView } = useToggleView(); - const { removedLayer, setRemovedLayer } = useRemovedLayer(); - const { toolMode } = useToolMode(); - const { activeLayer } = useActiveLayer(); - const { socket } = useSocketStore(); - const { selectedVersionStore } = useVersionContext(); - const { selectedVersion } = selectedVersionStore(); - const { projectId } = useParams(); - const { userId, organization } = getUserData(); - - const groupsRef = useRef(); - - const zoneMaterial = useMemo( - () => - new THREE.ShaderMaterial({ - side: THREE.DoubleSide, - vertexShader: ` - varying vec2 vUv; - void main(){ - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); - vUv = uv; - } - `, - fragmentShader: ` - varying vec2 vUv; - uniform vec3 uOuterColor; - void main(){ - float alpha = 1.0 - vUv.y; - gl_FragColor = vec4(uOuterColor, alpha); - } - `, - uniforms: { - uOuterColor: { value: new THREE.Color(CONSTANTS.zoneConfig.color) }, - }, - transparent: true, - depthWrite: false, - }), - [] - ); - - useEffect(() => { - if (!selectedVersion) return; - getZonesApi(organization, projectId, selectedVersion?.versionId || '').then((data) => { - if (data && data.length > 0) { - const fetchedZones = data.map((zone: any) => ({ - zoneUuid: zone.zoneUuid, - zoneName: zone.zoneName, - points: zone.points, - viewPortCenter: zone.viewPortCenter, - viewPortposition: zone.viewPortposition, - layer: zone.layer, - })); - - setZones(fetchedZones); - - const fetchedPoints = data.flatMap((zone: any) => - zone.points.slice(0, 4).map((point: [number, number, number]) => new THREE.Vector3(...point)) - ); - - setZonePoints(fetchedPoints); - } else { - setZones([]); - } - }).catch((err) => { - console.error(err); - }) - }, [selectedVersion?.versionId]); - - useEffect(() => { - localStorage.setItem("zones", JSON.stringify(zones)); - }, [zones]); - - useEffect(() => { - if (removedLayer) { - const updatedZones = zones.filter((zone: any) => zone.layer !== removedLayer); - setZones(updatedZones); - - const updatedzonePoints = zonePoints.filter((_: any, index: any) => { - const zoneIndex = Math.floor(index / 4); - return zones[zoneIndex]?.layer !== removedLayer; - }); - setZonePoints(updatedzonePoints); - - zones.filter((zone: any) => zone.layer === removedLayer).forEach((zone: any) => { deleteZoneFromBackend(zone.zoneUuid); }); - - setRemovedLayer(null); - } - }, [removedLayer]); - - useEffect(() => { - if (toolMode !== "Zone") { - setStartPoint(null); - setEndPoint(null); - } - if (!toggleView) { - setStartPoint(null); - setEndPoint(null); - } - }, [toolMode, toggleView]); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const addZoneToBackend = async (zone: { - zoneUuid: string; - zoneName: string; - points: [number, number, number][]; - layer: string; - }) => { - - const calculateCenter = (points: number[][]) => { - if (!points || points.length === 0) return null; - - let sumX = 0, sumY = 0, sumZ = 0; - const numPoints = points.length; - - points.forEach(([x, y, z]) => { - sumX += x; - sumY += y; - sumZ += z; - }); - - return [sumX / numPoints, sumY / numPoints, sumZ / numPoints] as [ - number, - number, - number - ]; - }; - - const target: [number, number, number] | null = calculateCenter(zone.points); - if (!target || zone.points.length < 4) return; - const position = [target[0], 10, target[2]]; - - const input = { - userId: userId, - versionId: selectedVersion?.versionId || '', - projectId, - organization, - zoneData: { - zoneName: zone.zoneName, - zoneUuid: zone.zoneUuid, - points: zone.points, - viewPortCenter: target, - viewPortposition: position, - layer: zone.layer, - }, - }; - - socket.emit("v1:zone:set", input); - }; - - // eslint-disable-next-line react-hooks/exhaustive-deps - const updateZoneToBackend = async (zone: { - zoneUuid: string; - zoneName: string; - points: [number, number, number][]; - layer: string; - }) => { - - const calculateCenter = (points: number[][]) => { - if (!points || points.length === 0) return null; - - let sumX = 0, sumY = 0, sumZ = 0; - const numPoints = points.length; - - points.forEach(([x, y, z]) => { - sumX += x; - sumY += y; - sumZ += z; - }); - - return [sumX / numPoints, sumY / numPoints, sumZ / numPoints] as [ - number, - number, - number - ]; - }; - - const target: [number, number, number] | null = calculateCenter(zone.points); - if (!target || zone.points.length < 4) return; - const position = [target[0], 10, target[2]]; - - const input = { - userId: userId, - versionId: selectedVersion?.versionId || '', - projectId, - organization, - zoneData: { - zoneName: zone.zoneName, - zoneUuid: zone.zoneUuid, - points: zone.points, - viewPortCenter: target, - viewPortposition: position, - layer: zone.layer, - }, - }; - - socket.emit("v1:zone:set", input); - }; - - const deleteZoneFromBackend = async (zoneUuid: string) => { - - const input = { - userId: userId, - versionId: selectedVersion?.versionId || '', - projectId, - organization, - zoneUuid: zoneUuid, - }; - - socket.emit("v1:zone:delete", input); - }; - - // eslint-disable-next-line react-hooks/exhaustive-deps - const handleDeleteZone = (zoneUuid: string) => { - const updatedZones = zones.filter((zone: any) => zone.zoneUuid !== zoneUuid); - setZones(updatedZones); - - const zoneIndex = zones.findIndex((zone: any) => zone.zoneUuid === zoneUuid); - if (zoneIndex !== -1) { - const zonePointsToRemove = zonePoints.slice(zoneIndex * 4, zoneIndex * 4 + 4); - zonePointsToRemove.forEach((point: any) => groupsRef.current.remove(point)); - const updatedzonePoints = zonePoints.filter((_: any, index: any) => index < zoneIndex * 4 || index >= zoneIndex * 4 + 4); - setZonePoints(updatedzonePoints); - } - deleteZoneFromBackend(zoneUuid); - }; - - useEffect(() => { - if (!camera || !toggleView) return; - const canvasElement = gl.domElement; - - let drag = false; - let isLeftMouseDown = false; - - const onMouseDown = (evt: any) => { - if (evt.button === 0) { - isLeftMouseDown = true; - drag = false; - - raycaster.setFromCamera(pointer, camera); - const intersects = raycaster.intersectObjects(groupsRef.current.children, true); - - if (intersects.length > 0 && toolMode === "move") { - const clickedObject = intersects[0].object; - const sphereIndex = zonePoints.findIndex((point: any) => - point.equals(clickedObject.position) - ); - if (sphereIndex !== -1) { - (controls as any).enabled = false; - setDraggedSphere(zonePoints[sphereIndex]); - setIsDragging(true); - } - } - } - }; - - const onMouseUp = (evt: any) => { - if (evt.button === 0 && !drag && !isDragging && toolMode === 'Zone') { - isLeftMouseDown = false; - - if (!startPoint) { - raycaster.setFromCamera(pointer, camera); - const intersectionPoint = new THREE.Vector3(); - const point = raycaster.ray.intersectPlane(plane, intersectionPoint); - if (point) { - setStartPoint(point); - setEndPoint(null); - } - } else if (startPoint) { - raycaster.setFromCamera(pointer, camera); - const intersectionPoint = new THREE.Vector3(); - const point = raycaster.ray.intersectPlane(plane, intersectionPoint); - if (!point) return; - - const points = [ - [startPoint.x, 0.15, startPoint.z], - [point.x, 0.15, startPoint.z], - [point.x, 0.15, point.z], - [startPoint.x, 0.15, point.z], - [startPoint.x, 0.15, startPoint.z], - ] as [number, number, number][]; - - const zoneName = `Zone ${zones.length + 1}`; - const zoneUuid = THREE.MathUtils.generateUUID(); - const newZone = { - zoneUuid, - zoneName, - points: points, - layer: activeLayer, - }; - - const newZones = [...zones, newZone]; - - setZones(newZones); - - const newzonePoints = [ - new THREE.Vector3(startPoint.x, 0.15, startPoint.z), - new THREE.Vector3(point.x, 0.15, startPoint.z), - new THREE.Vector3(point.x, 0.15, point.z), - new THREE.Vector3(startPoint.x, 0.15, point.z), - ]; - - const updatedZonePoints = [...zonePoints, ...newzonePoints]; - setZonePoints(updatedZonePoints); - - addZoneToBackend(newZone); - setStartPoint(null); - setEndPoint(null); - } - } else if (evt.button === 0 && !drag && !isDragging && toolMode === '2D-Delete') { - raycaster.setFromCamera(pointer, camera); - const intersects = raycaster.intersectObjects( - groupsRef.current.children, - true - ); - - if (intersects.length > 0) { - const clickedObject = intersects[0].object; - - const sphereIndex = zonePoints.findIndex((point: any) => - point.equals(clickedObject.position) - ); - if (sphereIndex !== -1) { - const zoneIndex = Math.floor(sphereIndex / 4); - const zoneUuid = zones[zoneIndex].zoneUuid; - handleDeleteZone(zoneUuid); - return; - } - } - } - - if (evt.button === 0) { - if (isDragging && draggedSphere) { - setIsDragging(false); - setDraggedSphere(null); - - const sphereIndex = zonePoints.findIndex((point: any) => point === draggedSphere); - if (sphereIndex !== -1) { - const zoneIndex = Math.floor(sphereIndex / 4); - - if (zoneIndex !== -1 && zones[zoneIndex]) { - updateZoneToBackend(zones[zoneIndex]); - } - } - } - } - }; - - const onMouseMove = () => { - if (!groupsRef.current) return; - if (isLeftMouseDown) { - drag = true; - } - raycaster.setFromCamera(pointer, camera); - - if (isDragging && draggedSphere) { - raycaster.setFromCamera(pointer, camera); - const intersectionPoint = new THREE.Vector3(); - const point = raycaster.ray.intersectPlane(plane, intersectionPoint); - if (point) { - draggedSphere.set(point.x, 0.15, point.z); - - const sphereIndex = zonePoints.findIndex((point: any) => point === draggedSphere); - if (sphereIndex !== -1) { - const zoneIndex = Math.floor(sphereIndex / 4); - const cornerIndex = sphereIndex % 4; - - const updatedZones = zones.map((zone: any, index: number) => { - if (index === zoneIndex) { - const updatedPoints = [...zone.points]; - updatedPoints[cornerIndex] = [point.x, 0.15, point.z]; - updatedPoints[4] = updatedPoints[0]; - return { ...zone, points: updatedPoints }; - } - return zone; - }); - - setZones(updatedZones); - } - } - } - }; - - const onContext = (event: any) => { - event.preventDefault(); - setStartPoint(null); - setEndPoint(null); - }; - - if (toolMode === "Zone" || toolMode === '2D-Delete' || toolMode === "move") { - canvasElement.addEventListener("mousedown", onMouseDown); - canvasElement.addEventListener("mouseup", onMouseUp); - canvasElement.addEventListener("mousemove", onMouseMove); - canvasElement.addEventListener("contextmenu", onContext); - } - return () => { - canvasElement.removeEventListener("mousedown", onMouseDown); - canvasElement.removeEventListener("mouseup", onMouseUp); - canvasElement.removeEventListener("mousemove", onMouseMove); - canvasElement.removeEventListener("contextmenu", onContext); - }; - }, [gl, camera, startPoint, toggleView, scene, toolMode, zones, isDragging, zonePoints, draggedSphere, activeLayer, raycaster, pointer, controls, plane, setZones, setZonePoints, addZoneToBackend, handleDeleteZone, updateZoneToBackend, selectedVersion?.versionId]); - - useFrame(() => { - if (!startPoint) return; - raycaster.setFromCamera(pointer, camera); - const intersectionPoint = new THREE.Vector3(); - const point = raycaster.ray.intersectPlane(plane, intersectionPoint); - if (point) { - setEndPoint(point); - } - }); - - return ( - - - {zones.map((zone: any) => ( - - {zone.points - .slice(0, -1) - .map((point: [number, number, number], index: number) => { - const nextPoint = zone.points[index + 1]; - - const point1 = new THREE.Vector3(point[0], point[1], point[2]); - const point2 = new THREE.Vector3( - nextPoint[0], - nextPoint[1], - nextPoint[2] - ); - - const planeWidth = point1.distanceTo(point2); - const planeHeight = CONSTANTS.zoneConfig.height; - - const midpoint = new THREE.Vector3( - (point1.x + point2.x) / 2, - CONSTANTS.zoneConfig.height / 2 + - (zone.layer - 1) * CONSTANTS.zoneConfig.height, - (point1.z + point2.z) / 2 - ); - - const angle = Math.atan2( - point2.z - point1.z, - point2.x - point1.x - ); - - return ( - - - - - ); - })} - {!toggleView && - (() => { - const points3D = zone.points || []; - const coords2D = points3D.map((p: any) => [p[0], p[2]]); - - // Ensure the polygon is closed - if ( - coords2D.length >= 4 && - (coords2D[0][0] !== coords2D[coords2D.length - 1][0] || - coords2D[0][1] !== coords2D[coords2D.length - 1][1]) - ) { - coords2D.push(coords2D[0]); - } - if (coords2D.length < 4) return null; - - const polygon = turf.polygon([coords2D]); - const center2D = turf.center(polygon).geometry.coordinates; - - // Calculate the average Y value - const sumY = points3D.reduce( - (sum: number, p: any) => sum + p[1], - 0 - ); - const avgY = points3D.length > 0 ? sumY / points3D.length : 0; - - const htmlPosition: [number, number, number] = [ - center2D[0], - avgY + (CONSTANTS.zoneConfig.height || 0) + 1.5, - center2D[1], - ]; - - return ( - -
{zone.zoneName}
- - ); - })()} -
- ))} -
- - {zones - .filter((zone: any) => zone.layer === activeLayer) - .map((zone: any) => ( - { - e.stopPropagation(); - if (toolMode === '2D-Delete') { - handleDeleteZone(zone.zoneUuid); - } - }} - /> - ))} - - - {zones.map((zone: any, index: any) => { - if (!toggleView) return null; - const points3D = zone.points; - const coords2D = points3D.map((p: any) => [p[0], p[2]]); - - if ( - coords2D.length < 4 || - coords2D[0][0] !== coords2D[coords2D.length - 1][0] || - coords2D[0][1] !== coords2D[coords2D.length - 1][1] - ) { - coords2D.push(coords2D[0]); - } - if (coords2D.length < 4) return null; - - const polygon = turf.polygon([coords2D]); - const center2D = turf.center(polygon).geometry.coordinates; - - const sumY = points3D.reduce((sum: number, p: any) => sum + p[1], 0); - const avgY = sumY / points3D.length; - - const area = computeArea(points3D, "zone"); - const formattedArea = `${area.toFixed(2)} m²`; - - const htmlPosition: [number, number, number] = [ - center2D[0], - avgY + CONSTANTS.zoneConfig.height, - center2D[1], - ]; - return ( - -
- {zone.zoneName} ({formattedArea}) -
- - ); - })} -
- - - {zones - .filter((zone: any) => zone.layer === activeLayer) - .flatMap((zone: any) => - zone.points.slice(0, 4).map((point: any, pointIndex: number) => ( - - - - )) - )} - - - {startPoint && endPoint && ( - - )} - -
- ); -}; - -export default ZoneGroup; +// import React, { useState, useEffect, useMemo, useRef } from "react"; +// import { Html, Line, Sphere } from "@react-three/drei"; +// import { useThree, useFrame } from "@react-three/fiber"; +// import * as THREE from "three"; +// import { +// useActiveLayer, +// useSocketStore, +// useToggleView, +// useToolMode, +// useRemovedLayer, +// useZones, +// useZonePoints, +// } from "../../../store/builder/store"; +// import { getZonesApi } from "../../../services/factoryBuilder/zones/getZonesApi"; + +// import * as CONSTANTS from "../../../types/world/worldConstants"; +// import * as turf from "@turf/turf"; +// import { computeArea } from "../functions/computeArea"; +// import { useSelectedZoneStore } from "../../../store/visualization/useZoneStore"; +// import { useParams } from "react-router-dom"; +// import { getUserData } from "../../../functions/getUserData"; +// import { useVersionContext } from "../version/versionContext"; + +// const ZoneGroup: React.FC = () => { +// const { camera, pointer, gl, raycaster, scene, controls } = useThree(); +// const [startPoint, setStartPoint] = useState(null); +// const [endPoint, setEndPoint] = useState(null); +// const { zones, setZones } = useZones(); +// const { zonePoints, setZonePoints } = useZonePoints(); +// const [isDragging, setIsDragging] = useState(false); +// const { selectedZone } = useSelectedZoneStore(); +// const [draggedSphere, setDraggedSphere] = useState(null); +// const plane = useMemo(() => new THREE.Plane(new THREE.Vector3(0, 1, 0), 0), []); +// const { toggleView } = useToggleView(); +// const { removedLayer, setRemovedLayer } = useRemovedLayer(); +// const { toolMode } = useToolMode(); +// const { activeLayer } = useActiveLayer(); +// const { socket } = useSocketStore(); +// const { selectedVersionStore } = useVersionContext(); +// const { selectedVersion } = selectedVersionStore(); +// const { projectId } = useParams(); +// const { userId, organization } = getUserData(); + +// const groupsRef = useRef(); + +// const zoneMaterial = useMemo( +// () => +// new THREE.ShaderMaterial({ +// side: THREE.DoubleSide, +// vertexShader: ` +// varying vec2 vUv; +// void main(){ +// gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +// vUv = uv; +// } +// `, +// fragmentShader: ` +// varying vec2 vUv; +// uniform vec3 uOuterColor; +// void main(){ +// float alpha = 1.0 - vUv.y; +// gl_FragColor = vec4(uOuterColor, alpha); +// } +// `, +// uniforms: { +// uOuterColor: { value: new THREE.Color(CONSTANTS.zoneConfig.color) }, +// }, +// transparent: true, +// depthWrite: false, +// }), +// [] +// ); + +// useEffect(() => { +// if (!selectedVersion) return; +// getZonesApi(organization, projectId, selectedVersion?.versionId || '').then((data) => { +// if (data && data.length > 0) { +// const fetchedZones = data.map((zone: any) => ({ +// zoneUuid: zone.zoneUuid, +// zoneName: zone.zoneName, +// points: zone.points, +// viewPortCenter: zone.viewPortCenter, +// viewPortposition: zone.viewPortposition, +// layer: zone.layer, +// })); + +// setZones(fetchedZones); + +// const fetchedPoints = data.flatMap((zone: any) => +// zone.points.slice(0, 4).map((point: [number, number, number]) => new THREE.Vector3(...point)) +// ); + +// setZonePoints(fetchedPoints); +// } else { +// setZones([]); +// } +// }).catch((err) => { +// console.error(err); +// }) +// }, [selectedVersion?.versionId]); + +// useEffect(() => { +// localStorage.setItem("zones", JSON.stringify(zones)); +// }, [zones]); + +// useEffect(() => { +// if (removedLayer) { +// const updatedZones = zones.filter((zone: any) => zone.layer !== removedLayer); +// setZones(updatedZones); + +// const updatedzonePoints = zonePoints.filter((_: any, index: any) => { +// const zoneIndex = Math.floor(index / 4); +// return zones[zoneIndex]?.layer !== removedLayer; +// }); +// setZonePoints(updatedzonePoints); + +// zones.filter((zone: any) => zone.layer === removedLayer).forEach((zone: any) => { deleteZoneFromBackend(zone.zoneUuid); }); + +// setRemovedLayer(null); +// } +// }, [removedLayer]); + +// useEffect(() => { +// if (toolMode !== "Zone") { +// setStartPoint(null); +// setEndPoint(null); +// } +// if (!toggleView) { +// setStartPoint(null); +// setEndPoint(null); +// } +// }, [toolMode, toggleView]); + +// // eslint-disable-next-line react-hooks/exhaustive-deps +// const addZoneToBackend = async (zone: { +// zoneUuid: string; +// zoneName: string; +// points: [number, number, number][]; +// layer: string; +// }) => { + +// const calculateCenter = (points: number[][]) => { +// if (!points || points.length === 0) return null; + +// let sumX = 0, sumY = 0, sumZ = 0; +// const numPoints = points.length; + +// points.forEach(([x, y, z]) => { +// sumX += x; +// sumY += y; +// sumZ += z; +// }); + +// return [sumX / numPoints, sumY / numPoints, sumZ / numPoints] as [ +// number, +// number, +// number +// ]; +// }; + +// const target: [number, number, number] | null = calculateCenter(zone.points); +// if (!target || zone.points.length < 4) return; +// const position = [target[0], 10, target[2]]; + +// const input = { +// userId: userId, +// versionId: selectedVersion?.versionId || '', +// projectId, +// organization, +// zoneData: { +// zoneName: zone.zoneName, +// zoneUuid: zone.zoneUuid, +// points: zone.points, +// viewPortCenter: target, +// viewPortposition: position, +// layer: zone.layer, +// }, +// }; + +// socket.emit("v1:zone:set", input); +// }; + +// // eslint-disable-next-line react-hooks/exhaustive-deps +// const updateZoneToBackend = async (zone: { +// zoneUuid: string; +// zoneName: string; +// points: [number, number, number][]; +// layer: string; +// }) => { + +// const calculateCenter = (points: number[][]) => { +// if (!points || points.length === 0) return null; + +// let sumX = 0, sumY = 0, sumZ = 0; +// const numPoints = points.length; + +// points.forEach(([x, y, z]) => { +// sumX += x; +// sumY += y; +// sumZ += z; +// }); + +// return [sumX / numPoints, sumY / numPoints, sumZ / numPoints] as [ +// number, +// number, +// number +// ]; +// }; + +// const target: [number, number, number] | null = calculateCenter(zone.points); +// if (!target || zone.points.length < 4) return; +// const position = [target[0], 10, target[2]]; + +// const input = { +// userId: userId, +// versionId: selectedVersion?.versionId || '', +// projectId, +// organization, +// zoneData: { +// zoneName: zone.zoneName, +// zoneUuid: zone.zoneUuid, +// points: zone.points, +// viewPortCenter: target, +// viewPortposition: position, +// layer: zone.layer, +// }, +// }; + +// socket.emit("v1:zone:set", input); +// }; + +// const deleteZoneFromBackend = async (zoneUuid: string) => { + +// const input = { +// userId: userId, +// versionId: selectedVersion?.versionId || '', +// projectId, +// organization, +// zoneUuid: zoneUuid, +// }; + +// socket.emit("v1:zone:delete", input); +// }; + +// // eslint-disable-next-line react-hooks/exhaustive-deps +// const handleDeleteZone = (zoneUuid: string) => { +// const updatedZones = zones.filter((zone: any) => zone.zoneUuid !== zoneUuid); +// setZones(updatedZones); + +// const zoneIndex = zones.findIndex((zone: any) => zone.zoneUuid === zoneUuid); +// if (zoneIndex !== -1) { +// const zonePointsToRemove = zonePoints.slice(zoneIndex * 4, zoneIndex * 4 + 4); +// zonePointsToRemove.forEach((point: any) => groupsRef.current.remove(point)); +// const updatedzonePoints = zonePoints.filter((_: any, index: any) => index < zoneIndex * 4 || index >= zoneIndex * 4 + 4); +// setZonePoints(updatedzonePoints); +// } +// deleteZoneFromBackend(zoneUuid); +// }; + +// useEffect(() => { +// if (!camera || !toggleView) return; +// const canvasElement = gl.domElement; + +// let drag = false; +// let isLeftMouseDown = false; + +// const onMouseDown = (evt: any) => { +// if (evt.button === 0) { +// isLeftMouseDown = true; +// drag = false; + +// raycaster.setFromCamera(pointer, camera); +// const intersects = raycaster.intersectObjects(groupsRef.current.children, true); + +// if (intersects.length > 0 && toolMode === "move") { +// const clickedObject = intersects[0].object; +// const sphereIndex = zonePoints.findIndex((point: any) => +// point.equals(clickedObject.position) +// ); +// if (sphereIndex !== -1) { +// (controls as any).enabled = false; +// setDraggedSphere(zonePoints[sphereIndex]); +// setIsDragging(true); +// } +// } +// } +// }; + +// const onMouseUp = (evt: any) => { +// if (evt.button === 0 && !drag && !isDragging && toolMode === 'Zone') { +// isLeftMouseDown = false; + +// if (!startPoint) { +// raycaster.setFromCamera(pointer, camera); +// const intersectionPoint = new THREE.Vector3(); +// const point = raycaster.ray.intersectPlane(plane, intersectionPoint); +// if (point) { +// setStartPoint(point); +// setEndPoint(null); +// } +// } else if (startPoint) { +// raycaster.setFromCamera(pointer, camera); +// const intersectionPoint = new THREE.Vector3(); +// const point = raycaster.ray.intersectPlane(plane, intersectionPoint); +// if (!point) return; + +// const points = [ +// [startPoint.x, 0.15, startPoint.z], +// [point.x, 0.15, startPoint.z], +// [point.x, 0.15, point.z], +// [startPoint.x, 0.15, point.z], +// [startPoint.x, 0.15, startPoint.z], +// ] as [number, number, number][]; + +// const zoneName = `Zone ${zones.length + 1}`; +// const zoneUuid = THREE.MathUtils.generateUUID(); +// const newZone = { +// zoneUuid, +// zoneName, +// points: points, +// layer: activeLayer, +// }; + +// const newZones = [...zones, newZone]; + +// setZones(newZones); + +// const newzonePoints = [ +// new THREE.Vector3(startPoint.x, 0.15, startPoint.z), +// new THREE.Vector3(point.x, 0.15, startPoint.z), +// new THREE.Vector3(point.x, 0.15, point.z), +// new THREE.Vector3(startPoint.x, 0.15, point.z), +// ]; + +// const updatedZonePoints = [...zonePoints, ...newzonePoints]; +// setZonePoints(updatedZonePoints); + +// addZoneToBackend(newZone); +// setStartPoint(null); +// setEndPoint(null); +// } +// } else if (evt.button === 0 && !drag && !isDragging && toolMode === '2D-Delete') { +// raycaster.setFromCamera(pointer, camera); +// const intersects = raycaster.intersectObjects( +// groupsRef.current.children, +// true +// ); + +// if (intersects.length > 0) { +// const clickedObject = intersects[0].object; + +// const sphereIndex = zonePoints.findIndex((point: any) => +// point.equals(clickedObject.position) +// ); +// if (sphereIndex !== -1) { +// const zoneIndex = Math.floor(sphereIndex / 4); +// const zoneUuid = zones[zoneIndex].zoneUuid; +// handleDeleteZone(zoneUuid); +// return; +// } +// } +// } + +// if (evt.button === 0) { +// if (isDragging && draggedSphere) { +// setIsDragging(false); +// setDraggedSphere(null); + +// const sphereIndex = zonePoints.findIndex((point: any) => point === draggedSphere); +// if (sphereIndex !== -1) { +// const zoneIndex = Math.floor(sphereIndex / 4); + +// if (zoneIndex !== -1 && zones[zoneIndex]) { +// updateZoneToBackend(zones[zoneIndex]); +// } +// } +// } +// } +// }; + +// const onMouseMove = () => { +// if (!groupsRef.current) return; +// if (isLeftMouseDown) { +// drag = true; +// } +// raycaster.setFromCamera(pointer, camera); + +// if (isDragging && draggedSphere) { +// raycaster.setFromCamera(pointer, camera); +// const intersectionPoint = new THREE.Vector3(); +// const point = raycaster.ray.intersectPlane(plane, intersectionPoint); +// if (point) { +// draggedSphere.set(point.x, 0.15, point.z); + +// const sphereIndex = zonePoints.findIndex((point: any) => point === draggedSphere); +// if (sphereIndex !== -1) { +// const zoneIndex = Math.floor(sphereIndex / 4); +// const cornerIndex = sphereIndex % 4; + +// const updatedZones = zones.map((zone: any, index: number) => { +// if (index === zoneIndex) { +// const updatedPoints = [...zone.points]; +// updatedPoints[cornerIndex] = [point.x, 0.15, point.z]; +// updatedPoints[4] = updatedPoints[0]; +// return { ...zone, points: updatedPoints }; +// } +// return zone; +// }); + +// setZones(updatedZones); +// } +// } +// } +// }; + +// const onContext = (event: any) => { +// event.preventDefault(); +// setStartPoint(null); +// setEndPoint(null); +// }; + +// if (toolMode === "Zone" || toolMode === '2D-Delete' || toolMode === "move") { +// canvasElement.addEventListener("mousedown", onMouseDown); +// canvasElement.addEventListener("mouseup", onMouseUp); +// canvasElement.addEventListener("mousemove", onMouseMove); +// canvasElement.addEventListener("contextmenu", onContext); +// } +// return () => { +// canvasElement.removeEventListener("mousedown", onMouseDown); +// canvasElement.removeEventListener("mouseup", onMouseUp); +// canvasElement.removeEventListener("mousemove", onMouseMove); +// canvasElement.removeEventListener("contextmenu", onContext); +// }; +// }, [gl, camera, startPoint, toggleView, scene, toolMode, zones, isDragging, zonePoints, draggedSphere, activeLayer, raycaster, pointer, controls, plane, setZones, setZonePoints, addZoneToBackend, handleDeleteZone, updateZoneToBackend, selectedVersion?.versionId]); + +// useFrame(() => { +// if (!startPoint) return; +// raycaster.setFromCamera(pointer, camera); +// const intersectionPoint = new THREE.Vector3(); +// const point = raycaster.ray.intersectPlane(plane, intersectionPoint); +// if (point) { +// setEndPoint(point); +// } +// }); + +// return ( +// +// +// {zones.map((zone: any) => ( +// +// {zone.points +// .slice(0, -1) +// .map((point: [number, number, number], index: number) => { +// const nextPoint = zone.points[index + 1]; + +// const point1 = new THREE.Vector3(point[0], point[1], point[2]); +// const point2 = new THREE.Vector3( +// nextPoint[0], +// nextPoint[1], +// nextPoint[2] +// ); + +// const planeWidth = point1.distanceTo(point2); +// const planeHeight = CONSTANTS.zoneConfig.height; + +// const midpoint = new THREE.Vector3( +// (point1.x + point2.x) / 2, +// CONSTANTS.zoneConfig.height / 2 + +// (zone.layer - 1) * CONSTANTS.zoneConfig.height, +// (point1.z + point2.z) / 2 +// ); + +// const angle = Math.atan2( +// point2.z - point1.z, +// point2.x - point1.x +// ); + +// return ( +// +// +// +// +// ); +// })} +// {!toggleView && +// (() => { +// const points3D = zone.points || []; +// const coords2D = points3D.map((p: any) => [p[0], p[2]]); + +// // Ensure the polygon is closed +// if ( +// coords2D.length >= 4 && +// (coords2D[0][0] !== coords2D[coords2D.length - 1][0] || +// coords2D[0][1] !== coords2D[coords2D.length - 1][1]) +// ) { +// coords2D.push(coords2D[0]); +// } +// if (coords2D.length < 4) return null; + +// const polygon = turf.polygon([coords2D]); +// const center2D = turf.center(polygon).geometry.coordinates; + +// // Calculate the average Y value +// const sumY = points3D.reduce( +// (sum: number, p: any) => sum + p[1], +// 0 +// ); +// const avgY = points3D.length > 0 ? sumY / points3D.length : 0; + +// const htmlPosition: [number, number, number] = [ +// center2D[0], +// avgY + (CONSTANTS.zoneConfig.height || 0) + 1.5, +// center2D[1], +// ]; + +// return ( +// +//
{zone.zoneName}
+// +// ); +// })()} +//
+// ))} +//
+// +// {zones +// .filter((zone: any) => zone.layer === activeLayer) +// .map((zone: any) => ( +// { +// e.stopPropagation(); +// if (toolMode === '2D-Delete') { +// handleDeleteZone(zone.zoneUuid); +// } +// }} +// /> +// ))} +// +// +// {zones.map((zone: any, index: any) => { +// if (!toggleView) return null; +// const points3D = zone.points; +// const coords2D = points3D.map((p: any) => [p[0], p[2]]); + +// if ( +// coords2D.length < 4 || +// coords2D[0][0] !== coords2D[coords2D.length - 1][0] || +// coords2D[0][1] !== coords2D[coords2D.length - 1][1] +// ) { +// coords2D.push(coords2D[0]); +// } +// if (coords2D.length < 4) return null; + +// const polygon = turf.polygon([coords2D]); +// const center2D = turf.center(polygon).geometry.coordinates; + +// const sumY = points3D.reduce((sum: number, p: any) => sum + p[1], 0); +// const avgY = sumY / points3D.length; + +// const area = computeArea(points3D, "zone"); +// const formattedArea = `${area.toFixed(2)} m²`; + +// const htmlPosition: [number, number, number] = [ +// center2D[0], +// avgY + CONSTANTS.zoneConfig.height, +// center2D[1], +// ]; +// return ( +// +//
+// {zone.zoneName} ({formattedArea}) +//
+// +// ); +// })} +//
+ +// +// {zones +// .filter((zone: any) => zone.layer === activeLayer) +// .flatMap((zone: any) => +// zone.points.slice(0, 4).map((point: any, pointIndex: number) => ( +// +// +// +// )) +// )} +// +// +// {startPoint && endPoint && ( +// +// )} +// +//
+// ); +// }; + +// export default ZoneGroup; diff --git a/app/src/modules/builder/wall/Instances/wallInstances.tsx b/app/src/modules/builder/wall/Instances/wallInstances.tsx index 267c91f..98d00fc 100644 --- a/app/src/modules/builder/wall/Instances/wallInstances.tsx +++ b/app/src/modules/builder/wall/Instances/wallInstances.tsx @@ -17,7 +17,7 @@ import texturePathDark from "../../../../assets/textures/floor/black.png"; function WallInstances() { const { wallStore } = useSceneContext(); const { walls } = wallStore(); - const { rooms } = useWallClassification(walls) + const { rooms } = useWallClassification(walls); const { toggleView } = useToggleView(); useEffect(() => { diff --git a/app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx b/app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx new file mode 100644 index 0000000..9828d14 --- /dev/null +++ b/app/src/modules/builder/zone/Instances/Instance/zone2DInstance.tsx @@ -0,0 +1,50 @@ +import { useMemo } from 'react'; +import { DoubleSide, Shape, Vector2 } from 'three'; +import { Extrude } from '@react-three/drei'; +import * as Constants from '../../../../../types/world/worldConstants'; + +function Zone2DInstance({ zone }: { zone: Zone }) { + const savedTheme: string | null = localStorage.getItem("theme"); + + const shape = useMemo(() => { + const shape = new Shape(); + const points = zone.points.map(p => new Vector2(p.position[0], p.position[2])); + if (points.length < 3) return null; + shape.moveTo(points[0].x, points[0].y); + for (let i = 1; i < points.length; i++) { + shape.lineTo(points[i].x, points[i].y); + } + return shape; + }, [zone]); + + if (!shape) return null; + + return ( + + + + + + ); +} + +export default Zone2DInstance; \ No newline at end of file diff --git a/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx b/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx new file mode 100644 index 0000000..5c29d5a --- /dev/null +++ b/app/src/modules/builder/zone/Instances/Instance/zoneInstance.tsx @@ -0,0 +1,73 @@ +import { useMemo } from 'react' +import { Color, DoubleSide, ShaderMaterial } from 'three'; +import { Vector3 } from 'three'; + +function ZoneInstance({ zone }: { zone: Zone }) { + const zoneLayer = zone.points[0].layer; + + const zoneMaterial = useMemo(() => { + return new ShaderMaterial({ + side: DoubleSide, + vertexShader: ` + varying vec2 vUv; + void main(){ + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); + vUv = uv; + } + `, + fragmentShader: ` + varying vec2 vUv; + uniform vec3 uOuterColor; + void main(){ + float alpha = 1.0 - vUv.y; + gl_FragColor = vec4(uOuterColor, alpha); + } + `, + uniforms: { + uOuterColor: { value: new Color(zone.zoneColor) }, + }, + transparent: true, + depthWrite: false, + }) + }, []); + + return ( + <> + + {zone.points.slice(0, -1).map((point, index: number) => { + const nextPoint = zone.points[index + 1]; + + 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 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); + + return ( + + + + + ); + })} + + + + ) +} + +export default ZoneInstance \ No newline at end of file diff --git a/app/src/modules/builder/zone/Instances/zoneInstances.tsx b/app/src/modules/builder/zone/Instances/zoneInstances.tsx new file mode 100644 index 0000000..48b426c --- /dev/null +++ b/app/src/modules/builder/zone/Instances/zoneInstances.tsx @@ -0,0 +1,132 @@ +import React, { useEffect, useMemo } from 'react'; +import { Vector3 } from 'three'; +import { Html } from '@react-three/drei'; +import { useSceneContext } from '../../../scene/sceneContext'; +import { useToggleView } from '../../../../store/builder/store'; +import Line from '../../line/line'; +import Point from '../../point/point'; +import ZoneInstance from './Instance/zoneInstance'; +import Zone2DInstance from './Instance/zone2DInstance'; + +function ZoneInstances() { + const { zoneStore } = useSceneContext(); + const { zones } = zoneStore(); + const { toggleView } = useToggleView(); + + useEffect(() => { + console.log('zones: ', zones); + }, [zones]); + + const allPoints = useMemo(() => { + const points: Point[] = []; + const seenUuids = new Set(); + + zones.forEach(zone => { + zone.points.forEach(point => { + if (!seenUuids.has(point.pointUuid)) { + seenUuids.add(point.pointUuid); + points.push(point); + } + }); + }); + + return points; + }, [zones]); + + const allLines = useMemo(() => { + const lines: { start: Point; end: Point; key: string }[] = []; + const seenUuids = new Set(); + + zones.forEach((zone) => { + const points = zone.points; + if (points.length < 2) return; + + for (let i = 0; i < points.length; i++) { + const current = points[i]; + const next = points[(i + 1) % points.length]; + const lineKey = `${current.pointUuid}-${next.pointUuid}`; + if (current.pointUuid !== next.pointUuid && !seenUuids.has(lineKey)) { + seenUuids.add(lineKey); + lines.push({ + start: current, + end: next, + key: lineKey + }); + } + } + }); + + return lines; + }, [zones]); + + return ( + <> + + {!toggleView && zones.length > 0 && ( + + {zones.map((zone) => ( + + ))} + + )} + + {toggleView && zones.length > 0 && ( + + {zones.map((zone) => ( + + ))} + + )} + + {toggleView && ( + <> + + {allPoints.map((point) => ( + + ))} + + + + + {allLines.map(({ start, end, key }) => ( + + ))} + + {allLines.map((line) => { + const { start, end, key } = line; + const textPosition = new Vector3().addVectors(new Vector3(...start.position), new Vector3(...end.position)).divideScalar(2); + const distance = new Vector3(...start.position).distanceTo(new Vector3(...end.position)); + + return ( + + {toggleView && + +
+ {distance.toFixed(2)} m +
+ + } +
+ ) + })} + +
+ + )} + + ) +} + +export default ZoneInstances \ No newline at end of file diff --git a/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx new file mode 100644 index 0000000..a237b59 --- /dev/null +++ b/app/src/modules/builder/zone/zoneCreator/zoneCreator.tsx @@ -0,0 +1,10 @@ +import React from 'react' + +function ZoneCreator() { + return ( + <> + + ) +} + +export default ZoneCreator \ No newline at end of file diff --git a/app/src/modules/builder/zone/zoneGroup.tsx b/app/src/modules/builder/zone/zoneGroup.tsx new file mode 100644 index 0000000..46bddb7 --- /dev/null +++ b/app/src/modules/builder/zone/zoneGroup.tsx @@ -0,0 +1,54 @@ +import { useEffect } from 'react'; +import { useToggleView } from '../../../store/builder/store'; +import { useBuilderStore } from '../../../store/builder/useBuilderStore'; +import { useVersionContext } from '../version/versionContext'; +import { useSceneContext } from '../../scene/sceneContext'; +import { useParams } from 'react-router-dom'; +import useModuleStore from '../../../store/useModuleStore'; +import ZoneCreator from './zoneCreator/zoneCreator'; +import ZoneInstances from './Instances/zoneInstances'; + +import { getZonesApi } from '../../../services/factoryBuilder/zone/getZonesApi'; + +function ZoneGroup() { + const { togglView } = useToggleView(); + const { setSelectedZone } = useBuilderStore(); + const { activeModule } = useModuleStore(); + const { selectedVersionStore } = useVersionContext(); + const { selectedVersion } = selectedVersionStore(); + const { zoneStore } = useSceneContext(); + const { setZones } = zoneStore(); + const { projectId } = useParams(); + + useEffect(() => { + if (togglView || activeModule !== 'builder') { + setSelectedZone(null); + } + }, [togglView, activeModule]) + + useEffect(() => { + if (projectId && selectedVersion) { + getZonesApi(projectId, selectedVersion?.versionId || '').then((zones) => { + if (zones && zones.length > 0) { + setZones(zones); + } else { + setZones([]); + } + }).catch((err) => { + console.log(err); + }) + } + }, [projectId, selectedVersion?.versionId]) + + return ( + <> + + + + + + + ) +} + +export default ZoneGroup \ No newline at end of file diff --git a/app/src/modules/market/MarketPlace.tsx b/app/src/modules/market/MarketPlace.tsx index 1bf446e..85720d2 100644 --- a/app/src/modules/market/MarketPlace.tsx +++ b/app/src/modules/market/MarketPlace.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from "react"; import FilterSearch from "./FilterSearch"; import CardsContainer from "./CardsContainer"; -import { getAssetImages } from "../../services/factoryBuilder/assest/assets/getAssetImages"; +import { getAssetImages } from "../../services/factoryBuilder/asset/assets/getAssetImages"; import SkeletonUI from "../../components/templates/SkeletonUI"; interface ModelData { CreatedBy: string; diff --git a/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx b/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx index 5e0333e..3b9d232 100644 --- a/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/copyPasteControls.tsx @@ -2,7 +2,7 @@ import * as THREE from "three"; import { useEffect, useMemo } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { useSelectedAssets, useSocketStore, useToggleView } from "../../../../store/builder/store"; -// import { setAssetsApi } from '../../../../services/factoryBuilder/assest/floorAsset/setAssetsApi'; +// import { setAssetsApi } from '../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; import * as Types from "../../../../types/world/worldTypes"; import { detectModifierKeys } from "../../../../utils/shortcutkeys/detectModifierKeys"; import { useParams } from "react-router-dom"; diff --git a/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx b/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx index ef56601..5194952 100644 --- a/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/duplicationControls.tsx @@ -2,7 +2,7 @@ import * as THREE from "three"; import { useEffect, useMemo } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { useSelectedAssets, useSocketStore, useToggleView } from "../../../../store/builder/store"; -// import { setAssetsApi } from '../../../../services/factoryBuilder/assest/floorAsset/setAssetsApi'; +// import { setAssetsApi } from '../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; import * as Types from "../../../../types/world/worldTypes"; import { detectModifierKeys } from "../../../../utils/shortcutkeys/detectModifierKeys"; import { useParams } from "react-router-dom"; diff --git a/app/src/modules/scene/controls/selectionControls/moveControls.tsx b/app/src/modules/scene/controls/selectionControls/moveControls.tsx index e246081..79cf195 100644 --- a/app/src/modules/scene/controls/selectionControls/moveControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/moveControls.tsx @@ -2,7 +2,7 @@ import * as THREE from "three"; import { useEffect, useMemo, useRef, useState } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { useSelectedAssets, useSocketStore, useToggleView, } from "../../../../store/builder/store"; -// import { setAssetsApi } from '../../../../services/factoryBuilder/assest/floorAsset/setAssetsApi'; +// import { setAssetsApi } from '../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; import * as Types from "../../../../types/world/worldTypes"; import { detectModifierKeys } from "../../../../utils/shortcutkeys/detectModifierKeys"; import { upsertProductOrEventApi } from "../../../../services/simulation/products/UpsertProductOrEventApi"; diff --git a/app/src/modules/scene/controls/selectionControls/rotateControls.tsx b/app/src/modules/scene/controls/selectionControls/rotateControls.tsx index 6592e72..216d4f7 100644 --- a/app/src/modules/scene/controls/selectionControls/rotateControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/rotateControls.tsx @@ -2,7 +2,7 @@ import * as THREE from "three"; import { useEffect, useMemo, useRef } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import { useSelectedAssets, useSocketStore, useToggleView } from "../../../../store/builder/store"; -// import { setAssetsApi } from '../../../../services/factoryBuilder/assest/floorAsset/setAssetsApi'; +// import { setAssetsApi } from '../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi'; import * as Types from "../../../../types/world/worldTypes"; import { upsertProductOrEventApi } from "../../../../services/simulation/products/UpsertProductOrEventApi"; import { useParams } from "react-router-dom"; diff --git a/app/src/modules/scene/controls/selectionControls/selectionControls.tsx b/app/src/modules/scene/controls/selectionControls/selectionControls.tsx index 1f26a6b..fdc6d9a 100644 --- a/app/src/modules/scene/controls/selectionControls/selectionControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/selectionControls.tsx @@ -5,7 +5,7 @@ import { SelectionHelper } from "./selectionHelper"; import { useFrame, useThree } from "@react-three/fiber"; import { useSelectedAssets, useSocketStore, useToggleView, useToolMode, } from "../../../../store/builder/store"; import BoundingBox from "./boundingBoxHelper"; -// import { deleteFloorItem } from '../../../../services/factoryBuilder/assest/floorAsset/deleteFloorItemApi'; +// import { deleteFloorItem } from '../../../../services/factoryBuilder/asset/floorAsset/deleteFloorItemApi'; import * as Types from "../../../../types/world/worldTypes"; import DuplicationControls from "./duplicationControls"; diff --git a/app/src/modules/scene/controls/transformControls/transformControls.tsx b/app/src/modules/scene/controls/transformControls/transformControls.tsx index 0b6a061..e0ce1cf 100644 --- a/app/src/modules/scene/controls/transformControls/transformControls.tsx +++ b/app/src/modules/scene/controls/transformControls/transformControls.tsx @@ -6,7 +6,7 @@ import { useThree } from "@react-three/fiber"; import { useEffect, useState } from "react"; import { detectModifierKeys } from "../../../../utils/shortcutkeys/detectModifierKeys"; import { upsertProductOrEventApi } from "../../../../services/simulation/products/UpsertProductOrEventApi"; -// import { setAssetsApi } from "../../../../services/factoryBuilder/assest/floorAsset/setAssetsApi"; +// import { setAssetsApi } from "../../../../services/factoryBuilder/asset/floorAsset/setAssetsApi"; import { useParams } from "react-router-dom"; import { useProductContext } from "../../../simulation/products/productContext"; import { getUserData } from "../../../../functions/getUserData"; diff --git a/app/src/services/factoryBuilder/assest/wallAsset/deleteWallItemApi.ts b/app/src/services/factoryBuilder/assest/wallAsset/deleteWallItemApi.ts deleted file mode 100644 index a959ebe..0000000 --- a/app/src/services/factoryBuilder/assest/wallAsset/deleteWallItemApi.ts +++ /dev/null @@ -1,42 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const deleteWallItem = async ( - organization: string, - modelUuid: string, - modelName: string -) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/wallItems/delete`, - { - 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 Wall Item"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to delete wall items"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/assest/wallAsset/getWallItemsApi.ts b/app/src/services/factoryBuilder/assest/wallAsset/getWallItemsApi.ts deleted file mode 100644 index ca72867..0000000 --- a/app/src/services/factoryBuilder/assest/wallAsset/getWallItemsApi.ts +++ /dev/null @@ -1,37 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const getWallItems = async (organization: string, projectId?: string, versionId?: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/wallItems/${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); - } - // console.log('response: ', response); - if (!response.ok) { - console.error("Failed to get Wall Items"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to get wall items"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/assest/wallAsset/setWallItemApi.ts b/app/src/services/factoryBuilder/assest/wallAsset/setWallItemApi.ts deleted file mode 100644 index 4a7aab4..0000000 --- a/app/src/services/factoryBuilder/assest/wallAsset/setWallItemApi.ts +++ /dev/null @@ -1,55 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const setWallItem = async ( - organization: string, - modelUuid: string, - modelName: string, - type: string, - csgposition: Object, - csgscale: Object, - position: Object, - quaternion: Object, - scale: Object -) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/V1/wallItems`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ - organization, - modelUuid, - modelName, - position, - type, - csgposition, - csgscale, - quaternion, - scale, - }), - }); - - 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 Wall Item"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to set wall items"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/assest/assets/getAssetImages.ts b/app/src/services/factoryBuilder/asset/assets/getAssetImages.ts similarity index 96% rename from app/src/services/factoryBuilder/assest/assets/getAssetImages.ts rename to app/src/services/factoryBuilder/asset/assets/getAssetImages.ts index faba588..7bc7fca 100644 --- a/app/src/services/factoryBuilder/assest/assets/getAssetImages.ts +++ b/app/src/services/factoryBuilder/asset/assets/getAssetImages.ts @@ -1,24 +1,24 @@ -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", - }, - } - ); - - if (!response.ok) { - console.error("Failed to fetch assets"); - } - - return await response.json(); - } catch (error: any) { - echo.error("Failed to get asset image"); - console.log(error.message); - } -}; +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", + }, + } + ); + + if (!response.ok) { + console.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/assest/assets/getAssetModel.ts b/app/src/services/factoryBuilder/asset/assets/getAssetModel.ts similarity index 96% rename from app/src/services/factoryBuilder/assest/assets/getAssetModel.ts rename to app/src/services/factoryBuilder/asset/assets/getAssetModel.ts index 91c33b3..27fe88a 100644 --- a/app/src/services/factoryBuilder/assest/assets/getAssetModel.ts +++ b/app/src/services/factoryBuilder/asset/assets/getAssetModel.ts @@ -1,29 +1,29 @@ -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", - }, - } - ); - - if (!response.ok) { - console.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"); - } - } -}; +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", + }, + } + ); + + if (!response.ok) { + console.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"); + } + } +}; diff --git a/app/src/services/factoryBuilder/assest/assets/getCategoryAsset.ts b/app/src/services/factoryBuilder/asset/assets/getCategoryAsset.ts similarity index 100% rename from app/src/services/factoryBuilder/assest/assets/getCategoryAsset.ts rename to app/src/services/factoryBuilder/asset/assets/getCategoryAsset.ts diff --git a/app/src/services/factoryBuilder/assest/floorAsset/deleteFloorItemApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorItemApi.ts similarity index 96% rename from app/src/services/factoryBuilder/assest/floorAsset/deleteFloorItemApi.ts rename to app/src/services/factoryBuilder/asset/floorAsset/deleteFloorItemApi.ts index a509909..1e66ec7 100644 --- a/app/src/services/factoryBuilder/assest/floorAsset/deleteFloorItemApi.ts +++ b/app/src/services/factoryBuilder/asset/floorAsset/deleteFloorItemApi.ts @@ -1,42 +1,42 @@ -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"); - } - } -}; +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/factoryBuilder/assest/floorAsset/getFloorItemsApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/getFloorItemsApi.ts similarity index 96% rename from app/src/services/factoryBuilder/assest/floorAsset/getFloorItemsApi.ts rename to app/src/services/factoryBuilder/asset/floorAsset/getFloorItemsApi.ts index 83038fc..5ead053 100644 --- a/app/src/services/factoryBuilder/assest/floorAsset/getFloorItemsApi.ts +++ b/app/src/services/factoryBuilder/asset/floorAsset/getFloorItemsApi.ts @@ -1,39 +1,39 @@ -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); - } - - // console.log('response: ', response); - if (!response.ok) { - console.error("Failed to get assets"); - } - - 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"); - } - } -}; +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); + } + + // console.log('response: ', response); + if (!response.ok) { + console.error("Failed to get assets"); + } + + 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"); + } + } +}; diff --git a/app/src/services/factoryBuilder/assest/floorAsset/setAssetsApi.ts b/app/src/services/factoryBuilder/asset/floorAsset/setAssetsApi.ts similarity index 100% rename from app/src/services/factoryBuilder/assest/floorAsset/setAssetsApi.ts rename to app/src/services/factoryBuilder/asset/floorAsset/setAssetsApi.ts diff --git a/app/src/services/factoryBuilder/lines/deleteLayerApi.ts b/app/src/services/factoryBuilder/lines/deleteLayerApi.ts deleted file mode 100644 index f271061..0000000 --- a/app/src/services/factoryBuilder/lines/deleteLayerApi.ts +++ /dev/null @@ -1,34 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const deleteLayer = async (organization: string, layer: number) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/deleteLayer`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ organization, layer }), - }); - 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 line"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to delete line"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/lines/deleteLineApi.ts b/app/src/services/factoryBuilder/lines/deleteLineApi.ts deleted file mode 100644 index bd04ee4..0000000 --- a/app/src/services/factoryBuilder/lines/deleteLineApi.ts +++ /dev/null @@ -1,34 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const deleteLineApi = async (organization: string, line: Object) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/deleteLine`, { - method: "DELETE", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ organization, line }), - }); - 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 line"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to delete line"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/lines/deletePointApi.ts b/app/src/services/factoryBuilder/lines/deletePointApi.ts deleted file mode 100644 index bc5b2d0..0000000 --- a/app/src/services/factoryBuilder/lines/deletePointApi.ts +++ /dev/null @@ -1,35 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const deletePointApi = async (organization: string, uuid: string) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/deletePoint`, { - method: "DELETE", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ organization, uuid }), - }); - 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 point"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to delete point"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/lines/getLinesApi.ts b/app/src/services/factoryBuilder/lines/getLinesApi.ts deleted file mode 100644 index ca520f1..0000000 --- a/app/src/services/factoryBuilder/lines/getLinesApi.ts +++ /dev/null @@ -1,38 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const getLines = async (organization: string, projectId?: string, versionId?: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/lines/${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 Lines"); - } - - const result = await response.json(); - // console.log('result: ', result); - return result; - } catch (error) { - echo.error("Failed to get Lines"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/lines/setLineApi.ts b/app/src/services/factoryBuilder/lines/setLineApi.ts deleted file mode 100644 index 9269514..0000000 --- a/app/src/services/factoryBuilder/lines/setLineApi.ts +++ /dev/null @@ -1,41 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const setLine = async ( - organization: string, - layer: number, - line: Object, - type: string -) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/setLine`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ organization, layer, line, type }), - }); - - 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 line"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to set line"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/lines/updatePointApi.ts b/app/src/services/factoryBuilder/lines/updatePointApi.ts deleted file mode 100644 index ae1b917..0000000 --- a/app/src/services/factoryBuilder/lines/updatePointApi.ts +++ /dev/null @@ -1,38 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const updatePoint = async ( - organization: string, - position: Object, - uuid: string -) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/updatePoint`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ organization, position, uuid }), - }); - 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 update point"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to update point"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/zone/deleteZoneApi.ts b/app/src/services/factoryBuilder/zone/deleteZoneApi.ts new file mode 100644 index 0000000..1f2b63b --- /dev/null +++ b/app/src/services/factoryBuilder/zone/deleteZoneApi.ts @@ -0,0 +1,39 @@ +let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; + +export const deleteZoneApi = async ( + projectId: string, + versionId: string, + zoneUuid: string +) => { + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V2/deleteZone`, { + method: "PATCH", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ projectId, versionId, zoneUuid }), + }); + + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + console.error("Failed to delete zone:", response.statusText); + } + + const result = await response.json(); + return result; + } catch (error) { + 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 new file mode 100644 index 0000000..df94fef --- /dev/null +++ b/app/src/services/factoryBuilder/zone/getZonesApi.ts @@ -0,0 +1,37 @@ +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/V2/zones/${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); + } + + if (!response.ok) { + console.error("Failed to get zones:", response.statusText); + } + + const result = await response.json(); + return result; + } catch (error) { + 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 new file mode 100644 index 0000000..eeab930 --- /dev/null +++ b/app/src/services/factoryBuilder/zone/upsertZoneApi.ts @@ -0,0 +1,39 @@ +let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; + +export const upsertWallApi = async ( + projectId: string, + versionId: string, + ZoneData: Zone +) => { + try { + const response = await fetch(`${url_Backend_dwinzo}/api/V2/UpsertZone`, { + method: "POST", + headers: { + Authorization: "Bearer ", + "Content-Type": "application/json", + token: localStorage.getItem("token") || "", + refresh_token: localStorage.getItem("refreshToken") || "", + }, + body: JSON.stringify({ projectId, versionId, ZoneData }), + }); + + const newAccessToken = response.headers.get("x-access-token"); + if (newAccessToken) { + localStorage.setItem("token", newAccessToken); + } + + if (!response.ok) { + console.error("Failed to upsert zone:", response.statusText); + } + + const result = await response.json(); + return result; + } catch (error) { + 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/factoryBuilder/zones/deleteZoneApi.ts b/app/src/services/factoryBuilder/zones/deleteZoneApi.ts deleted file mode 100644 index f0ee326..0000000 --- a/app/src/services/factoryBuilder/zones/deleteZoneApi.ts +++ /dev/null @@ -1,39 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const deleteZonesApi = async ( - userId: string, - organization: string, - zoneUuid: string -) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/setLine`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ userId, organization, zoneUuid }), - }); - 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 zone"); - } - - const result = await response.json(); - - return result; - } catch (error) { - 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/zones/getZonesApi.ts b/app/src/services/factoryBuilder/zones/getZonesApi.ts deleted file mode 100644 index 39f91a3..0000000 --- a/app/src/services/factoryBuilder/zones/getZonesApi.ts +++ /dev/null @@ -1,40 +0,0 @@ -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 getZonesApi = async (organization: string, projectId?: string, versionId?: string) => { - try { - const response = await fetch( - `${url_Backend_dwinzo}/api/V1/zones/${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 Zones"); - } - - const result = await response.json(); - // console.log('result:zone ', result); - - return result; - } catch (error) { - echo.error("Failed to get zone data"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/services/factoryBuilder/zones/setZonesApi.ts b/app/src/services/factoryBuilder/zones/setZonesApi.ts deleted file mode 100644 index b5aa678..0000000 --- a/app/src/services/factoryBuilder/zones/setZonesApi.ts +++ /dev/null @@ -1,38 +0,0 @@ -let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; - -export const setZonesApi = async ( - userId: string, - organization: string, - zoneData: any -) => { - try { - const response = await fetch(`${url_Backend_dwinzo}/api/v1/setLine`, { - method: "POST", - headers: { - Authorization: "Bearer ", - "Content-Type": "application/json", - token: localStorage.getItem("token") || "", - refresh_token: localStorage.getItem("refreshToken") || "", - }, - body: JSON.stringify({ userId, organization, zoneData }), - }); - 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 zone"); - } - - const result = await response.json(); - return result; - } catch (error) { - echo.error("Failed to zone data"); - if (error instanceof Error) { - console.log(error.message); - } else { - console.log("An unknown error occurred"); - } - } -}; diff --git a/app/src/store/builder/useBuilderStore.ts b/app/src/store/builder/useBuilderStore.ts index e7a60ca..066c2bb 100644 --- a/app/src/store/builder/useBuilderStore.ts +++ b/app/src/store/builder/useBuilderStore.ts @@ -24,6 +24,11 @@ interface BuilderState { sideMaterial: string; topMaterial: string; + // Zone Settings + selectedZone: Object3D | null; + zoneHeight: number; + zoneColor: string; + // Decal Settings selectedDecal: Object3D | null; @@ -59,6 +64,11 @@ interface BuilderState { setBevelStrength: (strength: number) => void; setFloorMaterial: (material: string, side: 'side' | 'top') => void; + // Setters - Zone + setSelectedZone: (zone: Object3D | null) => void; + setZoneHeight: (height: number) => void; + setZoneColor: (color: string) => void; + // Setters - Decal setSelectedDecal: (decal: Object3D | null) => void; @@ -103,6 +113,10 @@ export const useBuilderStore = create()( sideMaterial: 'Material 1', topMaterial: 'Default Material', + selectedZone: null, + zoneHeight: 7, + zoneColor: 'blue', + selectedDecal: null, selectedAisle: null, @@ -201,6 +215,26 @@ export const useBuilderStore = create()( }); }, + // === Setters: Zone === + + setSelectedZone: (zone: Object3D | null) => { + set((state) => { + state.selectedZone = zone; + }); + }, + + setZoneHeight: (height: number) => { + set((state) => { + state.zoneHeight = height; + }); + }, + + setZoneColor: (color: string) => { + set((state) => { + state.zoneColor = color; + }); + }, + // === Setters: Decal === setSelectedDecal: (decal: Object3D | null) => { diff --git a/app/src/store/builder/useZoneStore.ts b/app/src/store/builder/useZoneStore.ts index 3740c13..39ff2a0 100644 --- a/app/src/store/builder/useZoneStore.ts +++ b/app/src/store/builder/useZoneStore.ts @@ -7,11 +7,12 @@ interface ZoneStore { addZone: (zone: Zone) => void; updateZone: (uuid: string, updated: Partial) => void; setZoneName: (uuid: string, name: string) => void; + setZoneHeight: (uuid: string, height: number) => void; + setZoneColor: (uuid: string, color: string) => void; removeZone: (uuid: string) => void; removePointFromZones: (pointUuid: string) => void; clearZones: () => void; setViewPort: (uuid: string, position: [number, number, number], target: [number, number, number]) => void; - setColor: (uuid: string, color: string) => void; getZoneById: (uuid: string) => Zone | undefined; } @@ -43,6 +44,20 @@ export const createZoneStore = () => { } }), + setZoneHeight: (uuid, height) => set(state => { + const zone = state.zones.find(z => z.zoneUuid === uuid); + if (zone) { + zone.zoneHeight = height; + } + }), + + setZoneColor: (uuid, color) => set(state => { + const zone = state.zones.find(z => z.zoneUuid === uuid); + if (zone) { + zone.zoneColor = color; + } + }), + removeZone: (uuid) => set(state => { state.zones = state.zones.filter(z => z.zoneUuid !== uuid); }), @@ -65,13 +80,6 @@ export const createZoneStore = () => { } }), - setColor: (uuid, color) => set(state => { - const zone = state.zones.find(z => z.zoneUuid === uuid); - if (zone) { - zone.zoneColor = color; - } - }), - getZoneById: (uuid) => { return get().zones.find(z => z.zoneUuid === uuid); }, diff --git a/app/src/types/builderTypes.d.ts b/app/src/types/builderTypes.d.ts index c7eef96..d346547 100644 --- a/app/src/types/builderTypes.d.ts +++ b/app/src/types/builderTypes.d.ts @@ -131,6 +131,7 @@ type Floors = Floor[]; interface Zone { zoneUuid: string; zoneName: string; + zoneHeight: number; zoneColor: string; points: Point[]; viewPortTarget: [number, number, number];