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