From 71fdb26e168f2f3c099db943d484bf66293943c8 Mon Sep 17 00:00:00 2001
From: Jerald-Golden-B <jerald@hexrfactory.com>
Date: Sat, 3 May 2025 13:23:01 +0530
Subject: [PATCH] Refactor trigger handling in Trigger component: update
 trigger selection logic and add memoization for performance; enhance
 renameTrigger function in useProductStore to return updated event.

---
 .../mechanics/roboticArmMechanics.tsx         |  10 +-
 .../eventProperties/trigger/Trigger.tsx       | 148 ++++++++++++------
 app/src/store/simulation/useProductStore.ts   |   7 +-
 3 files changed, 113 insertions(+), 52 deletions(-)

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 20ca6fc..c7bd8bc 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx
@@ -200,9 +200,8 @@ function RoboticArmMechanics() {
             );
         }
 
-        const newActions = selectedPointData.actions.filter(
-            (a: any) => a.actionUuid !== actionUuid
-        );
+        const index = selectedPointData.actions.findIndex(a => a.actionUuid === actionUuid);
+        const newActions = selectedPointData.actions.filter(a => a.actionUuid !== actionUuid);
 
         const updatedPoint = {
             ...selectedPointData,
@@ -211,8 +210,9 @@ function RoboticArmMechanics() {
         setSelectedPointData(updatedPoint);
 
         if (selectedAction.actionId === actionUuid) {
-            if (newActions.length > 0) {
-                setSelectedAction(newActions[0].actionUuid, newActions[0].actionName);
+            const nextAction = newActions[index] || newActions[index - 1];
+            if (nextAction) {
+                setSelectedAction(nextAction.actionUuid, nextAction.actionName);
             } else {
                 clearSelectedAction();
             }
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 22b3446..4953374 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/trigger/Trigger.tsx
@@ -20,7 +20,7 @@ type TriggerProps = {
 const Trigger = ({ selectedPointData, type }: TriggerProps) => {
     const [currentAction, setCurrentAction] = useState<string | undefined>();
     const { selectedProduct } = useSelectedProduct();
-    const { getActionByUuid, getEventByModelUuid, getPointByUuid, addTrigger, removeTrigger, updateTrigger, renameTrigger, getProductById } = useProductStore();
+    const { getActionByUuid, getEventByModelUuid, getPointByUuid, getTriggerByUuid, addTrigger, removeTrigger, updateTrigger, renameTrigger, getProductById } = useProductStore();
     const [triggers, setTriggers] = useState<TriggerSchema[]>([]);
     const [selectedTrigger, setSelectedTrigger] = useState<TriggerSchema | undefined>();
     const [activeOption, setActiveOption] = useState<"onComplete" | "onStart" | "onStop" | "delay" | "onError">("onComplete");
@@ -43,7 +43,6 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
         setCurrentAction(actionUuid);
     }, [selectedPointData, selectedProduct, type]);
 
-
     const updateBackend = (
         productName: string,
         productId: string,
@@ -66,50 +65,27 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
         setSelectedTrigger(actionTriggers[0]);
     }, [currentAction, selectedProduct]);
 
-    const handleAddTrigger = () => {
-        if (!selectedProduct || !currentAction) return;
+    const triggeredModel = useMemo(() => {
+        if (!selectedProduct || !selectedTrigger?.triggeredAsset?.triggeredModel?.modelUuid) return undefined;
+        return getEventByModelUuid(selectedProduct.productId, selectedTrigger.triggeredAsset.triggeredModel.modelUuid);
+    }, [selectedProduct, selectedTrigger]);
 
-        const newTrigger: TriggerSchema = {
-            triggerUuid: THREE.MathUtils.generateUUID(),
-            triggerName: `New Trigger ${triggers.length + 1}`,
-            triggerType: activeOption,
-            delay: 0,
-            triggeredAsset: null
-        };
+    const triggeredPoint = useMemo(() => {
+        if (!selectedProduct || !triggeredModel || !selectedTrigger?.triggeredAsset?.triggeredPoint?.pointUuid) return undefined;
+        return getPointByUuid(
+            selectedProduct.productId,
+            triggeredModel.modelUuid,
+            selectedTrigger.triggeredAsset.triggeredPoint.pointUuid
+        );
+    }, [selectedProduct, triggeredModel, selectedTrigger]);
 
-        addTrigger(selectedProduct.productId, currentAction, newTrigger);
-        setSelectedTrigger(newTrigger);
-    };
-
-    const handleRemoveTrigger = (triggerUuid: string) => {
-        if (!selectedProduct) return;
-        removeTrigger(selectedProduct.productId, triggerUuid);
-        if (selectedTrigger?.triggerUuid === triggerUuid) {
-            const remainingTriggers = triggers.filter(t => t.triggerUuid !== triggerUuid);
-            setSelectedTrigger(remainingTriggers[0]);
-        }
-    };
-
-    const handleTriggerRename = (triggerUuid: string, newName: string) => {
-        if (!selectedProduct) return;
-        renameTrigger(selectedProduct.productId, triggerUuid, newName);
-    };
-
-    const handleTriggerTypeChange = (option: string) => {
-        if (!selectedTrigger || !selectedProduct) return;
-
-        const validTypes: Array<TriggerSchema['triggerType']> = ["onComplete", "onStart", "onStop", "delay", "onError"];
-        if (!validTypes.includes(option as TriggerSchema['triggerType'])) return;
-
-        setActiveOption(option as TriggerSchema['triggerType']);
-        updateTrigger(selectedProduct.productId, selectedTrigger.triggerUuid, {
-            triggerType: option as TriggerSchema['triggerType']
-        });
-    };
-
-    const triggeredModel = getEventByModelUuid(selectedProduct.productId, selectedTrigger?.triggeredAsset?.triggeredModel?.modelUuid || "");
-    const triggeredPoint = getPointByUuid(selectedProduct.productId, triggeredModel?.modelUuid || '', selectedTrigger?.triggeredAsset?.triggeredPoint?.pointUuid || "");
-    const triggeredAction = getActionByUuid(selectedProduct.productId, selectedTrigger?.triggeredAsset?.triggeredAction?.actionUuid || '');
+    const triggeredAction = useMemo(() => {
+        if (!selectedProduct || !selectedTrigger?.triggeredAsset?.triggeredAction?.actionUuid) return undefined;
+        return getActionByUuid(
+            selectedProduct.productId,
+            selectedTrigger.triggeredAsset.triggeredAction.actionUuid
+        );
+    }, [selectedProduct, selectedTrigger]);
 
     const modelOptions = getProductById(selectedProduct.productId)?.eventDatas || [];
 
@@ -160,6 +136,9 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
         });
 
         if (event) {
+            const updatedTrigger = getTriggerByUuid(selectedProduct.productId, triggerUuid);
+            setSelectedTrigger(updatedTrigger);
+
             updateBackend(
                 selectedProduct.productName,
                 selectedProduct.productId,
@@ -172,8 +151,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
     const handlePointSelect = (option: string, triggerUuid: string) => {
         if (!selectedProduct || !selectedTrigger) return;
 
-        const pointUuid = pointOptions.find(p => `Point ${p.uuid.slice(0, 5)}` === option)?.uuid;
-
+        const pointUuid = pointOptions.find(p => `Point ${p.uuid.slice(0, 4)}` === option)?.uuid;
         if (!pointUuid) return;
 
         if (selectedTrigger.triggeredAsset?.triggeredModel) {
@@ -189,6 +167,9 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
             });
 
             if (event) {
+                const updatedTrigger = getTriggerByUuid(selectedProduct.productId, triggerUuid);
+                setSelectedTrigger(updatedTrigger);
+
                 updateBackend(
                     selectedProduct.productName,
                     selectedProduct.productId,
@@ -199,6 +180,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
         }
     };
 
+
     const handleActionSelect = (option: string, triggerUuid: string) => {
         if (!selectedProduct || !selectedTrigger) return;
 
@@ -228,6 +210,80 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
         }
     };
 
+    const handleAddTrigger = () => {
+        if (!selectedProduct || !currentAction) return;
+
+        const newTrigger: TriggerSchema = {
+            triggerUuid: THREE.MathUtils.generateUUID(),
+            triggerName: `New Trigger ${triggers.length + 1}`,
+            triggerType: activeOption,
+            delay: 0,
+            triggeredAsset: null
+        };
+
+        addTrigger(selectedProduct.productId, currentAction, newTrigger);
+        setSelectedTrigger(newTrigger);
+    };
+
+    const handleRemoveTrigger = (triggerUuid: string) => {
+        if (!selectedProduct || !currentAction) return;
+
+        const event = removeTrigger(selectedProduct.productId, triggerUuid);
+
+        if (event) {
+            updateBackend(
+                selectedProduct.productName,
+                selectedProduct.productId,
+                organization,
+                event
+            );
+        }
+
+        const index = triggers.findIndex(t => t.triggerUuid === triggerUuid);
+        const newTriggers = triggers.filter(t => t.triggerUuid !== triggerUuid);
+        setTriggers(newTriggers);
+
+        if (selectedTrigger?.triggerUuid === triggerUuid) {
+            const nextTrigger = newTriggers[index] || newTriggers[index - 1];
+            setSelectedTrigger(nextTrigger);
+        }
+    };
+
+    const handleTriggerRename = (triggerUuid: string, newName: string) => {
+        if (!selectedProduct) return;
+        const event = renameTrigger(selectedProduct.productId, triggerUuid, newName);
+
+        if (event) {
+            updateBackend(
+                selectedProduct.productName,
+                selectedProduct.productId,
+                organization,
+                event
+            );
+        }
+    };
+
+    const handleTriggerTypeChange = (option: string) => {
+        if (!selectedTrigger || !selectedProduct) return;
+
+        const validTypes: Array<TriggerSchema['triggerType']> = ["onComplete", "onStart", "onStop", "delay", "onError"];
+        if (!validTypes.includes(option as TriggerSchema['triggerType'])) return;
+
+        setActiveOption(option as TriggerSchema['triggerType']);
+        const event = updateTrigger(selectedProduct.productId, selectedTrigger.triggerUuid, {
+            triggerType: option as TriggerSchema['triggerType']
+        });
+
+        if (event) {
+            updateBackend(
+                selectedProduct.productName,
+                selectedProduct.productId,
+                organization,
+                event
+            );
+        }
+    };
+
     return (
         <div className="trigger-wrapper">
             <div className="header">
diff --git a/app/src/store/simulation/useProductStore.ts b/app/src/store/simulation/useProductStore.ts
index 3fbaa76..c0be958 100644
--- a/app/src/store/simulation/useProductStore.ts
+++ b/app/src/store/simulation/useProductStore.ts
@@ -56,7 +56,7 @@ type ProductsStore = {
     // Renaming functions
     renameProduct: (productId: string, newName: string) => void;
     renameAction: (productId: string, actionUuid: string, newName: string) => EventsSchema | undefined;
-    renameTrigger: (productId: string, triggerUuid: string, newName: string) => void;
+    renameTrigger: (productId: string, triggerUuid: string, newName: string) => EventsSchema | undefined;
 
     // Helper functions
     getProductById: (productId: string) => { productName: string; productId: string; eventDatas: EventsSchema[] } | undefined;
@@ -482,6 +482,7 @@ export const useProductStore = create<ProductsStore>()(
         },
 
         renameTrigger: (productId, triggerUuid, newName) => {
+            let updatedEvent: EventsSchema | undefined;
             set((state) => {
                 const product = state.products.find(p => p.productId === productId);
                 if (product) {
@@ -492,6 +493,7 @@ export const useProductStore = create<ProductsStore>()(
                                     const trigger = point.action.triggers.find(t => t.triggerUuid === triggerUuid);
                                     if (trigger) {
                                         trigger.triggerName = newName;
+                                        updatedEvent = JSON.parse(JSON.stringify(event));
                                         return;
                                     }
                                 }
@@ -502,6 +504,7 @@ export const useProductStore = create<ProductsStore>()(
                                 const trigger = point.action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
                                 if (trigger) {
                                     trigger.triggerName = newName;
+                                    updatedEvent = JSON.parse(JSON.stringify(event));
                                     return;
                                 }
                             } else if ('actions' in point) {
@@ -510,6 +513,7 @@ export const useProductStore = create<ProductsStore>()(
                                         const trigger = action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
                                         if (trigger) {
                                             trigger.triggerName = newName;
+                                            updatedEvent = JSON.parse(JSON.stringify(event));
                                             return;
                                         }
                                     }
@@ -519,6 +523,7 @@ export const useProductStore = create<ProductsStore>()(
                     }
                 }
             });
+            return updatedEvent;
         },
 
         // Helper functions