import React, { useEffect, useState, useRef } from "react"; import { usePlayButtonStore } from "../../../store/usePlayButtonStore"; import Panel from "./Panel"; import AddButtons from "./AddButtons"; import { useSelectedZoneStore } from "../../../store/useZoneStore"; import DisplayZone from "./DisplayZone"; import Scene from "../../../modules/scene/scene"; import useModuleStore from "../../../store/useModuleStore"; import DroppedObjects from "./DroppedFloatingWidgets"; import { useDroppedObjectsStore } from "../../../store/useDroppedObjectsStore"; import { useAsset3dWidget, useWidgetSubOption, useZones, } from "../../../store/store"; import { getZone2dData } from "../../../services/realTimeVisulization/zoneData/getZoneData"; import { generateUniqueId } from "../../../functions/generateUniqueId"; import { determinePosition } from "./functions/determinePosition"; import { addingFloatingWidgets } from "../../../services/realTimeVisulization/zoneData/addFloatingWidgets"; type Side = "top" | "bottom" | "left" | "right"; type FormattedZoneData = Record< string, { activeSides: Side[]; panelOrder: Side[]; lockedPanels: Side[]; zoneId: string; zoneViewPortTarget: number[]; zoneViewPortPosition: number[]; widgets: Widget[]; } >; type Widget = { id: string; type: string; title: string; panel: Side; data: any; }; const RealTimeVisulization: React.FC = () => { const [hiddenPanels, setHiddenPanels] = React.useState([]); const containerRef = useRef(null); const { isPlaying } = usePlayButtonStore(); const { activeModule } = useModuleStore(); const [droppedObjects, setDroppedObjects] = useState([]); const [zonesData, setZonesData] = useState({}); const { selectedZone, setSelectedZone } = useSelectedZoneStore(); const { zones } = useZones(); const [floatingWidgets, setFloatingWidgets] = useState< Record >({}); const { widgetSelect, setWidgetSelect } = useAsset3dWidget(); const { widgetSubOption, setWidgetSubOption } = useWidgetSubOption(); useEffect(() => { async function GetZoneData() { const email = localStorage.getItem("email") || ""; const organization = email?.split("@")[1]?.split(".")[0]; try { const response = await getZone2dData(organization); console.log('response: ', response); if (!Array.isArray(response)) { return; } const formattedData = response.reduce( (acc, zone) => { acc[zone.zoneName] = { activeSides: [], panelOrder: [], lockedPanels: [], zoneId: zone.zoneId, zoneViewPortTarget: zone.viewPortCenter, zoneViewPortPosition: zone.viewPortposition, widgets: [], }; return acc; }, {} ); setZonesData(formattedData); } catch (error) { } } GetZoneData(); }, [activeModule]); // Removed `zones` from dependencies useEffect(() => { setZonesData((prev) => { if (!selectedZone) return prev; return { ...prev, [selectedZone.zoneName]: { ...prev[selectedZone.zoneName], // Keep existing properties activeSides: selectedZone.activeSides || [], panelOrder: selectedZone.panelOrder || [], lockedPanels: selectedZone.lockedPanels || [], zoneId: selectedZone.zoneId || "", zoneViewPortTarget: selectedZone.zoneViewPortTarget || [], zoneViewPortPosition: selectedZone.zoneViewPortPosition || [], widgets: selectedZone.widgets || [], }, }; }); }, [selectedZone]); // useEffect(() => {}, [floatingWidgets]); const handleDrop = async (event: React.DragEvent) => { try { event.preventDefault(); const email = localStorage.getItem("email") || ""; const organization = email?.split("@")[1]?.split(".")[0]; const data = event.dataTransfer.getData("text/plain"); // if (widgetSelect !== "") return; if (widgetSubOption === "3D") return; if (!data || selectedZone.zoneName === "") return; const droppedData = JSON.parse(data); const canvasElement = document.getElementById("real-time-vis-canvas"); if (!canvasElement) throw new Error("Canvas element not found"); const canvasRect = canvasElement.getBoundingClientRect(); const relativeX = event.clientX - canvasRect.left; const relativeY = event.clientY - canvasRect.top; const newPosition = determinePosition(canvasRect, relativeX, relativeY) console.log('newPosition: ', newPosition); const newObject = { ...droppedData, id: generateUniqueId(), position: determinePosition(canvasRect, relativeX, relativeY), }; console.log('newObject: ', newObject); let response = await addingFloatingWidgets( selectedZone.zoneId, organization, newObject ); // Only set zone if it’s not already in the store (prevents overwriting objects) const existingZone = useDroppedObjectsStore.getState().zones[selectedZone.zoneName]; if (!existingZone) { useDroppedObjectsStore .getState() .setZone(selectedZone.zoneName, selectedZone.zoneId); } // Add the dropped object to the zone if the API call is successful if (response.message === "FloatWidget created successfully") { useDroppedObjectsStore .getState() .addObject(selectedZone.zoneName, newObject); } // Update floating widgets state setFloatingWidgets((prevWidgets) => ({ ...prevWidgets, [selectedZone.zoneName]: { ...prevWidgets[selectedZone.zoneName], zoneName: selectedZone.zoneName, zoneId: selectedZone.zoneId, objects: [ ...(prevWidgets[selectedZone.zoneName]?.objects || []), newObject, ], }, })); } catch (error) { } }; return (
handleDrop(event)} onDragOver={(event) => event.preventDefault()} >
{activeModule === "visualization" && selectedZone.zoneName !== "" && } {/* */} {activeModule === "visualization" && ( <> {!isPlaying && selectedZone?.zoneName !== "" && ( )} )}
); }; export default RealTimeVisulization;