import { useThree } from '@react-three/fiber'; import { useEffect } from 'react' import useModuleStore from '../../../store/useModuleStore'; import { useSelectedItem, useSocketStore, useToggleView } from '../../../store/builder/store'; import { MathUtils, Vector3 } from 'three'; import { useSceneContext } from '../../scene/sceneContext'; import { useParams } from 'react-router-dom'; import { useVersionContext } from '../version/versionContext'; import { getUserData } from '../../../functions/getUserData'; import closestPointOnLineSegment from '../line/helpers/getClosestPointOnLineSegment'; // import { upsertWallAssetApi } from '../../../services/factoryBuilder/asset/wallAsset/upsertWallAssetApi'; function WallAssetCreator() { const { socket } = useSocketStore(); const { pointer, camera, raycaster, scene, gl } = useThree(); const { toggleView } = useToggleView(); const { activeModule } = useModuleStore(); const { wallAssetStore } = useSceneContext(); const { addWallAsset } = wallAssetStore(); const { selectedItem, setSelectedItem } = useSelectedItem(); const { selectedVersionStore } = useVersionContext(); const { selectedVersion } = selectedVersionStore(); const { userId, organization } = getUserData(); const { projectId } = useParams(); useEffect(() => { const canvasElement = gl.domElement; const onDrop = (event: DragEvent) => { if (!event.dataTransfer?.files[0]) return; if (selectedItem.id !== "" && event.dataTransfer?.files[0] && selectedItem.category === 'Fenestration') { pointer.x = (event.clientX / window.innerWidth) * 2 - 1; pointer.y = -(event.clientY / window.innerHeight) * 2 + 1; raycaster.setFromCamera(pointer, camera); const intersects = raycaster.intersectObjects(scene.children, true); const intersect = intersects.find((intersect) => intersect.object.name.includes('WallReference')); if (intersect) { const wall = intersect.object.userData as Wall; const closestPoint = closestPointOnLineSegment( new Vector3(intersect.point.x, 0, intersect.point.z), new Vector3(...wall.points[0].position), new Vector3(...wall.points[1].position) ) const wallRotation = intersect.object.rotation.clone(); const newWallAsset: WallAsset = { modelName: selectedItem.name, modelUuid: MathUtils.generateUUID(), wallUuid: wall.wallUuid, wallAssetType: selectedItem.subType, assetId: selectedItem.id, position: [closestPoint.x, selectedItem.subType === "fixedMove" ? 0 : intersect.point.y, closestPoint.z], rotation: [wallRotation.x, wallRotation.y, wallRotation.z], isLocked: false, isVisible: true, opacity: 1, }; addWallAsset(newWallAsset); if (projectId) { // API // upsertWallAssetApi(projectId, selectedVersion?.versionId || '', newWallAsset); // SOCKET const data = { wallAssetData: newWallAsset, projectId: projectId, versionId: selectedVersion?.versionId || '', userId: userId, organization: organization } socket.emit('v1:wall-asset:add', data); } } } }; if (!toggleView && activeModule === 'builder') { canvasElement.addEventListener('drop', onDrop); } return () => { canvasElement.removeEventListener('drop', onDrop); }; }, [gl, camera, toggleView, activeModule, socket, selectedItem, setSelectedItem]); return ( <> ) } export default WallAssetCreator