Files
Dwinzo_Demo/app/src/modules/scene/controls/undoRedoControls/handlers/use2DRedoHandler.ts

489 lines
17 KiB
TypeScript
Raw Normal View History

import { useParams } from "react-router-dom";
import { getUserData } from "../../../../../functions/getUserData";
import { useSceneContext } from "../../../sceneContext";
2025-09-16 12:21:52 +05:30
import { useSocketStore } from "../../../../../store/socket/useSocketStore";
import useWallResponseHandler from "../../../../collaboration/responseHandler/useWallResponseHandler";
2025-09-01 17:36:40 +05:30
import { upsertWallApi } from "../../../../../services/factoryBuilder/wall/upsertWallApi";
import { deleteWallApi } from "../../../../../services/factoryBuilder/wall/deleteWallApi";
2025-09-01 17:36:40 +05:30
import { upsertZoneApi } from "../../../../../services/factoryBuilder/zone/upsertZoneApi";
import { deleteZoneApi } from "../../../../../services/factoryBuilder/zone/deleteZoneApi";
2025-09-01 17:36:40 +05:30
import { upsertFloorApi } from "../../../../../services/factoryBuilder/floor/upsertFloorApi";
import { deleteFloorApi } from "../../../../../services/factoryBuilder/floor/deleteFloorApi";
2025-09-01 17:36:40 +05:30
import { upsertAisleApi } from "../../../../../services/factoryBuilder/aisle/upsertAisleApi";
import { deleteAisleApi } from "../../../../../services/factoryBuilder/aisle/deleteAisleApi";
2025-09-19 14:11:09 +05:30
import useAisleResponseHandler from "../../../../collaboration/responseHandler/useAisleResponseHandler";
function use2DRedoHandler() {
2025-09-19 14:11:09 +05:30
const { undoRedo2DStore, floorStore, zoneStore, versionStore } = useSceneContext();
const { redo2D, peekRedo2D } = undoRedo2DStore();
const { addWallToScene, removeWallFromScene, updateWallInScene } = useWallResponseHandler();
2025-09-19 14:11:09 +05:30
const { addAisleToScene, removeAisleFromScene, updateAisleInScene } = useAisleResponseHandler();
const { addFloor, removeFloor, updateFloor } = floorStore();
const { addZone, removeZone, updateZone } = zoneStore();
const { selectedVersion } = versionStore();
const { userId, organization } = getUserData();
const { projectId } = useParams();
2025-09-16 10:36:35 +05:30
const { builderSocket } = useSocketStore();
const handleRedo = () => {
const redoData = peekRedo2D();
if (!redoData) return;
2025-09-16 12:21:52 +05:30
if (redoData.type === "Draw") {
const { actions } = redoData;
2025-09-16 12:21:52 +05:30
actions.forEach((action) => {
const { actionType } = action;
2025-09-16 12:21:52 +05:30
if ("point" in action) {
const point = action.point;
2025-09-16 12:21:52 +05:30
if (actionType === "Line-Create") {
handleCreate(point);
2025-09-16 12:21:52 +05:30
} else if (actionType === "Line-Update") {
handleUpdate(point);
2025-09-16 12:21:52 +05:30
} else if (actionType === "Line-Delete") {
handleRemove(point);
}
2025-09-16 12:21:52 +05:30
} else if ("points" in action) {
const points = action.points;
2025-09-16 12:21:52 +05:30
if (actionType === "Lines-Create") {
points.forEach(handleCreate);
2025-09-16 12:21:52 +05:30
} else if (actionType === "Lines-Update") {
points.forEach(handleUpdate);
2025-09-16 12:21:52 +05:30
} else if (actionType === "Lines-Delete") {
points.forEach(handleRemove);
}
}
});
2025-09-16 12:21:52 +05:30
} else if (redoData.type === "UI") {
// Handle UI actions if needed
}
redo2D();
};
const handleCreate = (point: UndoRedo2DDataTypeSchema) => {
switch (point.type) {
2025-09-16 12:21:52 +05:30
case "Wall":
createWallFromBackend(point.lineData);
break;
case "Floor":
createFloorFromBackend(point.lineData);
break;
case "Zone":
createZoneFromBackend(point.lineData);
break;
case "Aisle":
createAisleFromBackend(point.lineData);
break;
}
};
const handleRemove = (point: UndoRedo2DDataTypeSchema) => {
switch (point.type) {
2025-09-16 12:21:52 +05:30
case "Wall":
removeWallFromBackend(point.lineData.wallUuid);
break;
case "Floor":
removeFloorFromBackend(point.lineData.floorUuid);
break;
case "Zone":
removeZoneFromBackend(point.lineData.zoneUuid);
break;
case "Aisle":
removeAisleFromBackend(point.lineData.aisleUuid);
break;
}
};
const handleUpdate = (point: UndoRedo2DDataTypeSchema) => {
if (!point.newData) return;
switch (point.type) {
2025-09-16 12:21:52 +05:30
case "Wall":
updateWallFromBackend(point.newData.wallUuid, point.newData);
break;
case "Floor":
updateFloorFromBackend(point.newData.floorUuid, point.newData);
break;
case "Zone":
updateZoneFromBackend(point.newData.zoneUuid, point.newData);
break;
case "Aisle":
updateAisleFromBackend(point.newData.aisleUuid, point.newData);
break;
}
};
const createWallFromBackend = (wallData: Wall) => {
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
upsertWallApi(projectId, selectedVersion?.versionId || "", wallData)
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error adding wall`);
return;
}
if (data.message === "Wall Created Successfully") {
addWallToScene(wallData, () => {
echo.info(`Added wall: ${wallData.wallUuid}`);
});
} else {
echo.error(`Error adding wall: ${wallData.wallUuid}`);
}
})
.catch(() => {
echo.error(`Error adding wall: ${wallData.wallUuid}`);
});
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
wallData: wallData,
projectId: projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId: userId,
2025-09-16 12:21:52 +05:30
organization: organization,
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-Wall:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
const removeWallFromBackend = (wallUuid: string) => {
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
deleteWallApi(projectId, selectedVersion?.versionId || "", wallUuid)
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error removing wall`);
return;
}
if (data.message === "Wall Deleted Successfully") {
removeWallFromScene(wallUuid, () => {
echo.info(`Removed wall: ${wallUuid}`);
});
} else {
echo.error(`Error removing wall: ${wallUuid}`);
}
})
.catch(() => {
echo.error(`Error removing wall: ${wallUuid}`);
});
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
wallUuid: wallUuid,
projectId: projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId: userId,
2025-09-16 12:21:52 +05:30
organization: organization,
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-Wall:delete", data);
2025-09-01 17:36:40 +05:30
}
}
};
const updateWallFromBackend = (wallUuid: string, updatedData: Wall) => {
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
upsertWallApi(projectId, selectedVersion?.versionId || "", updatedData)
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error updating wall`);
return;
}
if (data.message === "Wall Updated Successfully") {
updateWallInScene(updatedData, () => {
echo.info(`Updated wall: ${wallUuid}`);
});
}
})
.catch(() => {
2025-09-19 14:11:09 +05:30
echo.error(`Error updating wall: ${wallUuid}`);
});
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
wallData: updatedData,
projectId: projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId: userId,
2025-09-16 12:21:52 +05:30
organization: organization,
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-Wall:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
const createFloorFromBackend = (floorData: Floor) => {
addFloor(floorData);
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-16 12:21:52 +05:30
upsertFloorApi(projectId, selectedVersion?.versionId || "", floorData);
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
floorData: floorData,
projectId: projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId: userId,
2025-09-16 12:21:52 +05:30
organization: organization,
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-Floor:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
const removeFloorFromBackend = (floorUuid: string) => {
removeFloor(floorUuid);
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-16 12:21:52 +05:30
deleteFloorApi(projectId, selectedVersion?.versionId || "", floorUuid);
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
floorUuid: floorUuid,
projectId: projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId: userId,
2025-09-16 12:21:52 +05:30
organization: organization,
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-Floor:delete", data);
2025-09-01 17:36:40 +05:30
}
}
};
const updateFloorFromBackend = (floorUuid: string, updatedData: Floor) => {
updateFloor(floorUuid, updatedData);
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-16 12:21:52 +05:30
upsertFloorApi(projectId, selectedVersion?.versionId || "", updatedData);
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
floorData: updatedData,
projectId: projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId: userId,
2025-09-16 12:21:52 +05:30
organization: organization,
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-Floor:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
const createZoneFromBackend = (zoneData: Zone) => {
addZone(zoneData);
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-16 12:21:52 +05:30
upsertZoneApi(projectId, selectedVersion?.versionId || "", zoneData);
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
zoneData: zoneData,
projectId: projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId: userId,
2025-09-16 12:21:52 +05:30
organization: organization,
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:zone:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
const removeZoneFromBackend = (zoneUuid: string) => {
removeZone(zoneUuid);
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-16 12:21:52 +05:30
deleteZoneApi(projectId, selectedVersion?.versionId || "", zoneUuid);
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
zoneUuid,
projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId,
2025-09-16 12:21:52 +05:30
organization,
2025-09-01 17:36:40 +05:30
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:zone:delete", data);
2025-09-01 17:36:40 +05:30
}
}
};
const updateZoneFromBackend = (zoneUuid: string, updatedData: Zone) => {
updateZone(zoneUuid, updatedData);
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-16 12:21:52 +05:30
upsertZoneApi(projectId, selectedVersion?.versionId || "", updatedData);
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
zoneData: updatedData,
projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId,
2025-09-16 12:21:52 +05:30
organization,
2025-09-01 17:36:40 +05:30
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:zone:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
const createAisleFromBackend = (aisleData: Aisle) => {
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-19 14:11:09 +05:30
upsertAisleApi(aisleData.aisleUuid, aisleData.points, aisleData.type, projectId, selectedVersion?.versionId || "")
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error adding aisle`);
return;
}
if (data.message === "Aisle Created Successfully") {
addAisleToScene(aisleData, () => {
echo.info(`Added aisle: ${aisleData.aisleUuid}`);
2025-09-19 14:11:09 +05:30
});
} else {
echo.error(`Error adding aisle: ${aisleData.aisleUuid}`);
}
})
.catch(() => {
echo.error(`Error adding aisle: ${aisleData.aisleUuid}`);
});
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
...aisleData,
projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId,
2025-09-16 12:21:52 +05:30
organization,
2025-09-01 17:36:40 +05:30
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-aisle:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
const removeAisleFromBackend = (aisleUuid: string) => {
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-19 14:11:09 +05:30
deleteAisleApi(projectId, selectedVersion?.versionId || "", aisleUuid)
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error removing aisle`);
return;
}
if (data.message === "Aisle Deleted Successfully") {
removeAisleFromScene(aisleUuid, () => {
echo.info(`Removed aisle: ${aisleUuid}`);
2025-09-19 14:11:09 +05:30
});
} else {
echo.error(`Error removing aisle: ${aisleUuid}`);
}
})
.catch(() => {
echo.error(`Error removing aisle: ${aisleUuid}`);
});
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
aisleUuid,
projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId,
2025-09-16 12:21:52 +05:30
organization,
2025-09-01 17:36:40 +05:30
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-aisle:delete", data);
2025-09-01 17:36:40 +05:30
}
}
};
const updateAisleFromBackend = (aisleUuid: string, updatedData: Aisle) => {
if (projectId) {
2025-09-16 10:36:35 +05:30
if (!builderSocket?.connected) {
2025-09-01 17:36:40 +05:30
// API
2025-09-19 14:11:09 +05:30
upsertAisleApi(aisleUuid, updatedData.points, updatedData.type, projectId, selectedVersion?.versionId || "")
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error updating aisle`);
return;
}
if (data.message === "Aisle Updated Successfully") {
updateAisleInScene(updatedData, () => {
echo.info(`Updated aisle: ${aisleUuid}`);
2025-09-19 14:11:09 +05:30
});
}
})
.catch(() => {
echo.error(`Error updating aisle: ${aisleUuid}`);
});
2025-09-01 17:36:40 +05:30
} else {
// SOCKET
2025-09-01 17:36:40 +05:30
const data = {
...updatedData,
projectId,
2025-09-16 12:21:52 +05:30
versionId: selectedVersion?.versionId || "",
2025-09-01 17:36:40 +05:30
userId,
2025-09-16 12:21:52 +05:30
organization,
2025-09-01 17:36:40 +05:30
};
2025-09-16 12:21:52 +05:30
builderSocket.emit("v1:model-aisle:add", data);
2025-09-01 17:36:40 +05:30
}
}
};
return { handleRedo };
}
export default use2DRedoHandler;