From 391b72b12e962b2fbd954524acb132331ca6050a Mon Sep 17 00:00:00 2001
From: Alexander Madsen <alexander.madsen@ess.eu>
Date: Thu, 21 Sep 2023 13:32:32 +0000
Subject: [PATCH] CE-2081: Convert useRecord

---
 src/api/SwaggerApi.js                  |  7 ----
 src/views/records/RecordDetailsView.js | 49 ++++++++++++++++++++------
 2 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/src/api/SwaggerApi.js b/src/api/SwaggerApi.js
index 59444ee7..9724a8db 100644
--- a/src/api/SwaggerApi.js
+++ b/src/api/SwaggerApi.js
@@ -372,13 +372,6 @@ const emptyRecordListResponse = {
   recordList: []
 };
 
-export function useRecord(name, onError) {
-  const api = useContext(apiContext);
-  const method = useCallAndUnpack(api.apis.Records.getRecord, unpackRecord);
-  const boundMethod = useCallback(method.bind(null, { name: name }), [name]);
-  return useAsync({ fcn: boundMethod, onError: onError });
-}
-
 export function unpackLogin(loginResponse) {
   return { ...loginResponse };
 }
diff --git a/src/views/records/RecordDetailsView.js b/src/views/records/RecordDetailsView.js
index 7ae3cd86..8eca4382 100644
--- a/src/views/records/RecordDetailsView.js
+++ b/src/views/records/RecordDetailsView.js
@@ -1,5 +1,10 @@
-import React, { useEffect, useCallback, useState, useContext } from "react";
-import { useRecord } from "../../api/SwaggerApi";
+import React, {
+  useEffect,
+  useCallback,
+  useState,
+  useContext,
+  useMemo
+} from "react";
 import {
   Paper,
   IconButton,
@@ -22,17 +27,39 @@ import { useNavigate } from "react-router-dom";
 import { onFetchEntityError } from "../../components/common/Helper";
 import NotFoundView from "../../components/navigation/NotFoundView/NotFoundView";
 
+import { apiContext } from "../../api/DeployApi";
+import { useAPIMethod } from "@ess-ics/ce-ui-common";
+
 export function RecordDetailsView() {
   const { name } = useParams();
   const decodedName = decodeURIComponent(name);
-  const [notFoundError, setNotFoundError] = useState();
-  const [record /* getRecord*/ /* reset*/, , , recordLoading] = useRecord(
-    decodedName,
-    (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 [error, setError] = useState(null);
+
+  const client = useContext(apiContext);
+
+  const params = useMemo(
+    () => ({
+      name: decodedName
+    }),
+    [decodedName]
   );
+
+  const {
+    value: record,
+    error: fetchError,
+    loading: recordLoading,
+    dataReady
+  } = useAPIMethod({
+    fcn: client.apis.Records.getRecord,
+    params
+  });
+
+  useEffect(() => {
+    if (fetchError) {
+      onFetchEntityError(fetchError?.message, fetchError?.status, setError);
+    }
+  }, [fetchError]);
+
   const navigate = useNavigate();
 
   const { setTitle } = useContext(GlobalAppBarContext);
@@ -112,9 +139,9 @@ export function RecordDetailsView() {
 
   return (
     <RootContainer>
-      {notFoundError ? (
+      {error ? (
         <NotFoundView />
-      ) : recordLoading ? (
+      ) : recordLoading || !dataReady ? (
         <LinearProgress color="primary" />
       ) : (
         <Paper>
-- 
GitLab