import { useEffect } from "react"; import { useObjectPosition, useObjectRotation, useSelectedWallItem, useSocketStore, useWallItems, useSelectedItem, useToolMode, } from "../../../store/builder/store"; import { Csg } from "../csg/csg"; import * as Types from "../../../types/world/worldTypes"; import * as CONSTANTS from "../../../types/world/worldConstants"; import * as THREE from "three"; import { useThree } from "@react-three/fiber"; import handleMeshMissed from "../eventFunctions/handleMeshMissed"; import DeleteWallItems from "../geomentries/walls/deleteWallItems"; import loadInitialWallItems from "../IntialLoad/loadInitialWallItems"; import AddWallItems from "../geomentries/walls/addWallItems"; import useModuleStore from "../../../store/useModuleStore"; import { useParams } from "react-router-dom"; import { getUserData } from "../../../functions/getUserData"; import { useVersionContext } from "../version/versionContext"; const WallItemsGroup = ({ currentWallItem, hoveredDeletableWallItem, selectedItemsIndex, setSelectedItemsIndex, CSGGroup, }: any) => { const state = useThree(); const { socket } = useSocketStore(); const { pointer, camera, raycaster } = state; const { toolMode } = useToolMode(); const { wallItems, setWallItems } = useWallItems(); const { setObjectPosition } = useObjectPosition(); const { setObjectRotation } = useObjectRotation(); const { setSelectedWallItem } = useSelectedWallItem(); const { activeModule } = useModuleStore(); const { selectedItem } = useSelectedItem(); const { selectedVersionStore } = useVersionContext(); const { selectedVersion } = selectedVersionStore(); const { projectId } = useParams(); const { userId, organization } = getUserData(); useEffect(() => { // Load Wall Items from the backend if (!projectId || !selectedVersion) return; loadInitialWallItems(setWallItems, projectId, selectedVersion?.versionId); }, [selectedVersion?.versionId]); ////////// Update the Position value changes in the selected item ////////// useEffect(() => { const canvasElement = state.gl.domElement; function handlePointerMove(e: any) { if (selectedItemsIndex !== null && toolMode === 'cursor' && e.buttons === 1) { const Raycaster = state.raycaster; const intersects = Raycaster.intersectObjects(CSGGroup.current?.children[0].children!, true); const Object = intersects.find((child) => child.object.name.includes("WallRaycastReference")); if (Object) { (state.controls as any)!.enabled = false; setWallItems((prevItems: any) => { const updatedItems = [...prevItems]; let position: [number, number, number] = [0, 0, 0]; if (updatedItems[selectedItemsIndex].type === "fixed-move") { position = [ Object!.point.x, Math.floor(Object!.point.y / CONSTANTS.wallConfig.height) * CONSTANTS.wallConfig.height, Object!.point.z, ]; } else if (updatedItems[selectedItemsIndex].type === "free-move") { position = [Object!.point.x, Object!.point.y, Object!.point.z]; } requestAnimationFrame(() => { setObjectPosition(new THREE.Vector3(...position)); setObjectRotation({ x: THREE.MathUtils.radToDeg(Object!.object.rotation.x), y: THREE.MathUtils.radToDeg(Object!.object.rotation.y), z: THREE.MathUtils.radToDeg(Object!.object.rotation.z), }); }); updatedItems[selectedItemsIndex] = { ...updatedItems[selectedItemsIndex], position: position, quaternion: Object!.object.quaternion.clone() as Types.QuaternionType, }; return updatedItems; }); } } } async function handlePointerUp() { const Raycaster = state.raycaster; const intersects = Raycaster.intersectObjects( CSGGroup.current?.children[0].children!, true ); const Object = intersects.find((child) => child.object.name.includes("WallRaycastReference") ); if (Object) { if (selectedItemsIndex !== null) { let currentItem: any = null; setWallItems((prevItems: any) => { const updatedItems = [...prevItems]; const WallItemsForStorage = updatedItems.map((item) => { const { model, ...rest } = item; return { ...rest, modelUuid: model?.uuid, }; }); currentItem = updatedItems[selectedItemsIndex]; localStorage.setItem("WallItems", JSON.stringify(WallItemsForStorage)); return updatedItems; }); setTimeout(async () => { //REST // await setWallItem( // organization, // currentItem?.model?.uuid, // currentItem.modelName, // currentItem.assetId, // currentItem.type!, // currentItem.csgposition!, // currentItem.csgscale!, // currentItem.position, // currentItem.quaternion, // currentItem.scale!, // ) //SOCKET const data = { organization, modelUuid: currentItem.model?.uuid!, assetId: currentItem.assetId, modelName: currentItem.modelName!, type: currentItem.type!, csgposition: currentItem.csgposition!, csgscale: currentItem.csgscale!, position: currentItem.position!, quaternion: currentItem.quaternion, scale: currentItem.scale!, socketId: socket.id, versionId: selectedVersion?.versionId || '', projectId, userId }; // console.log('data: ', data); socket.emit("v1:wallItems:set", data); }, 0); (state.controls as any)!.enabled = true; } } } canvasElement.addEventListener("pointermove", handlePointerMove); canvasElement.addEventListener("pointerup", handlePointerUp); return () => { canvasElement.removeEventListener("pointermove", handlePointerMove); canvasElement.removeEventListener("pointerup", handlePointerUp); }; }, [selectedItemsIndex, selectedVersion?.versionId]); useEffect(() => { const canvasElement = state.gl.domElement; let drag = false; let isLeftMouseDown = false; const onMouseDown = (evt: any) => { if (evt.button === 0) { isLeftMouseDown = true; drag = false; } }; const onMouseUp = (evt: any) => { if (evt.button === 0) { isLeftMouseDown = false; if (!drag && toolMode === '3D-Delete' && activeModule === "builder") { DeleteWallItems( hoveredDeletableWallItem, setWallItems, wallItems, socket, projectId, selectedVersion?.versionId || '', ); } } }; const onMouseMove = () => { if (isLeftMouseDown) { drag = true; } }; const onDrop = (event: any) => { if (selectedItem.category !== 'Fenestration') return; pointer.x = (event.clientX / window.innerWidth) * 2 - 1; pointer.y = -(event.clientY / window.innerHeight) * 2 + 1; raycaster.setFromCamera(pointer, camera); if (selectedItem.id && selectedVersion && projectId) { if (selectedItem.subCategory) { AddWallItems( selectedItem, raycaster, CSGGroup, setWallItems, socket, projectId, selectedVersion?.versionId || '', ); } event.preventDefault(); } }; const onDragOver = (event: any) => { event.preventDefault(); }; canvasElement.addEventListener("mousedown", onMouseDown); canvasElement.addEventListener("mouseup", onMouseUp); canvasElement.addEventListener("mousemove", onMouseMove); canvasElement.addEventListener("drop", onDrop); canvasElement.addEventListener("dragover", onDragOver); return () => { canvasElement.removeEventListener("mousedown", onMouseDown); canvasElement.removeEventListener("mouseup", onMouseUp); canvasElement.removeEventListener("mousemove", onMouseMove); canvasElement.removeEventListener("drop", onDrop); canvasElement.removeEventListener("dragover", onDragOver); }; }, [toolMode, wallItems, selectedItem, camera, selectedVersion?.versionId]); useEffect(() => { if (toolMode && activeModule === "builder") { handleMeshMissed( currentWallItem, setSelectedWallItem, setSelectedItemsIndex ); setSelectedWallItem(null); setSelectedItemsIndex(null); } }, [toolMode]); return ( <> {wallItems.map((item: Types.WallItem, index: number) => ( ))} ); }; export default WallItemsGroup;