From 07844b864717e69961adefe9d9d75b4992709682 Mon Sep 17 00:00:00 2001
From: Johanna Szepanski <johanna.szepanski@softhouse.se>
Date: Thu, 5 Dec 2024 12:53:53 +0100
Subject: [PATCH] restructured tab construction and migrated to typescript

---
 src/views/IOC/IOCDetailsView.jsx |  88 -------------------------
 src/views/IOC/IOCDetailsView.tsx | 109 +++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+), 88 deletions(-)
 delete mode 100644 src/views/IOC/IOCDetailsView.jsx
 create mode 100644 src/views/IOC/IOCDetailsView.tsx

diff --git a/src/views/IOC/IOCDetailsView.jsx b/src/views/IOC/IOCDetailsView.jsx
deleted file mode 100644
index e540a14e..00000000
--- a/src/views/IOC/IOCDetailsView.jsx
+++ /dev/null
@@ -1,88 +0,0 @@
-import { Grid, IconButton, Stack } from "@mui/material";
-import ArrowBackIcon from "@mui/icons-material/ArrowBack";
-import { useContext, useEffect, useState } from "react";
-import { useNavigate } from "react-router-dom";
-import {
-  GlobalAppBarContext,
-  useIsCurrentUserPermitted,
-  TabPanel
-} from "@ess-ics/ce-ui-common";
-import { IOCLiveStatus } from "../../components/IOC/IOCLiveStatus";
-import { IOCManage } from "../../components/IOC/IOCManage";
-import { IOCAdmin } from "../../components/IOC/IOCAdmin";
-import { applicationTitle } from "../../components/common/Helper";
-
-export function IOCDetailsView({ ioc }) {
-  const [tabIndex, setTabIndex] = useState(0);
-  const { setTitle } = useContext(GlobalAppBarContext);
-  const navigate = useNavigate();
-
-  useEffect(() => {
-    if (ioc) {
-      setTitle(applicationTitle(`IOC Details: ${ioc.namingName}`));
-    }
-  }, [ioc, setTitle]);
-
-  const tabs = [
-    {
-      label: "Status",
-      content: <IOCLiveStatus ioc={ioc} />
-    }
-  ];
-
-  const isPermittedManagement = useIsCurrentUserPermitted({
-    allowedRoles: ["DeploymentToolAdmin", "DeploymentToolIntegrator"]
-  });
-
-  const isPermittedAdmin = useIsCurrentUserPermitted({
-    allowedRoles: ["DeploymentToolAdmin"]
-  });
-
-  if (isPermittedManagement) {
-    tabs.push({
-      label: "Management",
-      content: <IOCManage ioc={ioc} />
-    });
-  }
-  if (isPermittedAdmin) {
-    tabs.push({
-      label: "Admin",
-      content: <IOCAdmin ioc={ioc} />
-    });
-  }
-
-  return (
-    <Grid
-      container
-      spacing={1}
-    >
-      <Grid
-        item
-        xs={12}
-        style={{ paddingBottom: 0 }}
-      >
-        <TabPanel
-          tabs={tabs}
-          initialIndex={tabIndex}
-          onTabChange={(index) => setTabIndex(index)}
-          TabsProps={{ centered: true, sx: { flex: 1 } }}
-          renderTabs={(tabs) => (
-            <Stack
-              flexDirection="row"
-              justifyContent="space-between"
-            >
-              <IconButton
-                color="inherit"
-                onClick={() => navigate(-1)}
-                size="large"
-              >
-                <ArrowBackIcon />
-              </IconButton>
-              {tabs}
-            </Stack>
-          )}
-        />
-      </Grid>
-    </Grid>
-  );
-}
diff --git a/src/views/IOC/IOCDetailsView.tsx b/src/views/IOC/IOCDetailsView.tsx
new file mode 100644
index 00000000..80df78af
--- /dev/null
+++ b/src/views/IOC/IOCDetailsView.tsx
@@ -0,0 +1,109 @@
+import { ReactNode, useEffect, useState } from "react";
+import { Grid, IconButton, Stack } from "@mui/material";
+import ArrowBackIcon from "@mui/icons-material/ArrowBack";
+import { useNavigate } from "react-router-dom";
+import {
+  useGlobalAppBarContext,
+  useIsCurrentUserPermitted,
+  TabPanel
+} from "@ess-ics/ce-ui-common";
+import { IOCLiveStatus } from "../../components/IOC/IOCLiveStatus";
+import { IOCManage } from "../../components/IOC/IOCManage";
+import { IOCAdmin } from "../../components/IOC/IOCAdmin";
+import { applicationTitle } from "../../components/common/Helper";
+import { GlobalAppBarContext } from "../../types/common";
+import { IocDetails } from "../../store/deployApi";
+
+interface IOCDetailsViewProps {
+  ioc: IocDetails;
+}
+
+interface Tab {
+  label: string;
+  content: ReactNode;
+}
+
+const getTabs = (ioc: IocDetails): Tab[] => [
+  {
+    label: "Status",
+    content: <IOCLiveStatus ioc={ioc} />
+  },
+  {
+    label: "Management",
+    content: <IOCManage ioc={ioc} />
+  },
+  {
+    label: "Admin",
+    content: <IOCAdmin ioc={ioc} />
+  }
+];
+
+export const IOCDetailsView = ({ ioc }: IOCDetailsViewProps) => {
+  const [tabIndex, setTabIndex] = useState(0);
+  const [tabs, setTabs] = useState<Tab[] | null>(null);
+  const { setTitle }: GlobalAppBarContext = useGlobalAppBarContext();
+  const navigate = useNavigate();
+
+  const isPermittedAdmin = useIsCurrentUserPermitted({
+    allowedRoles: ["DeploymentToolAdmin"]
+  });
+
+  const isPermittedManagement = useIsCurrentUserPermitted({
+    allowedRoles: ["DeploymentToolAdmin", "DeploymentToolIntegrator"]
+  });
+
+  useEffect(() => {
+    if (ioc) {
+      setTitle(applicationTitle(`IOC Details: ${ioc.namingName}`));
+    }
+  }, [ioc, setTitle]);
+
+  useEffect(() => {
+    if (ioc) {
+      if (isPermittedAdmin) {
+        setTabs(getTabs(ioc));
+      } else if (isPermittedManagement) {
+        setTabs(getTabs(ioc).filter((tab) => tab.label !== "Admin"));
+      } else {
+        setTabs(getTabs(ioc).filter((tab) => tab.label === "Status"));
+      }
+    }
+  }, [ioc, isPermittedAdmin, isPermittedManagement]);
+
+  return (
+    <Grid
+      container
+      spacing={1}
+    >
+      <Grid
+        item
+        xs={12}
+        style={{ paddingBottom: 0 }}
+      >
+        {tabs && (
+          <TabPanel
+            tabs={tabs}
+            initialIndex={tabIndex}
+            onTabChange={(index: number) => setTabIndex(index)}
+            TabsProps={{ centered: true, sx: { flex: 1 } }}
+            renderTabs={(tabs: ReactNode) => (
+              <Stack
+                flexDirection="row"
+                justifyContent="space-between"
+              >
+                <IconButton
+                  color="inherit"
+                  onClick={() => navigate(-1)}
+                  size="large"
+                >
+                  <ArrowBackIcon />
+                </IconButton>
+                {tabs}
+              </Stack>
+            )}
+          />
+        )}
+      </Grid>
+    </Grid>
+  );
+};
-- 
GitLab