import React, { useEffect, useState, useRef } from "react"; import { usePlayButtonStore } from "../../store/usePlayButtonStore"; import Panel from "./widgets/panel/Panel"; import AddButtons from "./widgets/panel/AddButtons"; import { useSelectedZoneStore } from "../../store/visualization/useZoneStore"; import DisplayZone from "./zone/DisplayZone"; import useModuleStore from "../../store/useModuleStore"; import { getZone2dData } from "../../services/visulization/zone/getZoneData"; import SocketRealTimeViz from "./socket/realTimeVizSocket.dev"; import RenderOverlay from "../../components/templates/Overlay"; import ConfirmationPopup from "../../components/layout/confirmationPopup/ConfirmationPopup"; import DroppedObjects from "./widgets/floating/DroppedFloatingWidgets"; import EditWidgetOption from "../../components/ui/menu/EditWidgetOption"; import { useEditWidgetOptionsStore, useRightClickSelected, useRightSelected, } from "../../store/visualization/useZone3DWidgetStore"; import OuterClick from "../../utils/outerClick"; import { useWidgetStore } from "../../store/useWidgetStore"; import { useParams } from "react-router-dom"; import { getUserData } from "../../functions/getUserData"; type Side = "top" | "bottom" | "left" | "right"; type FormattedZoneData = Record< string, { activeSides: Side[]; panelOrder: Side[]; points: []; lockedPanels: Side[]; zoneUuid: string; zoneViewPortTarget: number[]; zoneViewPortPosition: number[]; widgets: Widget[]; } >; type Widget = { id: string; type: string; title: string; panel: Side; data: any; }; // Define the type for HiddenPanels, where keys are zone IDs and values are arrays of hidden sides interface HiddenPanels { [zoneUuid: string]: Side[]; } const RealTimeVisulization: React.FC = () => { const [hiddenPanels, setHiddenPanels] = React.useState({}); const containerRef = useRef(null); const { isPlaying } = usePlayButtonStore(); const { activeModule } = useModuleStore(); const [zonesData, setZonesData] = useState({}); const { selectedZone, setSelectedZone } = useSelectedZoneStore(); const { setRightSelect } = useRightSelected(); const { editWidgetOptions, setEditWidgetOptions } = useEditWidgetOptionsStore(); const { rightClickSelected, setRightClickSelected } = useRightClickSelected(); const [openConfirmationPopup, setOpenConfirmationPopup] = useState(false); const { setSelectedChartId } = useWidgetStore(); const [waitingPanels, setWaitingPanels] = useState(null); const { projectId } = useParams(); OuterClick({ contextClassName: [ "chart-container", "floating", "sidebar-right-wrapper", "card", "dropdown-menu", "dropdown-options", ], setMenuVisible: () => setSelectedChartId(null), }); const { userName, userId, organization, email } = getUserData(); useEffect(() => { async function GetZoneData() { try { const response = await getZone2dData(organization, projectId); // console.log('responseRt: ', response); if (!Array.isArray(response)) { return; } const formattedData = response.reduce( (acc, zone) => { acc[zone.zoneName] = { activeSides: [], panelOrder: [], lockedPanels: [], points: zone.points, zoneUuid: zone.zoneUuid, zoneViewPortTarget: zone.viewPortCenter, zoneViewPortPosition: zone.viewPortposition, widgets: [], }; return acc; }, {} ); setZonesData(formattedData); } catch (error) { echo.error("Failed to fetch zone data"); console.log(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 || [], points: selectedZone.points || [], zoneUuid: selectedZone.zoneUuid || "", zoneViewPortTarget: selectedZone.zoneViewPortTarget || [], zoneViewPortPosition: selectedZone.zoneViewPortPosition || [], widgets: selectedZone.widgets || [], }, }; }); }, [selectedZone]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { const editWidgetOptions = document.querySelector( ".editWidgetOptions-wrapper" ); if ( editWidgetOptions && !editWidgetOptions.contains(event.target as Node) ) { setRightClickSelected(null); setRightSelect(null); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [setRightClickSelected, setRightSelect]); const [canvasDimensions, setCanvasDimensions] = useState({ width: 0, height: 0, }); useEffect(() => { const canvas = document.getElementById("work-space-three-d-canvas"); if (!canvas) return; const updateCanvasDimensions = () => { const rect = canvas.getBoundingClientRect(); setCanvasDimensions({ width: rect.width, height: rect.height, }); }; updateCanvasDimensions(); const resizeObserver = new ResizeObserver(updateCanvasDimensions); resizeObserver.observe(canvas); return () => resizeObserver.unobserve(canvas); }, []); return ( <>
{openConfirmationPopup && ( console.log("Confirmed")} onCancel={() => setOpenConfirmationPopup(false)} /> )} {activeModule === "visualization" && selectedZone.zoneName !== "" && ( )} {activeModule === "visualization" && } {activeModule === "visualization" && editWidgetOptions && rightClickSelected && ( { setRightSelect(e); setEditWidgetOptions(false); }} /> )} {activeModule === "visualization" && ( <> {!isPlaying && selectedZone?.zoneName !== "" && ( )} )}
); }; export default RealTimeVisulization;