refactor: Update zone handling by integrating zoneStore in multiple components and removing unused zones state

This commit is contained in:
2025-07-03 17:55:19 +05:30
parent 3f59f5d2dd
commit 46ff5c0208
10 changed files with 80 additions and 56 deletions

View File

@@ -12,13 +12,17 @@ import { zoneCameraUpdate } from "../../../../services/visulization/zone/zoneCam
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { getUserData } from "../../../../functions/getUserData"; import { getUserData } from "../../../../functions/getUserData";
import { useVersionContext } from "../../../../modules/builder/version/versionContext"; import { useVersionContext } from "../../../../modules/builder/version/versionContext";
import { useSceneContext } from "../../../../modules/scene/sceneContext";
const ZoneProperties: React.FC = () => { const ZoneProperties: React.FC = () => {
const { Edit, setEdit } = useEditPosition(); const { Edit, setEdit } = useEditPosition();
const { selectedZone, setSelectedZone } = useSelectedZoneStore(); const { selectedZone, setSelectedZone } = useSelectedZoneStore();
const { zonePosition, setZonePosition } = usezonePosition(); const { zonePosition, setZonePosition } = usezonePosition();
const { zoneTarget, setZoneTarget } = usezoneTarget(); const { zoneTarget, setZoneTarget } = usezoneTarget();
const { zones, setZones } = useZones(); // const { zones, setZones } = useZones();
const { assetStore, zoneStore } = useSceneContext();
const { zones, setZoneName } = zoneStore()
const { projectId } = useParams(); const { projectId } = useParams();
const { userName, userId, organization, email } = getUserData(); const { userName, userId, organization, email } = getUserData();
const { selectedVersionStore } = useVersionContext(); const { selectedVersionStore } = useVersionContext();
@@ -34,10 +38,11 @@ const ZoneProperties: React.FC = () => {
let zonesdata = { let zonesdata = {
zoneUuid: selectedZone.zoneUuid, zoneUuid: selectedZone.zoneUuid,
viewPortposition: zonePosition, viewPortPosition: zonePosition,
viewPortCenter: zoneTarget, viewPortTarget: zoneTarget,
}; };
let response = await zoneCameraUpdate(zonesdata, organization, projectId, selectedVersion?.versionId || ""); let response = await zoneCameraUpdate(zonesdata, organization, projectId, selectedVersion?.versionId || "");
// console.log('response: ', response); // console.log('response: ', response);
if (response.message === "zone updated") { if (response.message === "zone updated") {
@@ -63,13 +68,14 @@ const ZoneProperties: React.FC = () => {
let response = await zoneCameraUpdate(zonesdata, organization, projectId, selectedVersion?.versionId || ""); let response = await zoneCameraUpdate(zonesdata, organization, projectId, selectedVersion?.versionId || "");
if (response.message === "zone updated") { if (response.message === "zone updated") {
setSelectedZone((prev) => ({ ...prev, zoneName: newName })); setSelectedZone((prev) => ({ ...prev, zoneName: newName }));
setZones((prevZones: any[]) => setZoneName(selectedZone.zoneUuid, newName)
prevZones.map((zone) => // setZones((prevZones: any[]) =>
zone.zoneUuid === selectedZone.zoneUuid // prevZones.map((zone) =>
? { ...zone, zoneName: newName } // zone.zoneUuid === selectedZone.zoneUuid
: zone // ? { ...zone, zoneName: newName }
) // : zone
); // )
// );
} else { } else {
// console.log(response?.message); // console.log(response?.message);
} }
@@ -81,6 +87,7 @@ const ZoneProperties: React.FC = () => {
setSelectedZone((prev) => ({ ...prev, [key]: newValue })); setSelectedZone((prev) => ({ ...prev, [key]: newValue }));
} }
const checkZoneNameDuplicate = (name: string) => { const checkZoneNameDuplicate = (name: string) => {
console.log('zones: ', zones);
return zones.some( return zones.some(
(zone: any) => (zone: any) =>
zone.zoneName?.trim().toLowerCase() === name?.trim().toLowerCase() && zone.zoneName?.trim().toLowerCase() === name?.trim().toLowerCase() &&

View File

@@ -44,15 +44,18 @@ const DropDownList: React.FC<DropDownListProps> = ({
remove, remove,
}) => { }) => {
const [isOpen, setIsOpen] = useState<boolean>(defaultOpen); const [isOpen, setIsOpen] = useState<boolean>(defaultOpen);
const { zones } = useZones(); // const { zones } = useZones();
const handleToggle = () => { const handleToggle = () => {
setIsOpen((prev) => !prev); // Toggle the state setIsOpen((prev) => !prev); // Toggle the state
}; };
const [zoneDataList, setZoneDataList] = useState<ZoneData[]>([]); const [zoneDataList, setZoneDataList] = useState<ZoneData[]>([]);
const { assetStore } = useSceneContext(); // const { assetStore } = useSceneContext();
const { assetStore, zoneStore } = useSceneContext();
const { assets } = assetStore(); const { assets } = assetStore();
const { zones } = zoneStore()
const isPointInsidePolygon = ( const isPointInsidePolygon = (
point: [number, number], point: [number, number],
@@ -76,7 +79,7 @@ const DropDownList: React.FC<DropDownListProps> = ({
}; };
useEffect(() => { useEffect(() => {
const updatedZoneList: ZoneData[] = zones?.map((zone: Zone) => { const updatedZoneList: ZoneData[] = zones?.map((zone: any) => {
const polygon2D = zone.points.map((p: [number, number, number]) => [ const polygon2D = zone.points.map((p: [number, number, number]) => [
p[0], p[0],
p[2], p[2],

View File

@@ -46,7 +46,7 @@ const List: React.FC<ListProps> = ({ items = [], remove }) => {
const { activeModule } = useModuleStore(); const { activeModule } = useModuleStore();
const { selectedZone, setSelectedZone } = useSelectedZoneStore(); const { selectedZone, setSelectedZone } = useSelectedZoneStore();
const { zoneAssetId, setZoneAssetId } = useZoneAssetId(); const { zoneAssetId, setZoneAssetId } = useZoneAssetId();
const { zones, setZones } = useZones();
const { setSubModule } = useSubModuleStore(); const { setSubModule } = useSubModuleStore();
const [expandedZones, setExpandedZones] = useState<Record<string, boolean>>({}); const [expandedZones, setExpandedZones] = useState<Record<string, boolean>>({});
const { projectId } = useParams(); const { projectId } = useParams();
@@ -55,6 +55,8 @@ const List: React.FC<ListProps> = ({ items = [], remove }) => {
const { organization } = getUserData(); const { organization } = getUserData();
const { selectedVersionStore } = useVersionContext(); const { selectedVersionStore } = useVersionContext();
const { selectedVersion } = selectedVersionStore(); const { selectedVersion } = selectedVersionStore();
const { zoneStore } = useSceneContext();
const { zones, setZoneName } = zoneStore()
useEffect(() => { useEffect(() => {
useSelectedZoneStore.getState().setSelectedZone({ useSelectedZoneStore.getState().setSelectedZone({
@@ -92,8 +94,8 @@ const List: React.FC<ListProps> = ({ items = [], remove }) => {
lockedPanels: response?.lockedPanels ?? [], lockedPanels: response?.lockedPanels ?? [],
widgets: response?.widgets ?? [], widgets: response?.widgets ?? [],
zoneUuid: response?.zoneUuid, zoneUuid: response?.zoneUuid,
zoneViewPortTarget: response?.viewPortCenter ?? [], zoneViewPortTarget: response?.viewPortTarget ?? [],
zoneViewPortPosition: response?.viewPortposition ?? [], zoneViewPortPosition: response?.viewPortPosition ?? [],
}); });
} catch (error) { } catch (error) {
echo.error("Failed to select zone"); echo.error("Failed to select zone");
@@ -123,13 +125,14 @@ const List: React.FC<ListProps> = ({ items = [], remove }) => {
const response = await zoneCameraUpdate(zonesdata, organization, projectId, selectedVersion?.versionId || ""); const response = await zoneCameraUpdate(zonesdata, organization, projectId, selectedVersion?.versionId || "");
if (response.message === "zone updated") { if (response.message === "zone updated") {
setSelectedZone((prev) => ({ ...prev, zoneName: newName })); setSelectedZone((prev) => ({ ...prev, zoneName: newName }));
setZones((prevZones: any[]) => setZoneName(selectedZone.zoneUuid, newName)
prevZones.map((zone) => // setZones((prevZones: any[]) =>
zone.zoneUuid === selectedZone.zoneUuid // prevZones.map((zone) =>
? { ...zone, zoneName: newName } // zone.zoneUuid === selectedZone.zoneUuid
: zone // ? { ...zone, zoneName: newName }
) // : zone
); // )
// );
} }
} }

View File

@@ -20,7 +20,7 @@ function ZoneCreator() {
const { activeLayer } = useActiveLayer(); const { activeLayer } = useActiveLayer();
const { socket } = useSocketStore(); const { socket } = useSocketStore();
const { zoneStore } = useSceneContext(); const { zoneStore } = useSceneContext();
const { addZone, getZonePointById, getZoneByPoints } = zoneStore(); const { zones, addZone, getZonePointById, getZoneByPoints } = zoneStore();
const drag = useRef(false); const drag = useRef(false);
const isLeftMouseDown = useRef(false); const isLeftMouseDown = useRef(false);
const { selectedVersionStore } = useVersionContext(); const { selectedVersionStore } = useVersionContext();
@@ -32,6 +32,7 @@ function ZoneCreator() {
const [isCreating, setIsCreating] = useState(false); const [isCreating, setIsCreating] = useState(false);
const { zoneColor, zoneHeight, snappedPosition, snappedPoint, setSnappedPoint, setSnappedPosition } = useBuilderStore(); const { zoneColor, zoneHeight, snappedPosition, snappedPoint, setSnappedPoint, setSnappedPosition } = useBuilderStore();
useEffect(() => { useEffect(() => {
const canvasElement = gl.domElement; const canvasElement = gl.domElement;
@@ -92,7 +93,7 @@ function ZoneCreator() {
if (tempPoints.length > 2 && isCreating && snappedPoint && snappedPoint.pointUuid === tempPoints[0].pointUuid) { if (tempPoints.length > 2 && isCreating && snappedPoint && snappedPoint.pointUuid === tempPoints[0].pointUuid) {
const zone: Zone = { const zone: Zone = {
zoneUuid: THREE.MathUtils.generateUUID(), zoneUuid: THREE.MathUtils.generateUUID(),
zoneName: "Zone", zoneName: `Zone `,
points: tempPoints, points: tempPoints,
zoneColor, zoneColor,
zoneHeight, zoneHeight,

View File

@@ -17,6 +17,7 @@ import { useWidgetStore } from "../../store/useWidgetStore";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
import { getUserData } from "../../functions/getUserData"; import { getUserData } from "../../functions/getUserData";
import { useVersionContext } from "../builder/version/versionContext"; import { useVersionContext } from "../builder/version/versionContext";
import { useSceneContext } from "../scene/sceneContext";
type Side = "top" | "bottom" | "left" | "right"; type Side = "top" | "bottom" | "left" | "right";
@@ -28,6 +29,7 @@ type FormattedZoneData = Record<
points: []; points: [];
lockedPanels: Side[]; lockedPanels: Side[];
zoneUuid: string; zoneUuid: string;
zoneName: string;
zoneViewPortTarget: number[]; zoneViewPortTarget: number[];
zoneViewPortPosition: number[]; zoneViewPortPosition: number[];
widgets: Widget[]; widgets: Widget[];
@@ -64,6 +66,9 @@ const RealTimeVisulization: React.FC = () => {
const { selectedVersion } = selectedVersionStore(); const { selectedVersion } = selectedVersionStore();
const { projectId } = useParams(); const { projectId } = useParams();
const navigate = useNavigate(); const navigate = useNavigate();
const { zoneStore } = useSceneContext();
const { zones } = zoneStore();
OuterClick({ OuterClick({
contextClassName: [ contextClassName: [
@@ -82,6 +87,7 @@ const RealTimeVisulization: React.FC = () => {
useEffect(() => { useEffect(() => {
if (!projectId || !selectedVersion) return; if (!projectId || !selectedVersion) return;
getZone2dData(organization, projectId, selectedVersion?.versionId || '').then((response) => { getZone2dData(organization, projectId, selectedVersion?.versionId || '').then((response) => {
// console.log('response: ', response);
if (!response) return; if (!response) return;
// if (response.status === 401) { // if (response.status === 401) {
// console.log("force logout"); // console.log("force logout");
@@ -94,19 +100,21 @@ const RealTimeVisulization: React.FC = () => {
const formattedData = response.reduce<FormattedZoneData>( const formattedData = response.reduce<FormattedZoneData>(
(acc, zone) => { (acc, zone) => {
acc[zone.zoneName] = { acc[zone.zoneUuid] = {
activeSides: [], activeSides: [],
panelOrder: [], panelOrder: [],
lockedPanels: [], lockedPanels: [],
points: zone.points, points: zone.points,
zoneUuid: zone.zoneUuid, zoneUuid: zone.zoneUuid,
zoneViewPortTarget: zone.viewPortCenter, zoneName: zone.zoneName,
zoneViewPortPosition: zone.viewPortposition, zoneViewPortTarget: zone.viewPortTarget,
zoneViewPortPosition: zone.viewPortPosition,
widgets: [], widgets: [],
}; };
return acc; return acc;
}, {} }, {}
); );
// console.log('formattedData: ', formattedData);
setZonesData(formattedData); setZonesData(formattedData);
}) })
@@ -119,13 +127,14 @@ const RealTimeVisulization: React.FC = () => {
if (!selectedZone) return prev; if (!selectedZone) return prev;
return { return {
...prev, ...prev,
[selectedZone.zoneName]: { [selectedZone.zoneUuid]: {
...prev[selectedZone.zoneName], // Keep existing properties ...prev[selectedZone.zoneUuid], // Keep existing properties
activeSides: selectedZone.activeSides || [], activeSides: selectedZone.activeSides || [],
panelOrder: selectedZone.panelOrder || [], panelOrder: selectedZone.panelOrder || [],
lockedPanels: selectedZone.lockedPanels || [], lockedPanels: selectedZone.lockedPanels || [],
points: selectedZone.points || [], points: selectedZone.points || [],
zoneUuid: selectedZone.zoneUuid || "", zoneUuid: selectedZone.zoneUuid || "",
zoneName: selectedZone.zoneName || "",
zoneViewPortTarget: selectedZone.zoneViewPortTarget || [], zoneViewPortTarget: selectedZone.zoneViewPortTarget || [],
zoneViewPortPosition: selectedZone.zoneViewPortPosition || [], zoneViewPortPosition: selectedZone.zoneViewPortPosition || [],
widgets: selectedZone.widgets || [], widgets: selectedZone.widgets || [],

View File

@@ -34,6 +34,7 @@ interface DisplayZoneProps {
points: []; points: [];
widgets: Widget[]; widgets: Widget[];
zoneUuid: string; zoneUuid: string;
zoneName: string;
zoneViewPortTarget: number[]; zoneViewPortTarget: number[];
zoneViewPortPosition: number[]; zoneViewPortPosition: number[];
}; };
@@ -111,8 +112,8 @@ const DisplayZone: React.FC<DisplayZoneProps> = ({
setShowLeftArrow(isOverflowing && canScrollLeft); setShowLeftArrow(isOverflowing && canScrollLeft);
setShowRightArrow(isOverflowing && canScrollRight); setShowRightArrow(isOverflowing && canScrollRight);
// console.log('canScrollRight: ', canScrollRight); //
// console.log('isOverflowing: ', isOverflowing); //
} }
}, []); }, []);
@@ -180,9 +181,10 @@ const DisplayZone: React.FC<DisplayZoneProps> = ({
// setSelectedChartId(null); // setSelectedChartId(null);
let response = await getSelect2dZoneData(zoneUuid, organization, projectId, selectedVersion?.versionId || ''); let response = await getSelect2dZoneData(zoneUuid, organization, projectId, selectedVersion?.versionId || '');
// console.log('response2d: ', response);
//
let res = await getFloatingZoneData(zoneUuid, organization, projectId, selectedVersion?.versionId || ''); let res = await getFloatingZoneData(zoneUuid, organization, projectId, selectedVersion?.versionId || '');
// console.log("resFloating: ", res); //
setFloatingWidget(res); setFloatingWidget(res);
// Set the selected zone in the store // Set the selected zone in the store
@@ -201,8 +203,8 @@ const DisplayZone: React.FC<DisplayZoneProps> = ({
widgets: response.widgets || [], widgets: response.widgets || [],
points: response.points || [], points: response.points || [],
zoneUuid: zoneUuid, zoneUuid: zoneUuid,
zoneViewPortTarget: response.viewPortCenter || {}, zoneViewPortTarget: response.viewPortTarget || [],
zoneViewPortPosition: response.viewPortposition || {}, zoneViewPortPosition: response.viewPortPosition || [],
}); });
} catch (error) { } catch (error) {
echo.error("Failed to select zone"); echo.error("Failed to select zone");
@@ -238,20 +240,22 @@ const DisplayZone: React.FC<DisplayZoneProps> = ({
> >
{Object.keys(zonesData).length !== 0 ? ( {Object.keys(zonesData).length !== 0 ? (
<> <>
{Object.keys(zonesData).map((zoneName, index) => ( {Object.values(zonesData).map((zone, index) => (
<>
{ }
<div <div
key={index} key={index}
className={`zone ${selectedZone.zoneName === zoneName ? "active" : "" className={`zone ${selectedZone.zoneUuid === zone.zoneUuid ? "active" : ""
}`} }`}
onClick={() => { onClick={() => {
console.log('zonesData: ', zonesData); handleSelect2dZoneData(zonesData[zone.zoneUuid]?.zoneUuid, zone.zoneName)
handleSelect2dZoneData(zonesData[zoneName]?.zoneUuid, zoneName)
} }
} }
> >
{zoneName} {zone.zoneName}
</div> </div>
</>
))} ))}
</> </>
) : ( ) : (

View File

@@ -10,6 +10,7 @@ import {
export default function ZoneCentreTarget() { export default function ZoneCentreTarget() {
const { selectedZone } = useSelectedZoneStore(); const { selectedZone } = useSelectedZoneStore();
//
const [previousZoneCentre, setPreviousZoneCentre] = useState<number[] | null>( const [previousZoneCentre, setPreviousZoneCentre] = useState<number[] | null>(
null null
); );

View File

@@ -56,7 +56,6 @@ const UserAuth: React.FC = () => {
try { try {
const projects = await recentlyViewed(organization, res.message.userId); const projects = await recentlyViewed(organization, res.message.userId);
console.log('projects: ', projects);
if (res.message.isShare) { if (res.message.isShare) {
if (Object.values(projects.RecentlyViewed).length > 0) { if (Object.values(projects.RecentlyViewed).length > 0) {
const firstId = (Object.values(projects?.RecentlyViewed || {})[0] as any)?._id; const firstId = (Object.values(projects?.RecentlyViewed || {})[0] as any)?._id;

View File

@@ -1,9 +1,6 @@
let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`; let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
export const getZonesApi = async ( export const getZonesApi = async (projectId: string, versionId: string,) => {
projectId: string,
versionId: string,
) => {
try { try {
const response = await fetch(`${url_Backend_dwinzo}/api/V1/zones/${projectId}/${versionId}`, { const response = await fetch(`${url_Backend_dwinzo}/api/V1/zones/${projectId}/${versionId}`, {
method: "GET", method: "GET",

View File

@@ -3,7 +3,7 @@ let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_UR
export const zoneCameraUpdate = async (zoneData: {}, organization: string, projectId?: string, versionId?: string) => { export const zoneCameraUpdate = async (zoneData: {}, organization: string, projectId?: string, versionId?: string) => {
try { try {
const response = await fetch(`${url_Backend_dwinzo}/api/V1/zones`, { const response = await fetch(`${url_Backend_dwinzo}/api/V1/upsertZone`, {
method: "POST", method: "POST",
headers: { headers: {
Authorization: "Bearer <access_token>", // Replace with actual token Authorization: "Bearer <access_token>", // Replace with actual token