From 90bc1e00ac47b3bceef7ea42e7fe1cae77396d55 Mon Sep 17 00:00:00 2001
From: Christina Jenks <christina.jenks@ess.eu>
Date: Tue, 26 Sep 2023 10:55:39 +0000
Subject: [PATCH] convert useOperation hook to common

---
 src/api/SwaggerApi.js                         | 17 -----
 .../common/notification/Watchers.js           | 63 +++++++++++++------
 src/views/jobs/JobDetailsContainer.js         | 35 ++++++++---
 3 files changed, 72 insertions(+), 43 deletions(-)

diff --git a/src/api/SwaggerApi.js b/src/api/SwaggerApi.js
index 9e29a254..5dd3f422 100644
--- a/src/api/SwaggerApi.js
+++ b/src/api/SwaggerApi.js
@@ -229,23 +229,6 @@ export function unpackOngoingOperations(input) {
   return output.totalCount > 0 ? output.operationsList[0] : null;
 }
 
-export function unpackOperation(operation) {
-  const d = { ...operation };
-  return d;
-}
-
-export function useOperation(id, onError) {
-  const api = useContext(apiContext);
-  const method = useCallAndUnpack(
-    api.apis.Deployments.fetchOperation,
-    unpackOperation
-  );
-  const boundMethod = useCallback(method.bind(null, { operation_id: id }), [
-    id
-  ]);
-  return useAsync({ fcn: boundMethod, onError: onError });
-}
-
 export function unpackJob(job) {
   return { ...job };
 }
diff --git a/src/components/common/notification/Watchers.js b/src/components/common/notification/Watchers.js
index 9d8f4525..209783f3 100644
--- a/src/components/common/notification/Watchers.js
+++ b/src/components/common/notification/Watchers.js
@@ -1,6 +1,5 @@
-import { useCallback, useEffect, useMemo, useContext } from "react";
+import { useEffect, useMemo, useContext } from "react";
 import { AdHocCommand, DeploymentStatus } from "../../../api/DataTypes";
-import { useOperation } from "../../../api/SwaggerApi";
 import { useSafePolling } from "../../../hooks/Polling";
 import { STATUS_POLL_INTERVAL } from "./Notifications";
 import {
@@ -19,8 +18,23 @@ export function DeploymentWatcher({
 }) {
   const client = useContext(apiContext);
 
-  const [deployment, getDeployment /* reset*/, , deploymentLoading] =
-    useOperation(deploymentId);
+  const deploymentParams = useMemo(
+    () => ({
+      operation_id: deploymentId
+    }),
+    [deploymentId]
+  );
+
+  const {
+    value: deployment,
+    wrapper: getDeployment,
+    loading: deploymentLoading,
+    dataReady: deploymentDataReady
+  } = useAPIMethod({
+    fcn: client.apis.Deployments.fetchOperation,
+    call: false,
+    params: deploymentParams
+  });
 
   const deploymentJobParams = useMemo(
     () => ({ awx_job_id: deployment?.awxJobId }),
@@ -29,24 +43,23 @@ export function DeploymentWatcher({
 
   const {
     value: deploymentJob,
-    wrapper: getDeploymentJobById,
+    wrapper: getDeploymentJob,
     loading: jobLoading,
-    dataReady
+    dataReady: jobDataReady
   } = useAPIMethod({
     fcn: client.apis.Deployments.fetchJobDetails,
     params: deploymentJobParams
   });
 
-  const getDeploymentJob = useCallback(() => {
-    if (deployment?.awxJobId) {
-      getDeploymentJobById(deployment?.awxJobId);
-    }
-  }, [deployment?.awxJobId, getDeploymentJobById]);
+  useSafePolling(
+    getDeployment,
+    deploymentLoading || !deploymentDataReady,
+    STATUS_POLL_INTERVAL
+  );
 
-  useSafePolling(getDeployment, deploymentLoading, STATUS_POLL_INTERVAL);
   useSafePolling(
     getDeploymentJob,
-    jobLoading || !dataReady,
+    jobLoading || !jobDataReady,
     STATUS_POLL_INTERVAL
   );
 
@@ -82,12 +95,26 @@ export function DeploymentWatcher({
 }
 
 export function CommandWatcher({ commandId, addNotification, stopWatching }) {
-  const [command, getCommand /* reset*/, , loading] = useOperation(commandId);
-  const poll = useCallback(
-    () => getCommand(commandId),
-    [commandId, getCommand]
+  const client = useContext(apiContext);
+
+  const params = useMemo(
+    () => ({
+      operation_id: commandId
+    }),
+    [commandId]
   );
-  useSafePolling(poll, loading, STATUS_POLL_INTERVAL);
+
+  const {
+    value: command,
+    wrapper: getCommand,
+    loading
+  } = useAPIMethod({
+    fcn: client.apis.Deployments.fetchOperation,
+    call: false,
+    params
+  });
+
+  useSafePolling(getCommand, loading, STATUS_POLL_INTERVAL);
 
   const commandStatus = useMemo(
     () => new AdHocCommand(command, null),
diff --git a/src/views/jobs/JobDetailsContainer.js b/src/views/jobs/JobDetailsContainer.js
index 8b9dd7bf..d6c60be5 100644
--- a/src/views/jobs/JobDetailsContainer.js
+++ b/src/views/jobs/JobDetailsContainer.js
@@ -3,11 +3,11 @@ import React, {
   useRef,
   useState,
   useContext,
-  useMemo
+  useMemo,
+  useEffect
 } from "react";
 import { JobDetailsView } from "./JobDetailsView";
 import { LinearProgress } from "@mui/material";
-import { useOperation } from "../../api/SwaggerApi";
 import { useSafePolling } from "../../hooks/Polling";
 import NotFoundView from "../../components/navigation/NotFoundView/NotFoundView";
 import { onFetchEntityError } from "../../components/common/Helper";
@@ -20,13 +20,32 @@ export function JobDetailsContainer({ id }) {
 
   const client = useContext(apiContext);
 
-  const [operation, getOperation /* reset*/, , operationLoading] = useOperation(
-    id,
-    (m, s) => {
-      // handle error code 404, and define custom message on the UI because BE sends back generic error message
-      onFetchEntityError(m, s, setNotFoundError);
-    }
+  const params = useMemo(
+    () => ({
+      operation_id: id
+    }),
+    [id]
   );
+  const {
+    value: operation,
+    wrapper: getOperation,
+    loading: operationLoading,
+    error: operationError
+  } = useAPIMethod({
+    fcn: client.apis.Deployments.fetchOperation,
+    call: false,
+    params
+  });
+
+  useEffect(() => {
+    if (operationError) {
+      onFetchEntityError(
+        operationError?.message,
+        operationError?.status,
+        setNotFoundError
+      );
+    }
+  }, [operationError]);
 
   const deploymentJobParams = useMemo(
     () => ({ awx_job_id: operation?.awxJobId }),
-- 
GitLab