From e6dfcc960c9976a819f0b659df90eccf70799ee1 Mon Sep 17 00:00:00 2001
From: Max Frederiksen <maxfrederiksen@Maxs-MacBook-Air.local>
Date: Wed, 13 Nov 2024 13:22:20 +0100
Subject: [PATCH] IOC components

---
 .../IOC/IOCLiveStatus/IOCLiveStatus.jsx       | 24 +++----
 src/views/IOC/IOCDetailsContainer.jsx         | 15 +----
 src/views/IOC/IOCDetailsView.jsx              | 66 ++-----------------
 src/views/IOC/IOCListView.tsx                 | 63 +++---------------
 4 files changed, 24 insertions(+), 144 deletions(-)

diff --git a/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx b/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx
index 6bd7994e..1f8b701e 100644
--- a/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx
+++ b/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx
@@ -1,4 +1,4 @@
-import { useCallback } from "react";
+import { useCallback, useState } from "react";
 import { Typography } from "@mui/material";
 import {
   SimpleAccordion,
@@ -10,18 +10,12 @@ import { LokiPanel } from "../../common/Loki/LokiPanel";
 import { RecordSearch } from "../../records/RecordSearch";
 import { GitRefLink } from "../../common/Git/GitRefLink";
 import AccessControl from "../../auth/AccessControl";
-import useUrlState from "@ahooksjs/use-url-state";
-import { serialize, deserialize } from "../../common/URLState/URLState";
 
 export function IOCLiveStatus({ ioc }) {
-  const [state, setState] = useUrlState(
-    {
-      procserv_log_open: "true",
-      records_open: "false",
-      log_stream_open: "false"
-    },
-    { navigateMode: "replace" }
-  );
+  const [accordionState, setAccordionState] = useState({
+    logStreamOpen: false,
+    recordsOpen: false
+  });
 
   const hostName = ioc.activeDeployment?.host?.hostName;
   const externalIdValid = ioc.activeDeployment?.host?.externalIdValid;
@@ -81,9 +75,9 @@ export function IOCLiveStatus({ ioc }) {
                 IOC log stream
               </Typography>
             }
-            expanded={deserialize(state.log_stream_open)}
+            expanded={accordionState.logStreamOpen}
             onChange={(_, expanded) =>
-              setState({ log_stream_open: serialize(expanded) })
+              setAccordionState({ ...accordionState, logStreamOpen: expanded })
             }
           >
             {hostName && (
@@ -103,9 +97,9 @@ export function IOCLiveStatus({ ioc }) {
               Records
             </Typography>
           }
-          expanded={deserialize(state.records_open)}
+          expanded={accordionState.recordsOpen}
           onChange={(_, expanded) =>
-            setState({ records_open: serialize(expanded) })
+            setAccordionState({ ...accordionState, recordsOpen: expanded })
           }
         >
           <RecordSearch
diff --git a/src/views/IOC/IOCDetailsContainer.jsx b/src/views/IOC/IOCDetailsContainer.jsx
index f89a4ac4..b8e38f54 100644
--- a/src/views/IOC/IOCDetailsContainer.jsx
+++ b/src/views/IOC/IOCDetailsContainer.jsx
@@ -3,13 +3,10 @@ import { IOCDetailsView } from "./IOCDetailsView";
 import { LinearProgress } from "@mui/material";
 import NotFoundView from "../../components/navigation/NotFoundView/NotFoundView";
 import { onFetchEntityError } from "../../components/common/Helper";
-import { userContext, useAPIMethod } from "@ess-ics/ce-ui-common";
-import useUrlState from "@ahooksjs/use-url-state";
+import { useAPIMethod } from "@ess-ics/ce-ui-common";
 import { apiContext } from "../../api/DeployApi";
 
 export function IOCDetailsContainer({ id }) {
-  const { user } = useContext(userContext);
-  const [urlState] = useUrlState();
   const [error, setError] = useState(null);
 
   const client = useContext(apiContext);
@@ -38,16 +35,6 @@ export function IOCDetailsContainer({ id }) {
     }
   }, [fetchError]);
 
-  useEffect(() => {
-    // user logs in => clear error message, and try to re-request userInfo
-    if (user) {
-      setError(null);
-    } else if (!user && urlState?.tab) {
-      // user is not logged in => show a message
-      setError({ message: "Unauthorized", status: "401" });
-    }
-  }, [urlState, user]);
-
   if (error) {
     return (
       <NotFoundView
diff --git a/src/views/IOC/IOCDetailsView.jsx b/src/views/IOC/IOCDetailsView.jsx
index 699b3268..cd811efa 100644
--- a/src/views/IOC/IOCDetailsView.jsx
+++ b/src/views/IOC/IOCDetailsView.jsx
@@ -17,11 +17,6 @@ import {
   usePagination,
   usePolling
 } from "@ess-ics/ce-ui-common";
-import useUrlState from "@ahooksjs/use-url-state";
-import {
-  serialize,
-  deserialize
-} from "../../components/common/URLState/URLState";
 import { apiContext } from "../../api/DeployApi";
 
 const IOC_POLL_INTERVAL = 10000;
@@ -33,15 +28,6 @@ export function IOCDetailsView({ ioc, getIOC, abortGetIOC, loading }) {
     }
   }, [ioc, setTitle]);
 
-  const [urlState, setUrlState] = useUrlState(
-    {
-      tab: "Status",
-      jobs_rows: "20",
-      jobs_page: "0"
-    },
-    { navigateMode: "replace" }
-  );
-
   const [buttonDisabled, setButtonDisabled] = useState(false);
   const navigate = useNavigate();
 
@@ -78,48 +64,21 @@ export function IOCDetailsView({ ioc, getIOC, abortGetIOC, loading }) {
     call: false
   });
 
-  const jobUrlPagination = useMemo(() => {
-    return {
-      rows: deserialize(urlState.jobs_rows),
-      page: deserialize(urlState.jobs_page)
-    };
-  }, [urlState.jobs_rows, urlState.jobs_page]);
-
-  const setJobUrlPagination = useCallback(
-    (params) => {
-      setUrlState({
-        jobs_rows: serialize(params.rows),
-        jobs_page: serialize(params.page)
-      });
-    },
-    [setUrlState]
-  );
-
   const rowsPerPage = [20, 50];
 
   const { pagination: jobPagination, setPagination: setJobPagination } =
     usePagination({
       rowsPerPageOptions: rowsPerPage,
-      initLimit: jobUrlPagination.rows ?? rowsPerPage[0],
-      initPage: jobUrlPagination.page ?? 0
+      initLimit: rowsPerPage[0],
+      initPage: 0
     });
+  const [tabIndex, setTabIndex] = useState(0);
 
   // update pagination whenever search result total pages change
   useEffect(() => {
     setJobPagination({ totalCount: jobs?.totalCount ?? 0 });
   }, [setJobPagination, jobs?.totalCount]);
 
-  // whenever url state changes, update pagination
-  useEffect(() => {
-    setJobPagination({ ...jobUrlPagination });
-  }, [setJobPagination, jobUrlPagination]);
-
-  // whenever table pagination internally changes (user clicks next page etc)
-  // update the row params
-  useEffect(() => {
-    setJobUrlPagination(jobPagination);
-  }, [jobPagination, setJobUrlPagination]);
-
   // Invoked by Table on change to pagination
   const onPage = useCallback(
     (params) => {
@@ -141,10 +100,6 @@ export function IOCDetailsView({ ioc, getIOC, abortGetIOC, loading }) {
     setButtonDisabled(Boolean(ioc?.operationInProgress));
   }, [ioc?.operationInProgress]);
 
-  const onTabChange = (index, label) => {
-    setUrlState({ tab: serialize(label) });
-  };
-
   const callGetJobs = useCallback(() => {
     let requestParams = initRequestParams(jobPagination);
     requestParams.ioc_id = ioc.id;
@@ -166,14 +121,6 @@ export function IOCDetailsView({ ioc, getIOC, abortGetIOC, loading }) {
     navigate(-1);
   };
 
-  const resetTab = useCallback(() => {
-    if (ioc?.activeDeployment) {
-      setUrlState({ tab: "Status" });
-    } else {
-      setUrlState({ tab: "Management" });
-    }
-  }, [ioc?.activeDeployment, setUrlState]);
-
   const setButtonDisabledAndUpdate = useCallback(
     (isDisabled) => {
       setButtonDisabled(isDisabled);
@@ -225,14 +172,13 @@ export function IOCDetailsView({ ioc, getIOC, abortGetIOC, loading }) {
         <IOCAdmin
           ioc={ioc}
           getIOC={getIOC}
-          resetTab={resetTab}
+          resetTab={() => setTabIndex(0)}
           buttonDisabled={buttonDisabled}
           setButtonDisabled={setButtonDisabled}
         />
       )
     });
   }
-  const initialIndex = tabs.map((it) => it.label).indexOf(urlState?.tab);
 
   return (
     <Grid
@@ -246,8 +192,8 @@ export function IOCDetailsView({ ioc, getIOC, abortGetIOC, loading }) {
       >
         <TabPanel
           tabs={tabs}
-          initialIndex={initialIndex}
-          onTabChange={onTabChange}
+          initialIndex={tabIndex}
+          onTabChange={(_, tab) => setTabIndex(tab)}
           TabsProps={{ centered: true, sx: { flex: 1 } }}
           renderTabs={(tabs) => (
             <Stack
diff --git a/src/views/IOC/IOCListView.tsx b/src/views/IOC/IOCListView.tsx
index 8c750824..a4720d4a 100644
--- a/src/views/IOC/IOCListView.tsx
+++ b/src/views/IOC/IOCListView.tsx
@@ -1,4 +1,4 @@
-import { useState, useEffect, useCallback, useMemo } from "react";
+import { useState, useEffect, useCallback } from "react";
 import { useLazyListIocsQuery, ListIocsApiArg } from "../../store/deployApi";
 import {
   useGlobalAppBarContext,
@@ -25,31 +25,17 @@ const ROWS_PER_PAGE = [20, 50];
 export const IOCListView = () => {
   const [deploymentStatus, setDeploymentStatus] =
     useState<ListIocsApiArg["deploymentStatus"]>("ALL");
+  const [tabIndex, setTabIndex] = useState(0);
   const [listIocs, { data: iocs, isFetching, error }] = useLazyListIocsQuery();
   const [urlState, setUrlState] = useUrlState(
     {
-      tab: "0",
-      rows: "20",
-      page: "0",
       query: ""
     },
     { navigateMode: "replace" }
   );
   const { setTitle }: GlobalAppBarContext = useGlobalAppBarContext();
 
-  const handleTabChange = useCallback(
-    (tab: number) => {
-      setUrlState((s) =>
-        serialize(s.tab) === serialize(tab)
-          ? { tab: serialize(tab) }
-          : { tab: serialize(tab), page: "0" }
-      );
-      changeTab(tab);
-    },
-    [setUrlState]
-  );
-
-  const changeTab = (tab: number) => {
+  const handleTabChange = (tab: number) => {
     if (tab === 0) {
       setDeploymentStatus("ALL");
     } else if (tab === 1) {
@@ -57,29 +43,13 @@ export const IOCListView = () => {
     } else if (tab === 2) {
       setDeploymentStatus("NOT_DEPLOYED");
     }
+    setTabIndex(tab);
   };
 
-  const setUrlPagination = useCallback(
-    ({ rows, page }: OnPageParams) => {
-      setUrlState({
-        rows: serialize(rows),
-        page: serialize(page)
-      });
-    },
-    [setUrlState]
-  );
-
-  const urlPagination = useMemo(() => {
-    return {
-      rows: deserialize(urlState.rows),
-      page: deserialize(urlState.page)
-    };
-  }, [urlState.rows, urlState.page]);
-
   const { pagination, setPagination } = usePagination({
     rowsPerPageOptions: ROWS_PER_PAGE,
-    initLimit: urlPagination.rows ?? ROWS_PER_PAGE[0],
-    initPage: urlPagination.page ?? 0
+    initLimit: ROWS_PER_PAGE[0],
+    initPage: 0
   });
 
   // Invoked by Table on change to pagination
@@ -97,28 +67,11 @@ export const IOCListView = () => {
 
   useEffect(() => setTitle(applicationTitle("IOCs")), [setTitle]);
 
-  useEffect(() => {
-    if (urlState.tab) {
-      changeTab(deserialize(urlState.tab));
-    }
-  }, [urlState.tab]);
-
   // update pagination whenever search result total pages change
   useEffect(() => {
     setPagination({ totalCount: iocs?.totalCount ?? 0 });
   }, [setPagination, iocs?.totalCount]);
 
-  // whenever url state changes, update pagination
-  useEffect(() => {
-    setPagination({ ...urlPagination });
-  }, [setPagination, urlPagination]);
-
-  // whenever table pagination internally changes (user clicks next page etc)
-  // update the row params
-  useEffect(() => {
-    setUrlPagination(pagination);
-  }, [pagination, setUrlPagination]);
-
   useEffect(() => {
     const requestParams = Object.assign(
       {},
@@ -127,7 +80,7 @@ export const IOCListView = () => {
     );
 
     listIocs(requestParams);
-  }, [listIocs, urlPagination, deploymentStatus, urlState.query, pagination]);
+  }, [listIocs, deploymentStatus, urlState.query, pagination]);
 
   return (
     <RootPaper>
@@ -145,7 +98,7 @@ export const IOCListView = () => {
         >
           <Grid item>
             <Tabs
-              value={deserialize(urlState.tab)}
+              value={tabIndex}
               onChange={(_, tab) => handleTabChange(tab)}
             >
               <Tab label="All" />
-- 
GitLab