From 25697f99a3a4790b26bddaead6e043fe7daad27c Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Fri, 9 May 2025 12:40:59 +0530 Subject: [PATCH] Enhance action handling: integrate useSelectedAction hook across mechanics components; update action state management for improved clarity and functionality. --- .../mechanics/conveyorMechanics.tsx | 8 ++++-- .../mechanics/machineMechanics.tsx | 10 ++++--- .../mechanics/roboticArmMechanics.tsx | 2 +- .../mechanics/storageMechanics.tsx | 10 ++++--- .../mechanics/vehicleMechanics.tsx | 9 +++++-- .../eventProperties/trigger/Trigger.tsx | 2 +- .../triggers/connector/triggerConnector.tsx | 18 ++++++++----- .../modules/simulation/triggers/trigger.tsx | 2 +- .../triggerHandler/useTriggerHandler.ts | 27 +++++++++---------- .../modules/simulation/ui/arm/armBotUI.tsx | 2 +- .../store/simulation/useSimulationStore.ts | 8 +++--- 11 files changed, 59 insertions(+), 39 deletions(-) diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx index 046eefa..027dc0b 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx @@ -8,7 +8,7 @@ import SwapAction from "../actions/SwapAction"; import SpawnAction from "../actions/SpawnAction"; import DefaultAction from "../actions/DefaultAction"; import Trigger from "../trigger/Trigger"; -import { useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore"; +import { useSelectedAction, useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore"; import { useProductStore } from "../../../../../../store/simulation/useProductStore"; import ActionsList from "../components/ActionsList"; import { upsertProductOrEventApi } from "../../../../../../services/simulation/UpsertProductOrEventApi"; @@ -19,6 +19,7 @@ function ConveyorMechanics() { const { selectedEventData } = useSelectedEventData(); const { getPointByUuid, getEventByModelUuid, updateEvent, updateAction } = useProductStore(); const { selectedProduct } = useSelectedProduct(); + const { setSelectedAction, clearSelectedAction } = useSelectedAction(); const email = localStorage.getItem('email') const organization = (email!.split("@")[1]).split(".")[0]; @@ -33,9 +34,12 @@ function ConveyorMechanics() { if (point && "action" in point) { setSelectedPointData(point); setActiveOption(point.action.actionType as | "default" | "spawn" | "swap" | "delay" | "despawn"); + setSelectedAction(point.action.actionUuid, point.action.actionName); } + } else { + clearSelectedAction(); } - }, [selectedProduct, selectedEventData, getPointByUuid]); + }, [selectedProduct, selectedEventData]); const updateBackend = ( productName: string, diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx index 0b5b63b..ec296f2 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import RenameInput from "../../../../../ui/inputs/RenameInput"; import LabledDropdown from "../../../../../ui/inputs/LabledDropdown"; import Trigger from "../trigger/Trigger"; -import { useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore"; +import { useSelectedAction, useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore"; import { useProductStore } from "../../../../../../store/simulation/useProductStore"; import ProcessAction from "../actions/ProcessAction"; import ActionsList from "../components/ActionsList"; @@ -14,6 +14,7 @@ function MachineMechanics() { const { selectedEventData } = useSelectedEventData(); const { getPointByUuid, updateAction } = useProductStore(); const { selectedProduct } = useSelectedProduct(); + const { setSelectedAction, clearSelectedAction } = useSelectedAction(); const email = localStorage.getItem('email') const organization = (email!.split("@")[1]).split(".")[0]; @@ -28,9 +29,12 @@ function MachineMechanics() { if (point && "action" in point) { setSelectedPointData(point); setActiveOption(point.action.actionType as "process"); + setSelectedAction(point.action.actionUuid, point.action.actionName); } + } else { + clearSelectedAction(); } - }, [selectedProduct, selectedEventData, getPointByUuid]); + }, [selectedProduct, selectedEventData]); const updateBackend = ( productName: string, @@ -137,7 +141,7 @@ function MachineMechanics() {
- +
)} diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx index 3ecbc9d..152bbfe 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx @@ -258,7 +258,7 @@ function RoboticArmMechanics() {
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx index 34e35ae..84ca70e 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import RenameInput from "../../../../../ui/inputs/RenameInput"; import LabledDropdown from "../../../../../ui/inputs/LabledDropdown"; import Trigger from "../trigger/Trigger"; -import { useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore"; +import { useSelectedAction, useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore"; import { useProductStore } from "../../../../../../store/simulation/useProductStore"; import StorageAction from "../actions/StorageAction"; import ActionsList from "../components/ActionsList"; @@ -14,6 +14,7 @@ function StorageMechanics() { const { selectedEventData } = useSelectedEventData(); const { getPointByUuid, updateAction } = useProductStore(); const { selectedProduct } = useSelectedProduct(); + const { setSelectedAction, clearSelectedAction } = useSelectedAction(); const email = localStorage.getItem('email') const organization = (email!.split("@")[1]).split(".")[0]; @@ -28,9 +29,12 @@ function StorageMechanics() { if (point && "action" in point) { setSelectedPointData(point); setActiveOption(point.action.actionType as "store" | "spawn"); + setSelectedAction(point.action.actionUuid, point.action.actionName); } + } else { + clearSelectedAction(); } - }, [selectedProduct, selectedEventData, getPointByUuid]); + }, [selectedProduct, selectedEventData]); const updateBackend = ( productName: string, @@ -146,7 +150,7 @@ function StorageMechanics() {
- +
)} diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx index 0f52437..d362679 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx @@ -4,6 +4,7 @@ import RenameInput from "../../../../../ui/inputs/RenameInput"; import LabledDropdown from "../../../../../ui/inputs/LabledDropdown"; import Trigger from "../trigger/Trigger"; import { + useSelectedAction, useSelectedEventData, useSelectedProduct, } from "../../../../../../store/simulation/useSimulationStore"; @@ -18,6 +19,7 @@ function VehicleMechanics() { const { selectedEventData } = useSelectedEventData(); const { getPointByUuid, getEventByModelUuid, updateEvent, updateAction } = useProductStore(); const { selectedProduct } = useSelectedProduct(); + const { setSelectedAction, clearSelectedAction } = useSelectedAction(); const email = localStorage.getItem('email') const organization = (email!.split("@")[1]).split(".")[0]; @@ -33,9 +35,12 @@ function VehicleMechanics() { if (point) { setSelectedPointData(point); setActiveOption(point.action.actionType as "travel"); + setSelectedAction(point.action.actionUuid, point.action.actionName); } + } else { + clearSelectedAction(); } - }, [selectedProduct, selectedEventData, getPointByUuid]); + }, [selectedProduct, selectedEventData]); const updateBackend = ( productName: string, @@ -235,7 +240,7 @@ function VehicleMechanics() {
- +
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx index 67fd358..da36384 100644 --- a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx +++ b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx @@ -37,7 +37,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => { if (type === 'Conveyor' || type === 'Vehicle' || type === 'Machine' || type === 'StorageUnit') { actionUuid = (selectedPointData as ConveyorPointSchema | VehiclePointSchema | MachinePointSchema | StoragePointSchema).action?.actionUuid; - } else if (type === 'RoboticArm' && selectedAction) { + } else if (type === 'RoboticArm' && selectedAction && selectedAction.actionId) { actionUuid = selectedAction.actionId; } diff --git a/app/src/modules/simulation/triggers/connector/triggerConnector.tsx b/app/src/modules/simulation/triggers/connector/triggerConnector.tsx index a56436f..b59d9f1 100644 --- a/app/src/modules/simulation/triggers/connector/triggerConnector.tsx +++ b/app/src/modules/simulation/triggers/connector/triggerConnector.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from "react"; import { useFrame, useThree } from "@react-three/fiber"; import * as THREE from "three"; import { useSubModuleStore } from "../../../../store/useModuleStore"; -import { useSelectedAsset } from "../../../../store/simulation/useSimulationStore"; +import { useSelectedAction, useSelectedAsset } from "../../../../store/simulation/useSimulationStore"; import { useProductStore } from "../../../../store/simulation/useProductStore"; import { useEventsStore } from "../../../../store/simulation/useEventsStore"; import { useSelectedProduct } from "../../../../store/simulation/useSimulationStore"; @@ -22,7 +22,7 @@ interface ConnectionLine { function TriggerConnector() { const { gl, raycaster, scene, pointer, camera } = useThree(); const { subModule } = useSubModuleStore(); - const { products, getPointByUuid, getIsEventInProduct, getActionByUuid, addTrigger, removeTrigger, addEvent, getEventByModelUuid, getProductById } = useProductStore(); + const { products, getPointByUuid, getIsEventInProduct, getActionByUuid, addTrigger, removeTrigger, addEvent, getEventByModelUuid, getPointUuidByActionUuid, getProductById } = useProductStore(); const { selectedAsset, clearSelectedAsset } = useSelectedAsset(); const { selectedProduct } = useSelectedProduct(); const [hoveredLineKey, setHoveredLineKey] = useState(null); @@ -31,6 +31,7 @@ function TriggerConnector() { const [currentLine, setCurrentLine] = useState<{ start: THREE.Vector3; end: THREE.Vector3; mid: THREE.Vector3; } | null>(null); const { deleteTool } = useDeleteTool(); const { isPlaying } = usePlayButtonStore(); + const { selectedAction } = useSelectedAction(); const [firstSelectedPoint, setFirstSelectedPoint] = useState<{ productId: string; @@ -50,7 +51,7 @@ function TriggerConnector() { organization: string, eventData: EventsSchema ) => { - const data =upsertProductOrEventApi({ + upsertProductOrEventApi({ productName: productName, productId: productId, organization: organization, @@ -201,6 +202,7 @@ function TriggerConnector() { ); const event = getEventByModelUuid(selectedProduct.productId, modelUuid); + const clickedPointUuid = getPointUuidByActionUuid(selectedProduct.productId, selectedAction.actionId || ''); if (!point || !event) { setFirstSelectedPoint(null); @@ -215,11 +217,12 @@ function TriggerConnector() { } if (!firstSelectedPoint) { + if (point.uuid !== clickedPointUuid) return; setFirstSelectedPoint({ productId: selectedProduct.productId, modelUuid, pointUuid, - actionUuid + actionUuid: selectedAction.actionId || '' }); } else { const trigger: TriggerSchema = { @@ -323,11 +326,13 @@ function TriggerConnector() { } }; - if (subModule === 'simulations' && !deleteTool) { + if (subModule === 'mechanics' && !deleteTool && selectedAction.actionId && selectedAction.actionName) { canvasElement.addEventListener("mousedown", onMouseDown); canvasElement.addEventListener("mouseup", onMouseUp); canvasElement.addEventListener("mousemove", onMouseMove); canvasElement.addEventListener('contextmenu', handleRightClick); + } else { + setFirstSelectedPoint(null); } return () => { @@ -337,8 +342,7 @@ function TriggerConnector() { canvasElement.removeEventListener('contextmenu', handleRightClick); }; - }, [gl, subModule, selectedProduct, firstSelectedPoint, deleteTool]); - + }, [gl, subModule, selectedProduct, firstSelectedPoint, deleteTool, selectedAction]); useFrame(() => { if (firstSelectedPoint) { diff --git a/app/src/modules/simulation/triggers/trigger.tsx b/app/src/modules/simulation/triggers/trigger.tsx index 110da2e..5f11709 100644 --- a/app/src/modules/simulation/triggers/trigger.tsx +++ b/app/src/modules/simulation/triggers/trigger.tsx @@ -1,7 +1,7 @@ -import React from 'react' import TriggerConnector from './connector/triggerConnector' function Trigger() { + return ( <> diff --git a/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts b/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts index c022e78..f0e4d06 100644 --- a/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts +++ b/app/src/modules/simulation/triggers/triggerHandler/useTriggerHandler.ts @@ -133,8 +133,6 @@ export function useTriggerHandler() { if (armBot.isActive === false && armBot.state === 'idle') { - setIsPaused(material.materialId, true); - // Handle current action from arm bot handleAction(action, materialId); @@ -265,6 +263,7 @@ export function useTriggerHandler() { if (materialId && trigger.triggeredAsset && trigger.triggeredAsset.triggeredPoint && trigger.triggeredAsset.triggeredAction) { const material = getMaterialById(materialId); if (material) { + setIsPaused(material.materialId, false); setPreviousLocation(material.materialId, { @@ -357,18 +356,6 @@ export function useTriggerHandler() { const action = getActionByUuid(selectedProduct.productId, trigger.triggeredAsset.triggeredAction.actionUuid); const vehicle = getVehicleById(trigger.triggeredAsset?.triggeredModel.modelUuid); - setPreviousLocation(material.materialId, { - modelUuid: material.current.modelUuid, - pointUuid: material.current.pointUuid, - actionUuid: material.current.actionUuid, - }) - - setCurrentLocation(material.materialId, { - modelUuid: trigger.triggeredAsset.triggeredModel.modelUuid, - pointUuid: trigger.triggeredAsset.triggeredPoint.pointUuid, - actionUuid: trigger.triggeredAsset?.triggeredAction?.actionUuid, - }); - setNextLocation(material.materialId, null); if (action) { @@ -379,6 +366,18 @@ export function useTriggerHandler() { setIsVisible(materialId, false); + setPreviousLocation(material.materialId, { + modelUuid: material.current.modelUuid, + pointUuid: material.current.pointUuid, + actionUuid: material.current.actionUuid, + }) + + setCurrentLocation(material.materialId, { + modelUuid: trigger.triggeredAsset.triggeredModel.modelUuid, + pointUuid: trigger.triggeredAsset.triggeredPoint.pointUuid, + actionUuid: trigger.triggeredAsset?.triggeredAction?.actionUuid, + }); + // Handle current action from vehicle handleAction(action, materialId); diff --git a/app/src/modules/simulation/ui/arm/armBotUI.tsx b/app/src/modules/simulation/ui/arm/armBotUI.tsx index 12fdde8..d188af0 100644 --- a/app/src/modules/simulation/ui/arm/armBotUI.tsx +++ b/app/src/modules/simulation/ui/arm/armBotUI.tsx @@ -53,7 +53,7 @@ const ArmBotUI = () => { if (selectedEventSphere) { const selectedArmBot = getEventByModelUuid(selectedProduct.productId, selectedEventSphere.userData.modelUuid); - if (selectedArmBot?.type === "roboticArm") { + if (selectedArmBot?.type === "roboticArm" && selectedAction.actionId) { setSelectedArmBotData(selectedArmBot); const defaultPositions = getDefaultPositions(selectedArmBot.modelUuid); const matchingAction = getActionByUuid(selectedProduct.productId, selectedAction.actionId); diff --git a/app/src/store/simulation/useSimulationStore.ts b/app/src/store/simulation/useSimulationStore.ts index 6e4321f..b3d3c78 100644 --- a/app/src/store/simulation/useSimulationStore.ts +++ b/app/src/store/simulation/useSimulationStore.ts @@ -93,14 +93,14 @@ export const useSelectedProduct = create()( ); interface SelectedActionState { - selectedAction: { actionId: string; actionName: string }; + selectedAction: { actionId: string | null; actionName: string | null }; setSelectedAction: (actionId: string, actionName: string) => void; clearSelectedAction: () => void; } export const useSelectedAction = create()( immer((set) => ({ - selectedAction: { actionId: '', actionName: '' }, + selectedAction: { actionId: null, actionName: null }, setSelectedAction: (actionId, actionName) => { set((state) => { state.selectedAction.actionId = actionId; @@ -109,8 +109,8 @@ export const useSelectedAction = create()( }, clearSelectedAction: () => { set((state) => { - state.selectedAction.actionId = ''; - state.selectedAction.actionName = ''; + state.selectedAction.actionId = null; + state.selectedAction.actionName = null; }); }, }))