Refactor trigger handling in Trigger component: update trigger selection logic and add memoization for performance; enhance renameTrigger function in useProductStore to return updated event.
This commit is contained in:
parent
649352b4b4
commit
71fdb26e16
|
@ -200,9 +200,8 @@ function RoboticArmMechanics() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const newActions = selectedPointData.actions.filter(
|
const index = selectedPointData.actions.findIndex(a => a.actionUuid === actionUuid);
|
||||||
(a: any) => a.actionUuid !== actionUuid
|
const newActions = selectedPointData.actions.filter(a => a.actionUuid !== actionUuid);
|
||||||
);
|
|
||||||
|
|
||||||
const updatedPoint = {
|
const updatedPoint = {
|
||||||
...selectedPointData,
|
...selectedPointData,
|
||||||
|
@ -211,8 +210,9 @@ function RoboticArmMechanics() {
|
||||||
setSelectedPointData(updatedPoint);
|
setSelectedPointData(updatedPoint);
|
||||||
|
|
||||||
if (selectedAction.actionId === actionUuid) {
|
if (selectedAction.actionId === actionUuid) {
|
||||||
if (newActions.length > 0) {
|
const nextAction = newActions[index] || newActions[index - 1];
|
||||||
setSelectedAction(newActions[0].actionUuid, newActions[0].actionName);
|
if (nextAction) {
|
||||||
|
setSelectedAction(nextAction.actionUuid, nextAction.actionName);
|
||||||
} else {
|
} else {
|
||||||
clearSelectedAction();
|
clearSelectedAction();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ type TriggerProps = {
|
||||||
const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
||||||
const [currentAction, setCurrentAction] = useState<string | undefined>();
|
const [currentAction, setCurrentAction] = useState<string | undefined>();
|
||||||
const { selectedProduct } = useSelectedProduct();
|
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 [triggers, setTriggers] = useState<TriggerSchema[]>([]);
|
||||||
const [selectedTrigger, setSelectedTrigger] = useState<TriggerSchema | undefined>();
|
const [selectedTrigger, setSelectedTrigger] = useState<TriggerSchema | undefined>();
|
||||||
const [activeOption, setActiveOption] = useState<"onComplete" | "onStart" | "onStop" | "delay" | "onError">("onComplete");
|
const [activeOption, setActiveOption] = useState<"onComplete" | "onStart" | "onStop" | "delay" | "onError">("onComplete");
|
||||||
|
@ -43,7 +43,6 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
||||||
setCurrentAction(actionUuid);
|
setCurrentAction(actionUuid);
|
||||||
}, [selectedPointData, selectedProduct, type]);
|
}, [selectedPointData, selectedProduct, type]);
|
||||||
|
|
||||||
|
|
||||||
const updateBackend = (
|
const updateBackend = (
|
||||||
productName: string,
|
productName: string,
|
||||||
productId: string,
|
productId: string,
|
||||||
|
@ -66,50 +65,27 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
||||||
setSelectedTrigger(actionTriggers[0]);
|
setSelectedTrigger(actionTriggers[0]);
|
||||||
}, [currentAction, selectedProduct]);
|
}, [currentAction, selectedProduct]);
|
||||||
|
|
||||||
const handleAddTrigger = () => {
|
const triggeredModel = useMemo(() => {
|
||||||
if (!selectedProduct || !currentAction) return;
|
if (!selectedProduct || !selectedTrigger?.triggeredAsset?.triggeredModel?.modelUuid) return undefined;
|
||||||
|
return getEventByModelUuid(selectedProduct.productId, selectedTrigger.triggeredAsset.triggeredModel.modelUuid);
|
||||||
|
}, [selectedProduct, selectedTrigger]);
|
||||||
|
|
||||||
const newTrigger: TriggerSchema = {
|
const triggeredPoint = useMemo(() => {
|
||||||
triggerUuid: THREE.MathUtils.generateUUID(),
|
if (!selectedProduct || !triggeredModel || !selectedTrigger?.triggeredAsset?.triggeredPoint?.pointUuid) return undefined;
|
||||||
triggerName: `New Trigger ${triggers.length + 1}`,
|
return getPointByUuid(
|
||||||
triggerType: activeOption,
|
selectedProduct.productId,
|
||||||
delay: 0,
|
triggeredModel.modelUuid,
|
||||||
triggeredAsset: null
|
selectedTrigger.triggeredAsset.triggeredPoint.pointUuid
|
||||||
};
|
);
|
||||||
|
}, [selectedProduct, triggeredModel, selectedTrigger]);
|
||||||
|
|
||||||
addTrigger(selectedProduct.productId, currentAction, newTrigger);
|
const triggeredAction = useMemo(() => {
|
||||||
setSelectedTrigger(newTrigger);
|
if (!selectedProduct || !selectedTrigger?.triggeredAsset?.triggeredAction?.actionUuid) return undefined;
|
||||||
};
|
return getActionByUuid(
|
||||||
|
selectedProduct.productId,
|
||||||
const handleRemoveTrigger = (triggerUuid: string) => {
|
selectedTrigger.triggeredAsset.triggeredAction.actionUuid
|
||||||
if (!selectedProduct) return;
|
);
|
||||||
removeTrigger(selectedProduct.productId, triggerUuid);
|
}, [selectedProduct, selectedTrigger]);
|
||||||
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 modelOptions = getProductById(selectedProduct.productId)?.eventDatas || [];
|
const modelOptions = getProductById(selectedProduct.productId)?.eventDatas || [];
|
||||||
|
|
||||||
|
@ -160,6 +136,9 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (event) {
|
if (event) {
|
||||||
|
const updatedTrigger = getTriggerByUuid(selectedProduct.productId, triggerUuid);
|
||||||
|
setSelectedTrigger(updatedTrigger);
|
||||||
|
|
||||||
updateBackend(
|
updateBackend(
|
||||||
selectedProduct.productName,
|
selectedProduct.productName,
|
||||||
selectedProduct.productId,
|
selectedProduct.productId,
|
||||||
|
@ -172,8 +151,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
||||||
const handlePointSelect = (option: string, triggerUuid: string) => {
|
const handlePointSelect = (option: string, triggerUuid: string) => {
|
||||||
if (!selectedProduct || !selectedTrigger) return;
|
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 (!pointUuid) return;
|
||||||
|
|
||||||
if (selectedTrigger.triggeredAsset?.triggeredModel) {
|
if (selectedTrigger.triggeredAsset?.triggeredModel) {
|
||||||
|
@ -189,6 +167,9 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (event) {
|
if (event) {
|
||||||
|
const updatedTrigger = getTriggerByUuid(selectedProduct.productId, triggerUuid);
|
||||||
|
setSelectedTrigger(updatedTrigger);
|
||||||
|
|
||||||
updateBackend(
|
updateBackend(
|
||||||
selectedProduct.productName,
|
selectedProduct.productName,
|
||||||
selectedProduct.productId,
|
selectedProduct.productId,
|
||||||
|
@ -199,6 +180,7 @@ const Trigger = ({ selectedPointData, type }: TriggerProps) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const handleActionSelect = (option: string, triggerUuid: string) => {
|
const handleActionSelect = (option: string, triggerUuid: string) => {
|
||||||
if (!selectedProduct || !selectedTrigger) return;
|
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 (
|
return (
|
||||||
<div className="trigger-wrapper">
|
<div className="trigger-wrapper">
|
||||||
<div className="header">
|
<div className="header">
|
||||||
|
|
|
@ -56,7 +56,7 @@ type ProductsStore = {
|
||||||
// Renaming functions
|
// Renaming functions
|
||||||
renameProduct: (productId: string, newName: string) => void;
|
renameProduct: (productId: string, newName: string) => void;
|
||||||
renameAction: (productId: string, actionUuid: string, newName: string) => EventsSchema | undefined;
|
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
|
// Helper functions
|
||||||
getProductById: (productId: string) => { productName: string; productId: string; eventDatas: EventsSchema[] } | undefined;
|
getProductById: (productId: string) => { productName: string; productId: string; eventDatas: EventsSchema[] } | undefined;
|
||||||
|
@ -482,6 +482,7 @@ export const useProductStore = create<ProductsStore>()(
|
||||||
},
|
},
|
||||||
|
|
||||||
renameTrigger: (productId, triggerUuid, newName) => {
|
renameTrigger: (productId, triggerUuid, newName) => {
|
||||||
|
let updatedEvent: EventsSchema | undefined;
|
||||||
set((state) => {
|
set((state) => {
|
||||||
const product = state.products.find(p => p.productId === productId);
|
const product = state.products.find(p => p.productId === productId);
|
||||||
if (product) {
|
if (product) {
|
||||||
|
@ -492,6 +493,7 @@ export const useProductStore = create<ProductsStore>()(
|
||||||
const trigger = point.action.triggers.find(t => t.triggerUuid === triggerUuid);
|
const trigger = point.action.triggers.find(t => t.triggerUuid === triggerUuid);
|
||||||
if (trigger) {
|
if (trigger) {
|
||||||
trigger.triggerName = newName;
|
trigger.triggerName = newName;
|
||||||
|
updatedEvent = JSON.parse(JSON.stringify(event));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -502,6 +504,7 @@ export const useProductStore = create<ProductsStore>()(
|
||||||
const trigger = point.action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
|
const trigger = point.action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
|
||||||
if (trigger) {
|
if (trigger) {
|
||||||
trigger.triggerName = newName;
|
trigger.triggerName = newName;
|
||||||
|
updatedEvent = JSON.parse(JSON.stringify(event));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if ('actions' in point) {
|
} else if ('actions' in point) {
|
||||||
|
@ -510,6 +513,7 @@ export const useProductStore = create<ProductsStore>()(
|
||||||
const trigger = action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
|
const trigger = action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
|
||||||
if (trigger) {
|
if (trigger) {
|
||||||
trigger.triggerName = newName;
|
trigger.triggerName = newName;
|
||||||
|
updatedEvent = JSON.parse(JSON.stringify(event));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -519,6 +523,7 @@ export const useProductStore = create<ProductsStore>()(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
return updatedEvent;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Helper functions
|
// Helper functions
|
||||||
|
|
Loading…
Reference in New Issue