diff --git a/src/frontend/src/customNodes/hooks/use-icons-status.tsx b/src/frontend/src/customNodes/hooks/use-icons-status.tsx
new file mode 100644
index 000000000..ec378fac2
--- /dev/null
+++ b/src/frontend/src/customNodes/hooks/use-icons-status.tsx
@@ -0,0 +1,54 @@
+import IconComponent from "../../components/genericIconComponent";
+import Checkmark from "../../components/ui/checkmark";
+import Loading from "../../components/ui/loading";
+import Xmark from "../../components/ui/xmark";
+import { BuildStatus } from "../../constants/enums";
+import { VertexBuildTypeAPI } from "../../types/api";
+
+const useIconStatus = (
+ buildStatus: BuildStatus | undefined,
+ validationStatus: VertexBuildTypeAPI | null,
+) => {
+ const renderIconStatus = () => {
+ if (buildStatus === BuildStatus.BUILDING) {
+ return ;
+ } else {
+ return (
+ <>
+
+ {validationStatus && validationStatus.valid ? (
+
+ ) : validationStatus &&
+ !validationStatus.valid &&
+ buildStatus === BuildStatus.INACTIVE ? (
+
+ ) : buildStatus === BuildStatus.ERROR ||
+ (validationStatus && !validationStatus.valid) ? (
+
+ ) : (
+
+ )}
+ >
+ );
+ }
+ };
+
+ return renderIconStatus();
+};
+
+export default useIconStatus;
diff --git a/src/frontend/src/customNodes/hooks/use-update-node-code.tsx b/src/frontend/src/customNodes/hooks/use-update-node-code.tsx
new file mode 100644
index 000000000..28220d141
--- /dev/null
+++ b/src/frontend/src/customNodes/hooks/use-update-node-code.tsx
@@ -0,0 +1,38 @@
+import { cloneDeep } from "lodash"; // or any other deep cloning library you prefer
+import { useCallback } from "react";
+import { APIClassType } from "../../types/api";
+
+const useUpdateNodeCode = (
+ dataId: string,
+ dataNode: APIClassType, // Define YourNodeType according to your data structure
+ setNode: (id: string, callback: (oldNode) => any) => void,
+ setIsOutdated: (value: boolean) => void,
+ updateNodeInternals: (id: string) => void,
+) => {
+ const updateNodeCode = useCallback(
+ (newNodeClass: APIClassType, code: string, name: string) => {
+ setNode(dataId, (oldNode) => {
+ let newNode = cloneDeep(oldNode);
+
+ newNode.data = {
+ ...newNode.data,
+ node: newNodeClass,
+ description: newNodeClass.description ?? dataNode.description,
+ display_name: newNodeClass.display_name ?? dataNode.display_name,
+ };
+
+ newNode.data.node.template[name].value = code;
+ setIsOutdated(false);
+
+ return newNode;
+ });
+
+ updateNodeInternals(dataId);
+ },
+ [dataId, dataNode, setNode, setIsOutdated, updateNodeInternals],
+ );
+
+ return updateNodeCode;
+};
+
+export default useUpdateNodeCode;
diff --git a/src/frontend/src/customNodes/hooks/use-update-validation-status.tsx b/src/frontend/src/customNodes/hooks/use-update-validation-status.tsx
new file mode 100644
index 000000000..2a7153dfb
--- /dev/null
+++ b/src/frontend/src/customNodes/hooks/use-update-validation-status.tsx
@@ -0,0 +1,18 @@
+import { useEffect } from "react";
+
+const useUpdateValidationStatus = (dataId, flowPool, setValidationStatus) => {
+ useEffect(() => {
+ const relevantData =
+ flowPool[dataId] && flowPool[dataId]?.length > 0
+ ? flowPool[dataId][flowPool[dataId].length - 1]
+ : null;
+ if (relevantData) {
+ // Extract validation information from relevantData and update the validationStatus state
+ setValidationStatus(relevantData);
+ } else {
+ setValidationStatus(null);
+ }
+ }, [flowPool[dataId], dataId, setValidationStatus]);
+};
+
+export default useUpdateValidationStatus;
diff --git a/src/frontend/src/customNodes/hooks/use-validation-status-string.tsx b/src/frontend/src/customNodes/hooks/use-validation-status-string.tsx
new file mode 100644
index 000000000..9447bb643
--- /dev/null
+++ b/src/frontend/src/customNodes/hooks/use-validation-status-string.tsx
@@ -0,0 +1,22 @@
+import { useEffect } from "react";
+
+const useValidationStatusString = (validationStatus, setValidationString) => {
+ useEffect(() => {
+ if (validationStatus?.data.logs) {
+ // if it is not a string turn it into a string
+ let newValidationString = "";
+ if (Array.isArray(validationStatus.data.logs)) {
+ newValidationString = validationStatus.data.logs
+ .map((log) => log.message)
+ .join("\n");
+ }
+ if (typeof newValidationString !== "string") {
+ newValidationString = JSON.stringify(validationStatus.data.logs);
+ }
+
+ setValidationString(newValidationString);
+ }
+ }, [validationStatus, validationStatus?.data.logs, setValidationString]);
+};
+
+export default useValidationStatusString;