From 7b70d7e61155a4b5e81459c25000cb9c2492b38d Mon Sep 17 00:00:00 2001
From: Max Frederiksen <maxfrederiksen@Maxs-MacBook-Air.local>
Date: Thu, 16 Jan 2025 13:05:46 +0100
Subject: [PATCH] MR comments

---
 src/App.tsx                                   |  7 ++--
 src/api/UserProvider.spec.tsx                 |  3 +-
 src/api/UserProvider.tsx                      | 37 ++++++++++---------
 src/api/initRequestParams.ts                  | 22 +++++++++++
 .../IOC/ChangeHostAdmin/ChangeHostAdmin.tsx   |  4 +-
 src/components/IOC/CreateIOC/CreateIOC.tsx    |  6 +--
 .../IOC/CreateIOC/RepositoryName.tsx          |  2 +-
 .../IOC/IOCDeployDialog/IOCDeployDialog.tsx   |  2 +-
 .../IOC/IOCDetailAdmin/IOCDetailAdmin.tsx     |  2 +-
 src/components/IOC/IOCDetails/IOCDetails.tsx  | 14 -------
 .../IOC/IOCLiveStatus/IOCLiveStatus.tsx       |  2 +-
 src/components/IOC/IOCManage/IOCManage.tsx    |  2 +-
 src/components/IOC/IOCManage/IOCService.tsx   |  2 +-
 src/components/IOC/IOCManage/JobSection.tsx   |  2 +-
 .../IOCUndeployDialog/IOCUndeployDialog.tsx   |  2 +-
 .../Job/JobTable/JobDetailsColumn.tsx         |  1 -
 src/components/Job/JobTable/JobTable.tsx      |  2 +-
 .../auth/AccessDenied/AccessDenied.tsx        |  2 +-
 src/components/auth/TokenRenew/TokenRenew.tsx |  2 +-
 src/components/common/Alerts/AlertsData.ts    | 11 +++---
 src/components/common/Helper.tsx              | 36 ------------------
 src/components/common/Loki/LokiPanel.tsx      | 14 ++-----
 src/components/common/Status/StatusBadge.tsx  |  9 ++---
 .../common/User/UserOperationList.tsx         |  8 +++-
 src/components/common/applicationTitle.ts     | 15 ++++++++
 src/components/common/snackbar/Snackbar.tsx   | 17 ++-------
 .../common/snackbar/SnackbarButton.tsx        | 11 ++++++
 .../NavigationMenu/LoginControls.tsx          |  6 ++-
 .../NavigationMenu/NavigationMenu.tsx         | 19 ++++++----
 .../navigation/NotFoundView/NotFoundView.tsx  |  2 +-
 src/components/records/RecordBadge.tsx        |  5 +--
 src/components/records/RecordHostLink.tsx     | 14 +++----
 src/components/records/RecordIcons.tsx        | 14 ++++---
 src/components/records/RecordSearch.tsx       |  8 ++--
 src/components/records/RecordTable.tsx        |  2 +-
 src/config/env.ts                             |  5 +--
 src/constants/index.ts                        |  1 +
 src/hooks/useTypingTimer.tsx                  |  2 +-
 src/icons/BatchUndeploySymbol.tsx             |  2 +-
 src/index.tsx                                 | 22 +++++------
 src/mocks/AppHarness.tsx                      |  5 ++-
 src/mocks/mockAPI.ts                          |  1 +
 .../common/job/JobTable.stories.tsx           |  2 +-
 global.d.ts => src/types/index.d.ts           |  0
 declaration.d.ts => src/types/typings.d.ts    |  1 +
 src/typings.d.ts                              | 10 -----
 src/views/IOC/CreateIOCView.tsx               |  2 +-
 src/views/IOC/IOCDetailsContainer.tsx         |  8 +++-
 src/views/IOC/IOCDetailsView.tsx              |  2 +-
 src/views/IOC/IOCListView.tsx                 |  6 +--
 src/views/UserPage/UserPageView.tsx           |  2 +-
 src/views/help/HelpView.tsx                   |  4 +-
 src/views/host/HostListView.tsx               | 13 +++----
 .../host/details/HostDetailsContainer.tsx     |  7 +++-
 src/views/host/details/HostDetailsView.tsx    |  4 +-
 src/views/host/details/HostIocSection.tsx     |  2 +-
 src/views/jobs/JobDetailsContainer.tsx        |  2 +-
 src/views/jobs/JobDetailsView.tsx             |  2 +-
 src/views/jobs/JobListView.tsx                |  2 +-
 src/views/jobs/JobLogAccessControl.tsx        |  4 +-
 src/views/login/LoginView.tsx                 |  2 +-
 src/views/records/RecordDetailsView.tsx       | 30 ++++++++-------
 src/views/records/RecordListView.tsx          | 10 ++---
 tsconfig.json                                 |  8 +++-
 64 files changed, 234 insertions(+), 234 deletions(-)
 create mode 100644 src/api/initRequestParams.ts
 delete mode 100644 src/components/common/Helper.tsx
 create mode 100644 src/components/common/applicationTitle.ts
 create mode 100644 src/components/common/snackbar/SnackbarButton.tsx
 rename global.d.ts => src/types/index.d.ts (100%)
 rename declaration.d.ts => src/types/typings.d.ts (77%)
 delete mode 100644 src/typings.d.ts

diff --git a/src/App.tsx b/src/App.tsx
index eca00b16..b6c7db91 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -20,12 +20,13 @@ import { JobLogAccessControl } from "./views/jobs/JobLogAccessControl";
 import { RecordListView } from "./views/records/RecordListView";
 import { RecordDetailsView } from "./views/records/RecordDetailsView";
 import { TestErrorView } from "./views/TestErrorView";
-import { applicationTitle } from "./components/common/Helper";
+import { applicationTitle } from "./components/common/applicationTitle";
 import { CreateIOCAccessControl } from "./views/IOC/CreateIOCAccessControl";
 import { UserDetailsAccessControl } from "./views/UserPage/UserDetailsAccessControl";
 import { ReduxProvider } from "./store/ReduxProvider";
-import env from "./config/env";
+import { env } from "./config/env";
 import { GlobalAppBarContext as GlobalAppBarContextType } from "./types/common";
+import { MAX_SNACK } from "./constants";
 
 // setting up the application (TAB)title
 function App() {
@@ -38,7 +39,7 @@ function App() {
         <BrowserRouter>
           <SnackbarProvider
             preventDuplicate
-            maxSnack={5}
+            maxSnack={MAX_SNACK}
           >
             <StyledEngineProvider injectFirst>
               <ThemeProvider theme={theme}>
diff --git a/src/api/UserProvider.spec.tsx b/src/api/UserProvider.spec.tsx
index ec8cd1fe..b52cf898 100644
--- a/src/api/UserProvider.spec.tsx
+++ b/src/api/UserProvider.spec.tsx
@@ -4,6 +4,7 @@ import { SnackbarProvider } from "notistack";
 import { UserProvider } from "./UserProvider";
 import { ReduxProvider } from "../store/ReduxProvider";
 import { UserContext } from "../types/common";
+import { MAX_SNACK } from "../constants";
 
 function DisplayUserContextValue() {
   const contextValue = useContext(userContext);
@@ -30,7 +31,7 @@ describe("UserProvider", () => {
         <ReduxProvider>
           <SnackbarProvider
             preventDuplicate
-            maxSnack={5}
+            maxSnack={MAX_SNACK}
           >
             <UserProvider>
               <LoginTrigger />
diff --git a/src/api/UserProvider.tsx b/src/api/UserProvider.tsx
index a2aeb551..3d39cf19 100644
--- a/src/api/UserProvider.tsx
+++ b/src/api/UserProvider.tsx
@@ -1,47 +1,48 @@
-import { useCallback, useEffect, useState, type ReactNode } from "react";
+import { useCallback, useEffect, useState, ReactNode } from "react";
 import { userContext } from "@ess-ics/ce-ui-common";
 import {
   useLoginMutation,
   useLogoutMutation,
   useInfoFromUserNameQuery,
   useGetUserRolesQuery,
-  InfoFromUserNameApiResponse,
+  UserInfoResponse,
   GetUserRolesApiResponse
 } from "../store/deployApi";
 import { getErrorState } from "../components/common/Alerts/AlertsData";
 
 export function UserProvider({ children }: { children: ReactNode }) {
-  const [user, setUser] = useState<InfoFromUserNameApiResponse | undefined>(
-    undefined
-  );
+  const [user, setUser] = useState<UserInfoResponse | undefined>(undefined);
   const [userRoles, setUserRoles] = useState<
     GetUserRolesApiResponse | undefined
   >(undefined);
 
   const [
     callLogin,
-    {
-      data: loginResponse,
-      error: loginError,
-      isLoading: loginLoading,
-      reset: resetLogin
-    }
+    { error: loginError, isLoading: loginLoading, reset: resetLogin }
   ] = useLoginMutation();
   const [callLogout, { isLoading: logoutLoading }] = useLogoutMutation();
-  const { data: userResponse, isLoading: userLoading } =
-    useInfoFromUserNameQuery({}, { skip: !loginResponse });
-  const { data: userRolesResponse, isLoading: userRolesLoading } =
-    useGetUserRolesQuery(undefined, { skip: !loginResponse });
+  const {
+    data: userResponse,
+    isLoading: userLoading,
+    refetch: refetchUserInfo
+  } = useInfoFromUserNameQuery({});
+  const {
+    data: userRolesResponse,
+    isLoading: userRolesLoading,
+    refetch: refetchUserRoles
+  } = useGetUserRolesQuery(undefined);
 
   const initialized = Boolean(
     !loginLoading || !logoutLoading || !userLoading || !userRolesLoading
   );
 
   const login = useCallback(
-    (username: string, password: string) => {
-      callLogin({ login: { userName: username, password } });
+    async (username: string, password: string) => {
+      await callLogin({ login: { userName: username, password } });
+      refetchUserInfo();
+      refetchUserRoles();
     },
-    [callLogin]
+    [callLogin, refetchUserInfo, refetchUserRoles]
   );
 
   useEffect(() => {
diff --git a/src/api/initRequestParams.ts b/src/api/initRequestParams.ts
new file mode 100644
index 00000000..a08a5364
--- /dev/null
+++ b/src/api/initRequestParams.ts
@@ -0,0 +1,22 @@
+import { Pagination } from "../types/common";
+
+interface initRequestParamsProps {
+  pagination: Pagination;
+  filter?: string;
+}
+
+export function initRequestParams({
+  pagination,
+  filter
+}: initRequestParamsProps) {
+  const requestParams = {
+    page: pagination.page,
+    limit: pagination.rows,
+    query: ""
+  };
+  if (filter != null && filter) {
+    requestParams.query = filter;
+  }
+
+  return requestParams;
+}
diff --git a/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.tsx b/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.tsx
index b9563571..d1bd7c2f 100644
--- a/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.tsx
+++ b/src/components/IOC/ChangeHostAdmin/ChangeHostAdmin.tsx
@@ -3,8 +3,8 @@ import {
   useEffect,
   useCallback,
   useMemo,
-  type SetStateAction,
-  type Dispatch
+  SetStateAction,
+  Dispatch
 } from "react";
 import { ConfirmationDialog } from "@ess-ics/ce-ui-common";
 import {
diff --git a/src/components/IOC/CreateIOC/CreateIOC.tsx b/src/components/IOC/CreateIOC/CreateIOC.tsx
index 5a96e6fc..515d92cd 100644
--- a/src/components/IOC/CreateIOC/CreateIOC.tsx
+++ b/src/components/IOC/CreateIOC/CreateIOC.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useState, type KeyboardEvent } from "react";
+import { useEffect, useState, KeyboardEvent } from "react";
 import { useNavigate } from "react-router-dom";
 import { RootPaper } from "@ess-ics/ce-ui-common";
 import {
@@ -16,8 +16,8 @@ import { RepositoryName } from "./RepositoryName";
 import { useTypingTimer } from "../../../hooks/useTypingTimer";
 import { useCustomSnackbar } from "../../common/snackbar";
 import {
-  type GitProject,
-  type NameResponse,
+  GitProject,
+  NameResponse,
   useCreateIocMutation,
   useLazyFetchIocByNameQuery,
   useLazyListProjectsQuery
diff --git a/src/components/IOC/CreateIOC/RepositoryName.tsx b/src/components/IOC/CreateIOC/RepositoryName.tsx
index 9e66d142..e4d015a0 100644
--- a/src/components/IOC/CreateIOC/RepositoryName.tsx
+++ b/src/components/IOC/CreateIOC/RepositoryName.tsx
@@ -1,4 +1,4 @@
-import { useState, useCallback, type ChangeEvent } from "react";
+import { useState, useCallback, ChangeEvent } from "react";
 import { Box, Stack, TextField, Typography } from "@mui/material";
 import { string, func } from "prop-types";
 
diff --git a/src/components/IOC/IOCDeployDialog/IOCDeployDialog.tsx b/src/components/IOC/IOCDeployDialog/IOCDeployDialog.tsx
index 456c653d..886a6d6b 100644
--- a/src/components/IOC/IOCDeployDialog/IOCDeployDialog.tsx
+++ b/src/components/IOC/IOCDeployDialog/IOCDeployDialog.tsx
@@ -24,7 +24,7 @@ import {
 import { getErrorState } from "../../common/Alerts/AlertsData";
 import { ApiAlertError } from "../../common/Alerts/ApiAlertError";
 import { useStartJobMutation } from "../../../store/enhancedApi";
-import type { ApiError, DeployIocFormDefaults } from "../../../types/common";
+import { ApiError, DeployIocFormDefaults } from "../../../types/common";
 
 export type StartJobMutationTrigger = ReturnType<typeof useStartJobMutation>[0];
 interface IOCDeployDialogProps {
diff --git a/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.tsx b/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.tsx
index 83f86029..3e26ded6 100644
--- a/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.tsx
+++ b/src/components/IOC/IOCDetailAdmin/IOCDetailAdmin.tsx
@@ -14,7 +14,7 @@ import { AccessControl } from "../../auth/AccessControl";
 import {
   useLazyListProjectsQuery,
   useLazyFetchIocByNameQuery,
-  type IocDetails,
+  IocDetails,
   NameResponse
 } from "../../../store/deployApi";
 import { useUpdateIocMutation } from "../../../store/enhancedApi";
diff --git a/src/components/IOC/IOCDetails/IOCDetails.tsx b/src/components/IOC/IOCDetails/IOCDetails.tsx
index 9edf79c0..6ae05e92 100644
--- a/src/components/IOC/IOCDetails/IOCDetails.tsx
+++ b/src/components/IOC/IOCDetails/IOCDetails.tsx
@@ -9,20 +9,6 @@ interface IOCDetailsProps {
   getSubset: (
     ioc: IocDetails
   ) => Record<string, string | JSX.Element | undefined> | undefined;
-  // getSubset: (ioc: IocDetails) => {
-  //   Description: string | undefined;
-  //   Revision: JSX.Element;
-  //   "Deployed on": JSX.Element;
-  // };
-
-  // getSubset: (ioc: IocDetails) =>
-  //   | {
-  //       "Naming service record": JSX.Element;
-  //       Repository: JSX.Element;
-  //       "Created by": JSX.Element;
-  //       "IOC Service Controls": JSX.Element;
-  //     }
-  //   | undefined;
   buttons?: JSX.Element;
 }
 
diff --git a/src/components/IOC/IOCLiveStatus/IOCLiveStatus.tsx b/src/components/IOC/IOCLiveStatus/IOCLiveStatus.tsx
index ceae8e05..3ca87ebf 100644
--- a/src/components/IOC/IOCLiveStatus/IOCLiveStatus.tsx
+++ b/src/components/IOC/IOCLiveStatus/IOCLiveStatus.tsx
@@ -1,4 +1,4 @@
-import { useCallback, useState, type ChangeEvent } from "react";
+import { useCallback, useState, ChangeEvent } from "react";
 import { Typography } from "@mui/material";
 import {
   SimpleAccordion,
diff --git a/src/components/IOC/IOCManage/IOCManage.tsx b/src/components/IOC/IOCManage/IOCManage.tsx
index 715c293f..a4f8e25a 100644
--- a/src/components/IOC/IOCManage/IOCManage.tsx
+++ b/src/components/IOC/IOCManage/IOCManage.tsx
@@ -12,7 +12,7 @@ import {
   IocDetails,
   useLazyFetchJobStatusQuery
 } from "../../../store/deployApi";
-import env from "../../../config/env";
+import { env } from "../../../config/env";
 import { UserContext } from "../../../types/common";
 
 export const IOCManage = ({ ioc }: { ioc: IocDetails }) => {
diff --git a/src/components/IOC/IOCManage/IOCService.tsx b/src/components/IOC/IOCManage/IOCService.tsx
index 5a1ac6af..8072be14 100644
--- a/src/components/IOC/IOCManage/IOCService.tsx
+++ b/src/components/IOC/IOCManage/IOCService.tsx
@@ -11,7 +11,7 @@ import { ConfirmationDialog } from "@ess-ics/ce-ui-common";
 import { AccessControl } from "../../auth/AccessControl";
 import { useStartJobMutation } from "../../../store/enhancedApi";
 import { ApiAlertError } from "../../common/Alerts/ApiAlertError";
-import type { IocDetails, Job } from "../../../store/deployApi";
+import { IocDetails, Job } from "../../../store/deployApi";
 
 export function IOCService({ ioc }: { ioc: IocDetails }) {
   const navigate = useNavigate();
diff --git a/src/components/IOC/IOCManage/JobSection.tsx b/src/components/IOC/IOCManage/JobSection.tsx
index 583b1a55..84b7e955 100644
--- a/src/components/IOC/IOCManage/JobSection.tsx
+++ b/src/components/IOC/IOCManage/JobSection.tsx
@@ -2,7 +2,7 @@ import { useEffect } from "react";
 import { Stack, Typography } from "@mui/material";
 import { usePagination } from "@ess-ics/ce-ui-common";
 import { useListJobsQuery, IocDetails } from "../../../store/deployApi";
-import { initRequestParams } from "../../common/Helper";
+import { initRequestParams } from "../../../api/initRequestParams";
 import { ROWS_PER_PAGE } from "../../../constants";
 import { JobTable } from "../../Job";
 
diff --git a/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.tsx b/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.tsx
index 327ea1ba..2ac52150 100644
--- a/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.tsx
+++ b/src/components/IOC/IOCUndeployDialog/IOCUndeployDialog.tsx
@@ -1,4 +1,4 @@
-import { type SyntheticEvent } from "react";
+import { SyntheticEvent } from "react";
 import { Stack, Typography, Button } from "@mui/material";
 import { Dialog } from "@ess-ics/ce-ui-common";
 import { ApiAlertError } from "../../common/Alerts/ApiAlertError";
diff --git a/src/components/Job/JobTable/JobDetailsColumn.tsx b/src/components/Job/JobTable/JobDetailsColumn.tsx
index 11aa15ea..30916658 100644
--- a/src/components/Job/JobTable/JobDetailsColumn.tsx
+++ b/src/components/Job/JobTable/JobDetailsColumn.tsx
@@ -7,7 +7,6 @@ import { ACTION_TYPES } from "../JobData";
 import { JobRevisionChip } from "../JobRevisionChip";
 import { Job } from "../../../store/deployApi";
 
-// Ask johanna regarding batch jobs
 export const JobDetailsColumn = ({ job }: { job: Job }) => {
   const isBatchOperation = isBatchJob(job.action);
 
diff --git a/src/components/Job/JobTable/JobTable.tsx b/src/components/Job/JobTable/JobTable.tsx
index bc7d261c..9c7f3845 100644
--- a/src/components/Job/JobTable/JobTable.tsx
+++ b/src/components/Job/JobTable/JobTable.tsx
@@ -1,6 +1,6 @@
 import { useState, useEffect } from "react";
 import { Table, InternalLink } from "@ess-ics/ce-ui-common";
-import { type GridColDef } from "@mui/x-data-grid";
+import { GridColDef } from "@mui/x-data-grid";
 import { JobStatusColumn } from "./JobStatusColumn";
 import { JobDetailsColumn } from "./JobDetailsColumn";
 import { UserAvatar } from "../../common/User/UserAvatar";
diff --git a/src/components/auth/AccessDenied/AccessDenied.tsx b/src/components/auth/AccessDenied/AccessDenied.tsx
index 22f41e48..7817f8ea 100644
--- a/src/components/auth/AccessDenied/AccessDenied.tsx
+++ b/src/components/auth/AccessDenied/AccessDenied.tsx
@@ -1,5 +1,5 @@
 import { ServerErrorPage } from "@ess-ics/ce-ui-common";
-import env from "../../../config/env";
+import { env } from "../../../config/env";
 
 export const AccessDenied = () => {
   return (
diff --git a/src/components/auth/TokenRenew/TokenRenew.tsx b/src/components/auth/TokenRenew/TokenRenew.tsx
index 0353c6c6..f40eab66 100644
--- a/src/components/auth/TokenRenew/TokenRenew.tsx
+++ b/src/components/auth/TokenRenew/TokenRenew.tsx
@@ -1,6 +1,6 @@
 import { useContext, useEffect } from "react";
 import { userContext } from "@ess-ics/ce-ui-common";
-import env from "../../../config/env";
+import { env } from "../../../config/env";
 import { useTokenRenewMutation } from "../../../store/deployApi";
 import { UserContext } from "../../../types/common";
 
diff --git a/src/components/common/Alerts/AlertsData.ts b/src/components/common/Alerts/AlertsData.ts
index b792fbeb..1179fb87 100644
--- a/src/components/common/Alerts/AlertsData.ts
+++ b/src/components/common/Alerts/AlertsData.ts
@@ -8,12 +8,7 @@ interface BrowserError {
 }
 
 const isBrowserError = (
-  error:
-    | BrowserError
-    | FetchBaseQueryError
-    | SerializedError
-    | BrowserError
-    | unknown
+  error: BrowserError | FetchBaseQueryError | SerializedError | unknown
 ) => {
   return (
     error != null &&
@@ -69,6 +64,10 @@ export const getErrorState = (
         status: browserError.status
       };
     }
+    return {
+      message: "Unknown Error",
+      status: 0
+    };
   }
   return {
     message: "",
diff --git a/src/components/common/Helper.tsx b/src/components/common/Helper.tsx
deleted file mode 100644
index 2b640b7e..00000000
--- a/src/components/common/Helper.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import env from "../../config/env";
-import { Pagination } from "../../types/common";
-
-function applicationSubTitle() {
-  const title = `${env.ENVIRONMENT_TITLE}`;
-
-  if (title && title !== "undefined") {
-    return " - " + title;
-  }
-
-  return "";
-}
-
-export function applicationTitle(title: string = "") {
-  return [`CE deploy & monitor ${applicationSubTitle()}`, title].join(" / ");
-}
-interface initRequestParamsProps {
-  pagination: Pagination;
-  filter?: string;
-}
-
-export function initRequestParams({
-  pagination,
-  filter
-}: initRequestParamsProps) {
-  const requestParams = {
-    page: pagination.page,
-    limit: pagination.rows,
-    query: ""
-  };
-  if (filter != null && filter) {
-    requestParams.query = filter;
-  }
-
-  return requestParams;
-}
diff --git a/src/components/common/Loki/LokiPanel.tsx b/src/components/common/Loki/LokiPanel.tsx
index 2718bb19..4404827b 100644
--- a/src/components/common/Loki/LokiPanel.tsx
+++ b/src/components/common/Loki/LokiPanel.tsx
@@ -3,16 +3,11 @@ import {
   useEffect,
   useCallback,
   useMemo,
-  type Dispatch,
-  type SetStateAction
+  Dispatch,
+  SetStateAction
 } from "react";
-import {
-  Stack,
-  LinearProgress,
-  Box,
-  type SelectChangeEvent
-} from "@mui/material";
-import { closeSnackbar } from "notistack";
+import { Stack, LinearProgress, Box, SelectChangeEvent } from "@mui/material";
+import { SnackbarKey, closeSnackbar } from "notistack";
 import { formatDateAndTime } from "@ess-ics/ce-ui-common";
 import Convert from "ansi-to-html";
 import {
@@ -27,7 +22,6 @@ import { LogStreamConsoleDialog } from "../LogStream/LogStreamConsoleDialog";
 import { TimeRange } from "../Inputs/TimeRange";
 import { PopoutButton } from "../Buttons/PopoutButton";
 import { useCustomSnackbar } from "../snackbar/Snackbar";
-import type { SnackbarKey } from "notistack";
 
 const TIME_RANGE_VALUES = [
   {
diff --git a/src/components/common/Status/StatusBadge.tsx b/src/components/common/Status/StatusBadge.tsx
index 3cedb480..34394e5e 100644
--- a/src/components/common/Status/StatusBadge.tsx
+++ b/src/components/common/Status/StatusBadge.tsx
@@ -1,6 +1,6 @@
-import { type ReactNode } from "react";
+import { ReactNode } from "react";
 import { string, object, arrayOf, oneOfType, node } from "prop-types";
-import { Stack, useTheme } from "@mui/material";
+import { Stack } from "@mui/material";
 import WarningAmberIcon from "@mui/icons-material/WarningAmber";
 import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
 import { STATUS } from "./StatusData";
@@ -24,7 +24,6 @@ interface StatusBadgeProps {
 }
 
 export const StatusBadge = ({ status, children }: StatusBadgeProps) => {
-  const theme = useTheme();
   const showWarning =
     status === STATUS.warning ||
     status === STATUS.inactiveWarning ||
@@ -40,12 +39,12 @@ export const StatusBadge = ({ status, children }: StatusBadgeProps) => {
       {children}
       {showWarning && (
         <WarningAmberIcon
-          sx={{ fill: theme.palette.warning.main, ...commonStyles }}
+          sx={{ fill: (theme) => theme.palette.warning.main, ...commonStyles }}
         />
       )}
       {showError && (
         <ErrorOutlineIcon
-          sx={{ fill: theme.palette.error.main, ...commonStyles }}
+          sx={{ fill: (theme) => theme.palette.error.main, ...commonStyles }}
         />
       )}
     </Stack>
diff --git a/src/components/common/User/UserOperationList.tsx b/src/components/common/User/UserOperationList.tsx
index 51c868fd..7b8e252a 100644
--- a/src/components/common/User/UserOperationList.tsx
+++ b/src/components/common/User/UserOperationList.tsx
@@ -1,7 +1,7 @@
 import { useCallback, useEffect } from "react";
 import { Typography } from "@mui/material";
 import { usePagination } from "@ess-ics/ce-ui-common";
-import { initRequestParams } from "../Helper";
+import { initRequestParams } from "../../../api/initRequestParams";
 import { JobTable } from "../../Job";
 import {
   DEFAULT_POLLING_INTERVAL_MILLIS,
@@ -10,7 +10,11 @@ import {
 import { useLazyListJobsQuery } from "../../../store/deployApi";
 import { OnPageParams } from "../../../types/common";
 
-export function UserOperationList({ userName }: { userName?: string }) {
+interface UserOperationListProps {
+  userName?: string;
+}
+
+export function UserOperationList({ userName }: UserOperationListProps) {
   const [getJobs, { data: jobs, isLoading }] = useLazyListJobsQuery({
     pollingInterval: DEFAULT_POLLING_INTERVAL_MILLIS
   });
diff --git a/src/components/common/applicationTitle.ts b/src/components/common/applicationTitle.ts
new file mode 100644
index 00000000..b2861ff4
--- /dev/null
+++ b/src/components/common/applicationTitle.ts
@@ -0,0 +1,15 @@
+import { env } from "../../config/env";
+
+function applicationSubTitle() {
+  const title = `${env.ENVIRONMENT_TITLE}`;
+
+  if (title && title !== "undefined") {
+    return " - " + title;
+  }
+
+  return "";
+}
+
+export function applicationTitle(title: string = "") {
+  return [`CE deploy & monitor ${applicationSubTitle()}`, title].join(" / ");
+}
diff --git a/src/components/common/snackbar/Snackbar.tsx b/src/components/common/snackbar/Snackbar.tsx
index 3c33e571..2709355f 100644
--- a/src/components/common/snackbar/Snackbar.tsx
+++ b/src/components/common/snackbar/Snackbar.tsx
@@ -1,17 +1,8 @@
 import { useCallback } from "react";
 import { useSnackbar, SnackbarKey } from "notistack";
-import { Button, styled } from "@mui/material";
+import { SnackbarButton } from "./SnackbarButton";
 
-// eslint-disable-next-line react-refresh/only-export-components
-const SnackbarButton = styled(Button)(() => ({
-  color: "#f0f0f0",
-  borderColor: "#f0f0f0",
-  "&:hover": {
-    backgroundColor: "#8d8d8d",
-    borderColor: "#8d8d8d",
-    boxShadow: "none"
-  }
-}));
+const AUTO_HIDE_DURATION = 3000;
 
 export function useCustomSnackbar() {
   const { enqueueSnackbar, closeSnackbar } = useSnackbar();
@@ -42,7 +33,7 @@ export function useCustomSnackbar() {
     (message: string) => {
       return enqueueSnackbar(message, {
         variant: "success",
-        autoHideDuration: 3000
+        autoHideDuration: AUTO_HIDE_DURATION
       });
     },
     [enqueueSnackbar]
@@ -52,7 +43,7 @@ export function useCustomSnackbar() {
     (message: string) => {
       return enqueueSnackbar(message, {
         variant: "warning",
-        autoHideDuration: 3000
+        autoHideDuration: AUTO_HIDE_DURATION
       });
     },
     [enqueueSnackbar]
diff --git a/src/components/common/snackbar/SnackbarButton.tsx b/src/components/common/snackbar/SnackbarButton.tsx
new file mode 100644
index 00000000..ed36006f
--- /dev/null
+++ b/src/components/common/snackbar/SnackbarButton.tsx
@@ -0,0 +1,11 @@
+import { Button, styled } from "@mui/material";
+
+export const SnackbarButton = styled(Button)(() => ({
+  color: "#f0f0f0",
+  borderColor: "#f0f0f0",
+  "&:hover": {
+    backgroundColor: "#8d8d8d",
+    borderColor: "#8d8d8d",
+    boxShadow: "none"
+  }
+}));
diff --git a/src/components/navigation/NavigationMenu/LoginControls.tsx b/src/components/navigation/NavigationMenu/LoginControls.tsx
index ac096a18..d8997881 100644
--- a/src/components/navigation/NavigationMenu/LoginControls.tsx
+++ b/src/components/navigation/NavigationMenu/LoginControls.tsx
@@ -11,7 +11,11 @@ import {
 import { useNavigate } from "react-router-dom";
 import { User, UserContext } from "../../../types/common";
 
-export const ProfileMenu = ({ user }: { user: User }) => {
+interface ProfileMenuProps {
+  user: User;
+}
+
+export const ProfileMenu = ({ user }: ProfileMenuProps) => {
   const { userRoles, logout } = useContext<UserContext>(userContext);
   const navigate = useNavigate();
 
diff --git a/src/components/navigation/NavigationMenu/NavigationMenu.tsx b/src/components/navigation/NavigationMenu/NavigationMenu.tsx
index 3194e117..2cb093bc 100644
--- a/src/components/navigation/NavigationMenu/NavigationMenu.tsx
+++ b/src/components/navigation/NavigationMenu/NavigationMenu.tsx
@@ -26,7 +26,7 @@ import { useNavigate } from "react-router";
 import { Link } from "react-router-dom";
 import { LoginControls } from "./LoginControls";
 import { CreateIOCButton } from "./CreateIOCButton";
-import { applicationTitle } from "../../common/Helper";
+import { applicationTitle } from "../../common/applicationTitle";
 import { CCCEControlSymbol } from "../../../icons/CCCEControlSymbol";
 import { theme } from "../../../style/Theme";
 import { useGetCurrentModeQuery } from "../../../store/deployApi";
@@ -62,13 +62,12 @@ function MenuListItem({ url, icon, text, tooltip }: MenuListItemProps) {
   );
 }
 
-function MenuListItems({
-  drawerOpen,
-  menuItems
-}: {
+interface MenuListItemsProps {
   drawerOpen: boolean;
   menuItems: typeof menuItemsAll;
-}) {
+}
+
+function MenuListItems({ drawerOpen, menuItems }: MenuListItemsProps) {
   const menuItemsKeys = useUniqueKeys(menuItems);
   return (
     <Box sx={{ paddingTop: 3 }}>
@@ -89,11 +88,13 @@ function MenuListItems({
     </Box>
   );
 }
+
 const makeLink = (text: string, url: string, icon: ReactElement) => ({
   text,
   url,
   icon
 });
+
 const menuItemsAll = [
   makeLink("Records", "/records", <SettingsInputComponent />),
   makeLink(
@@ -108,7 +109,11 @@ const menuItemsAll = [
   makeLink("Log", "/jobs", <Assignment />)
 ];
 
-export const NavigationMenu = ({ children }: { children: ReactNode }) => {
+interface NavigationMenuProps {
+  children: ReactNode;
+}
+
+export const NavigationMenu = ({ children }: NavigationMenuProps) => {
   const [drawerOpen, setDrawerOpen] = useState(false);
   const navigate = useNavigate();
   const goHome = () => {
diff --git a/src/components/navigation/NotFoundView/NotFoundView.tsx b/src/components/navigation/NotFoundView/NotFoundView.tsx
index 9c35d343..6343f19e 100644
--- a/src/components/navigation/NotFoundView/NotFoundView.tsx
+++ b/src/components/navigation/NotFoundView/NotFoundView.tsx
@@ -8,7 +8,7 @@ import {
   SidewaysMascot,
   VerticalMascot
 } from "@ess-ics/ce-ui-common";
-import env from "../../../config/env";
+import { env } from "../../../config/env";
 
 interface NotFoundProps {
   /** String containing message of page not found. Otherwise defaults to a generic "Page Not Found" message */
diff --git a/src/components/records/RecordBadge.tsx b/src/components/records/RecordBadge.tsx
index b5155844..2fb9a109 100644
--- a/src/components/records/RecordBadge.tsx
+++ b/src/components/records/RecordBadge.tsx
@@ -1,14 +1,12 @@
 import { IconBadge, InternalLink } from "@ess-ics/ce-ui-common";
-import { type SxProps } from "@mui/material";
 import { RecordStatusIcon } from "./RecordIcons";
 import { Record } from "../../store/deployApi";
 
 interface RecordBadgeProps {
   record: Record;
-  sx?: SxProps;
 }
 
-export function RecordBadge({ record, sx }: RecordBadgeProps) {
+export function RecordBadge({ record }: RecordBadgeProps) {
   return (
     <IconBadge
       icon={<RecordStatusIcon record={record} />}
@@ -21,7 +19,6 @@ export function RecordBadge({ record, sx }: RecordBadgeProps) {
           {record?.iocName}
         </InternalLink>
       }
-      sx={sx}
     />
   );
 }
diff --git a/src/components/records/RecordHostLink.tsx b/src/components/records/RecordHostLink.tsx
index 7d004aac..898cc090 100644
--- a/src/components/records/RecordHostLink.tsx
+++ b/src/components/records/RecordHostLink.tsx
@@ -5,7 +5,7 @@ import {
   useFindNetBoxHostByFqdnQuery
 } from "../../store/deployApi";
 
-function createHostLink(hostInfo: HostInfoWithId, fqdn?: string) {
+function createHostLink(hostInfo?: HostInfoWithId, fqdn?: string) {
   // if the fqdn field is empty for some reason
   if (fqdn === null || fqdn?.trim() === "") {
     return <EmptyValue />;
@@ -27,7 +27,11 @@ function createHostLink(hostInfo: HostInfoWithId, fqdn?: string) {
   return <Typography>{fqdn}</Typography>;
 }
 
-export const RecordHostLink = ({ fqdn }: { fqdn?: string }) => {
+interface RecordHostLinkProps {
+  fqdn?: string;
+}
+
+export const RecordHostLink = ({ fqdn }: RecordHostLinkProps) => {
   const { data: hostInfo, isLoading } = useFindNetBoxHostByFqdnQuery(
     { fqdn: fqdn ?? "" },
     { skip: !fqdn }
@@ -40,11 +44,7 @@ export const RecordHostLink = ({ fqdn }: { fqdn?: string }) => {
       justifyContent="center"
       alignItems="center"
     >
-      {isLoading || !hostInfo ? (
-        <Skeleton width="100%" />
-      ) : (
-        createHostLink(hostInfo, fqdn)
-      )}
+      {isLoading ? <Skeleton width="100%" /> : createHostLink(hostInfo, fqdn)}
     </Grid>
   );
 };
diff --git a/src/components/records/RecordIcons.tsx b/src/components/records/RecordIcons.tsx
index 6ea8cf4e..c99bad2e 100644
--- a/src/components/records/RecordIcons.tsx
+++ b/src/components/records/RecordIcons.tsx
@@ -1,6 +1,6 @@
-import { type SvgIconTypeMap, useTheme } from "@mui/material";
+import { SvgIconTypeMap, useTheme } from "@mui/material";
 import { LabeledIcon } from "@ess-ics/ce-ui-common";
-import { type OverridableComponent } from "@mui/material/OverridableComponent";
+import { OverridableComponent } from "@mui/material/OverridableComponent";
 import {
   Brightness1,
   RadioButtonUnchecked,
@@ -8,7 +8,11 @@ import {
 } from "@mui/icons-material";
 import { Record as ApiRecord } from "../../store/deployApi";
 
-export function RecordStatusIcon({ record }: { record: ApiRecord }) {
+interface RecordStatusIconProps {
+  record: ApiRecord;
+}
+
+export function RecordStatusIcon({ record }: RecordStatusIconProps) {
   const theme = useTheme();
 
   const { pvStatus } = record;
@@ -30,13 +34,13 @@ export function RecordStatusIcon({ record }: { record: ApiRecord }) {
       title: "Inactive",
       icon: RadioButtonUnchecked
     },
-    null: {
+    unknown: {
       title: "Unknown",
       icon: HelpOutline
     }
   };
 
-  const state = pvStatus ? pvStatus.toLowerCase() : "null";
+  const state = pvStatus ? pvStatus.toLowerCase() : "unknown";
   const iconStyle = { fill: theme.palette.status.icons };
   const iconTitle = iconConfig[state].title;
   const statusIcon = iconConfig[state].icon;
diff --git a/src/components/records/RecordSearch.tsx b/src/components/records/RecordSearch.tsx
index 446afd06..fc302db8 100644
--- a/src/components/records/RecordSearch.tsx
+++ b/src/components/records/RecordSearch.tsx
@@ -3,7 +3,7 @@ import { useSearchParams } from "react-router-dom";
 import { Grid, Tabs, Tab } from "@mui/material";
 import { usePagination, SearchBar } from "@ess-ics/ce-ui-common";
 import { RecordTable } from "./RecordTable";
-import { initRequestParams } from "../common/Helper";
+import { initRequestParams } from "../../api/initRequestParams";
 import { ROWS_PER_PAGE } from "../../constants";
 import { useLazyFindAllRecordsQuery } from "../../store/deployApi";
 import { Pagination } from "../../types/common";
@@ -19,7 +19,7 @@ export function RecordSearch({
   rowType,
   isExpanded
 }: RecordSearchProps) {
-  const [getRecords, { data: records, isFetching, isSuccess: dataReady }] =
+  const [getRecords, { data: records, isFetching }] =
     useLazyFindAllRecordsQuery();
 
   const [searchParams, setSearchParams] = useSearchParams({ query: "" });
@@ -101,11 +101,11 @@ export function RecordSearch({
         <SearchBar
           search={setSearch}
           query={searchParams.get("query")}
-          loading={isFetching || !dataReady}
+          loading={isFetching}
         >
           <RecordTable
             records={records}
-            loading={isFetching || !dataReady}
+            loading={isFetching}
             rowType={rowType}
             pagination={pagination}
             onPage={onPage}
diff --git a/src/components/records/RecordTable.tsx b/src/components/records/RecordTable.tsx
index 2f0d3709..960a74da 100644
--- a/src/components/records/RecordTable.tsx
+++ b/src/components/records/RecordTable.tsx
@@ -8,7 +8,7 @@ import { Grid } from "@mui/material";
 import { RecordStatusIcon } from "./RecordIcons";
 import { RecordHostLink } from "./RecordHostLink";
 import { Pagination } from "../../types/common";
-import type {
+import {
   PagedRecordResponse,
   Record as ApiRecord
 } from "../../store/deployApi";
diff --git a/src/config/env.ts b/src/config/env.ts
index c21e0d79..32ace0b4 100644
--- a/src/config/env.ts
+++ b/src/config/env.ts
@@ -1,12 +1,11 @@
-const env = {
+export const env = {
   SERVER_ADDRESS: window.SERVER_ADDRESS,
   ENVIRONMENT_TITLE: window.ENVIRONMENT_TITLE,
   API_BASE_ENDPOINT: window.API_BASE_ENDPOINT,
   TOKEN_RENEW_INTERVAL: window.TOKEN_RENEW_INTERVAL,
   FRONTEND_VERSION: window.FRONTEND_VERSION,
+  VITE_APP_MUI_PRO_LICENSE_KEY: import.meta.env.VITE_APP_MUI_PRO_LICENSE_KEY,
   SUPPORT_URL: window.SUPPORT_URL,
   NETBOX_ADDRESS: window.NETBOX_ADDRESS,
   NAMING_ADDRESS: window.NAMING_ADDRESS
 };
-
-export default env;
diff --git a/src/constants/index.ts b/src/constants/index.ts
index 26ae5f5a..ea136b2d 100644
--- a/src/constants/index.ts
+++ b/src/constants/index.ts
@@ -1,2 +1,3 @@
 export const ROWS_PER_PAGE = [20, 50];
 export const DEFAULT_POLLING_INTERVAL_MILLIS = 3000;
+export const MAX_SNACK = 5;
diff --git a/src/hooks/useTypingTimer.tsx b/src/hooks/useTypingTimer.tsx
index eb680237..0c78ce16 100644
--- a/src/hooks/useTypingTimer.tsx
+++ b/src/hooks/useTypingTimer.tsx
@@ -1,4 +1,4 @@
-import { useState, type KeyboardEvent } from "react";
+import { useState, KeyboardEvent } from "react";
 
 interface UseTypingTimerReturn {
   value: string;
diff --git a/src/icons/BatchUndeploySymbol.tsx b/src/icons/BatchUndeploySymbol.tsx
index 3ad1d693..caa278e2 100644
--- a/src/icons/BatchUndeploySymbol.tsx
+++ b/src/icons/BatchUndeploySymbol.tsx
@@ -1,4 +1,4 @@
-import { type ComponentProps } from "react";
+import { ComponentProps } from "react";
 import BatchUndeployIconSvg from "./resources/batch/batch_undeploy_icon.svg?react";
 import { BatchUndeployIcon } from "../components/Job/JobIcons";
 
diff --git a/src/index.tsx b/src/index.tsx
index b9170974..9c102b44 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -1,20 +1,20 @@
 import { StrictMode } from "react";
 import { createRoot } from "react-dom/client";
 import { LicenseInfo } from "@mui/x-license-pro";
+import { AppErrorBoundary } from "@ess-ics/ce-ui-common";
+import { env } from "./config/env";
 import App from "./App";
 
 // Set license key
-LicenseInfo.setLicenseKey(import.meta.env.VITE_APP_MUI_PRO_LICENSE_KEY);
+LicenseInfo.setLicenseKey(env.VITE_APP_MUI_PRO_LICENSE_KEY ?? "");
 
-const container = document.getElementById("root");
-if (container) {
-  const root = createRoot(container);
+// Render app
+const root = createRoot(document.getElementById("root") as HTMLElement);
 
-  root.render(
-    <StrictMode>
+root.render(
+  <StrictMode>
+    <AppErrorBoundary supportHref={window.SUPPORT_URL}>
       <App />
-    </StrictMode>
-  );
-} else {
-  throw new Error("No root element found");
-}
+    </AppErrorBoundary>
+  </StrictMode>
+);
diff --git a/src/mocks/AppHarness.tsx b/src/mocks/AppHarness.tsx
index e44806ec..88d0beeb 100644
--- a/src/mocks/AppHarness.tsx
+++ b/src/mocks/AppHarness.tsx
@@ -1,4 +1,4 @@
-import { type ReactNode } from "react";
+import { ReactNode } from "react";
 import { SnackbarProvider } from "notistack";
 import { Container, CssBaseline, StyledEngineProvider } from "@mui/material";
 import { ThemeProvider } from "@mui/material/styles";
@@ -9,6 +9,7 @@ import { UserProvider } from "../api/UserProvider";
 import { NavigationMenu } from "../components/navigation/NavigationMenu";
 import { ReduxProvider } from "../store/ReduxProvider";
 import { User } from "../types/common";
+import { MAX_SNACK } from "../constants";
 
 interface RouterHarnessProps {
   children: ReactNode;
@@ -61,7 +62,7 @@ export function AppHarness({
     <ReduxProvider>
       <SnackbarProvider
         preventDuplicate
-        maxSnack={5}
+        maxSnack={MAX_SNACK}
       >
         <RouterHarness initialHistory={initialHistory}>
           <SelectedUserProvider>
diff --git a/src/mocks/mockAPI.ts b/src/mocks/mockAPI.ts
index 9a003197..61425f71 100644
--- a/src/mocks/mockAPI.ts
+++ b/src/mocks/mockAPI.ts
@@ -93,6 +93,7 @@ function logout() {
 
 function isLoggedIn(req: any) {
   const { cookies } = req;
+  console.log({ cookies });
   if (cookies) {
     return Boolean(cookies["ce-deploy-auth"]);
   } else {
diff --git a/src/stories/components/common/job/JobTable.stories.tsx b/src/stories/components/common/job/JobTable.stories.tsx
index 98f2a2e1..9a2d5c53 100644
--- a/src/stories/components/common/job/JobTable.stories.tsx
+++ b/src/stories/components/common/job/JobTable.stories.tsx
@@ -1,4 +1,5 @@
 import { Box } from "@mui/material";
+import { Meta, StoryFn } from "@storybook/react";
 import { RouterHarness } from "../../../../mocks/AppHarness";
 import { JobTable } from "../../../../components/Job/JobTable";
 import operationList from "../../../../mocks/fixtures/Jobs.json";
@@ -7,7 +8,6 @@ import {
   paginationNoResults
 } from "../../../utils/common-args";
 import { Job } from "../../../../store/deployApi";
-import type { Meta, StoryFn } from "@storybook/react";
 
 export default {
   title: "Jobs/JobTable",
diff --git a/global.d.ts b/src/types/index.d.ts
similarity index 100%
rename from global.d.ts
rename to src/types/index.d.ts
diff --git a/declaration.d.ts b/src/types/typings.d.ts
similarity index 77%
rename from declaration.d.ts
rename to src/types/typings.d.ts
index ff05c729..1e5e549b 100644
--- a/declaration.d.ts
+++ b/src/types/typings.d.ts
@@ -1,3 +1,4 @@
+declare module "@ess-ics/ce-ui-common";
 declare module "*.svg?react" {
   const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
 
diff --git a/src/typings.d.ts b/src/typings.d.ts
deleted file mode 100644
index 0a50ac47..00000000
--- a/src/typings.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-declare module "@ess-ics/ce-ui-common";
-declare module "*.svg" {
-  import { FunctionComponent, SVGAttributes } from "react";
-
-  export const ReactComponent: FunctionComponent<
-    Element<SVGAttributes> & { title?: string }
-  >;
-  const content: string;
-  export default content;
-}
diff --git a/src/views/IOC/CreateIOCView.tsx b/src/views/IOC/CreateIOCView.tsx
index 37d4d491..b895b6e1 100644
--- a/src/views/IOC/CreateIOCView.tsx
+++ b/src/views/IOC/CreateIOCView.tsx
@@ -1,6 +1,6 @@
 import { GlobalAppBarContext } from "@ess-ics/ce-ui-common";
 import { useContext, useEffect } from "react";
-import { applicationTitle } from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
 import { CreateIOC } from "../../components/IOC/CreateIOC";
 import { GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
 
diff --git a/src/views/IOC/IOCDetailsContainer.tsx b/src/views/IOC/IOCDetailsContainer.tsx
index 38bfccdf..057e7e09 100644
--- a/src/views/IOC/IOCDetailsContainer.tsx
+++ b/src/views/IOC/IOCDetailsContainer.tsx
@@ -8,13 +8,17 @@ import { ApiAlertError } from "../../components/common/Alerts/ApiAlertError";
 
 const IOC_POLL_INTERVAL = 5000;
 
-export function IOCDetailsContainer({ id }: { id?: string }) {
+interface IOCDetailsContainerProps {
+  id?: string;
+}
+
+export function IOCDetailsContainer({ id }: IOCDetailsContainerProps) {
   const {
     data: ioc,
     isLoading,
     error
   } = useGetIocQuery(
-    { iocId: Number(id) || 0 },
+    { iocId: Number(id) },
     { skip: !id, pollingInterval: IOC_POLL_INTERVAL }
   );
 
diff --git a/src/views/IOC/IOCDetailsView.tsx b/src/views/IOC/IOCDetailsView.tsx
index 80df78af..79916a6d 100644
--- a/src/views/IOC/IOCDetailsView.tsx
+++ b/src/views/IOC/IOCDetailsView.tsx
@@ -10,7 +10,7 @@ import {
 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 { applicationTitle } from "../../components/common/applicationTitle";
 import { GlobalAppBarContext } from "../../types/common";
 import { IocDetails } from "../../store/deployApi";
 
diff --git a/src/views/IOC/IOCListView.tsx b/src/views/IOC/IOCListView.tsx
index b439afcd..9ba72287 100644
--- a/src/views/IOC/IOCListView.tsx
+++ b/src/views/IOC/IOCListView.tsx
@@ -8,10 +8,8 @@ import {
 import { useSearchParams } from "react-router-dom";
 import { Container, Grid, Tabs, Tab } from "@mui/material";
 import { useLazyListIocsQuery, ListIocsApiArg } from "../../store/deployApi";
-import {
-  applicationTitle,
-  initRequestParams
-} from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
+import { initRequestParams } from "../../api/initRequestParams";
 import { GlobalAppBarContext, OnPageParams } from "../../types/common";
 import { ApiAlertError } from "../../components/common/Alerts/ApiAlertError";
 import { IOCTable } from "../../components/IOC/IOCTable";
diff --git a/src/views/UserPage/UserPageView.tsx b/src/views/UserPage/UserPageView.tsx
index 566425d9..bd1a6eca 100644
--- a/src/views/UserPage/UserPageView.tsx
+++ b/src/views/UserPage/UserPageView.tsx
@@ -1,7 +1,7 @@
 import { useContext, useEffect } from "react";
 import { Grid } from "@mui/material";
 import { GlobalAppBarContext } from "@ess-ics/ce-ui-common";
-import { applicationTitle } from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
 import { UserProfile } from "../../components/common/User/UserProfile";
 import { UserOperationList } from "../../components/common/User/UserOperationList";
 import { UserInfoResponse } from "../../store/deployApi";
diff --git a/src/views/help/HelpView.tsx b/src/views/help/HelpView.tsx
index dab63530..5327ec51 100644
--- a/src/views/help/HelpView.tsx
+++ b/src/views/help/HelpView.tsx
@@ -1,8 +1,8 @@
 import { useContext, useEffect } from "react";
 import { RootPaper, Help, GlobalAppBarContext } from "@ess-ics/ce-ui-common";
 import { Stack, Typography } from "@mui/material";
-import { applicationTitle } from "../../components/common/Helper";
-import env from "../../config/env";
+import { applicationTitle } from "../../components/common/applicationTitle";
+import { env } from "../../config/env";
 import { GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
 
 export function HelpView() {
diff --git a/src/views/host/HostListView.tsx b/src/views/host/HostListView.tsx
index 50a416b0..67bf367e 100644
--- a/src/views/host/HostListView.tsx
+++ b/src/views/host/HostListView.tsx
@@ -8,12 +8,10 @@ import {
 } from "@ess-ics/ce-ui-common";
 import { useSearchParams } from "react-router-dom";
 import { HostTable } from "../../components/host/HostTable";
-import {
-  applicationTitle,
-  initRequestParams
-} from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
+import { initRequestParams } from "../../api/initRequestParams";
 import { ROWS_PER_PAGE } from "../../constants";
-import { useLazyListHostsQuery } from "../../store/deployApi";
+import { ListHostsApiArg, useLazyListHostsQuery } from "../../store/deployApi";
 import {
   GlobalAppBarContext as GlobalAppBarContextType,
   OnPageParams
@@ -28,9 +26,8 @@ export function HostListView() {
 
   const [searchParams, setSearchParams] = useSearchParams({ query: "" });
   const [tabIndex, setTabIndex] = useState(0);
-  const [hostFilter, setHostFilter] = useState<
-    "ALL" | "IOCS_DEPLOYED" | "NO_IOCS" | "OWN"
-  >("ALL");
+  const [hostFilter, setHostFilter] =
+    useState<ListHostsApiArg["filter"]>("ALL");
 
   const handleTabChange = (tab: number) => {
     if (tab === 0) {
diff --git a/src/views/host/details/HostDetailsContainer.tsx b/src/views/host/details/HostDetailsContainer.tsx
index be22b060..ed658252 100644
--- a/src/views/host/details/HostDetailsContainer.tsx
+++ b/src/views/host/details/HostDetailsContainer.tsx
@@ -8,7 +8,11 @@ import {
 } from "../../../store/deployApi";
 import { getErrorState } from "../../../components/common/Alerts/AlertsData";
 
-export function HostDetailsContainer({ hostId }: { hostId?: string }) {
+interface HostDetailsContainerProps {
+  hostId?: string;
+}
+
+export function HostDetailsContainer({ hostId }: HostDetailsContainerProps) {
   const { data: host, error: fetchError } = useFindNetBoxHostByHostIdQuery(
     {
       hostId: hostId ?? ""
@@ -21,6 +25,7 @@ export function HostDetailsContainer({ hostId }: { hostId?: string }) {
     },
     { skip: !hostId }
   );
+
   const { status, message } = getErrorState(fetchError || alertError);
 
   if (status === "404" || status === 404) {
diff --git a/src/views/host/details/HostDetailsView.tsx b/src/views/host/details/HostDetailsView.tsx
index d01286c1..1db71268 100644
--- a/src/views/host/details/HostDetailsView.tsx
+++ b/src/views/host/details/HostDetailsView.tsx
@@ -13,10 +13,10 @@ import { HostDetailsTable } from "./HostDetailsTable";
 import { HostJobsSection } from "./HostJobsSection";
 import { HostIocSection } from "./HostIocSection";
 import { LokiPanel } from "../../../components/common/Loki/LokiPanel";
-import { applicationTitle } from "../../../components/common/Helper";
+import { applicationTitle } from "../../../components/common/applicationTitle";
 import { AccessControl } from "../../../components/auth/AccessControl";
 import { HostStatus } from "../../../components/host/HostStatus";
-import env from "../../../config/env";
+import { env } from "../../../config/env";
 import { HostAlertResponse, HostInfoWithId } from "../../../store/deployApi";
 import { GlobalAppBarContext as GlobalAppBarContextType } from "../../../types/common";
 
diff --git a/src/views/host/details/HostIocSection.tsx b/src/views/host/details/HostIocSection.tsx
index 9e0547b0..d70ef5a0 100644
--- a/src/views/host/details/HostIocSection.tsx
+++ b/src/views/host/details/HostIocSection.tsx
@@ -3,7 +3,7 @@ import { string } from "prop-types";
 import { Typography } from "@mui/material";
 import { usePagination } from "@ess-ics/ce-ui-common";
 import { IOCTable } from "../../../components/IOC/IOCTable";
-import { initRequestParams } from "../../../components/common/Helper";
+import { initRequestParams } from "../../../api/initRequestParams";
 import { ROWS_PER_PAGE } from "../../../constants";
 import { useLazyFindAssociatedIocsByHostIdQuery } from "../../../store/deployApi";
 import { OnPageParams } from "../../../types/common";
diff --git a/src/views/jobs/JobDetailsContainer.tsx b/src/views/jobs/JobDetailsContainer.tsx
index c4cee54c..981d45c4 100644
--- a/src/views/jobs/JobDetailsContainer.tsx
+++ b/src/views/jobs/JobDetailsContainer.tsx
@@ -15,7 +15,7 @@ export function JobDetailsContainer({ id }: { id?: string }) {
     isLoading,
     error: jobError
   } = useFetchJobQuery(
-    { jobId: Number(id) ?? 0 },
+    { jobId: Number(id) },
     {
       skip: !id,
       pollingInterval: !jobFinished ? POLL_DEPLOYMENT_INTERVAL : undefined
diff --git a/src/views/jobs/JobDetailsView.tsx b/src/views/jobs/JobDetailsView.tsx
index bc23194b..0e581ef3 100644
--- a/src/views/jobs/JobDetailsView.tsx
+++ b/src/views/jobs/JobDetailsView.tsx
@@ -4,7 +4,7 @@ import ArrowBackIcon from "@mui/icons-material/ArrowBack";
 import { useNavigate } from "react-router-dom";
 import { GlobalAppBarContext } from "@ess-ics/ce-ui-common";
 import { JobsDetails } from "../../components/Job/JobDetails";
-import { applicationTitle } from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
 import { GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
 import { JobDetails } from "../../store/deployApi";
 
diff --git a/src/views/jobs/JobListView.tsx b/src/views/jobs/JobListView.tsx
index f7d9c396..53e50063 100644
--- a/src/views/jobs/JobListView.tsx
+++ b/src/views/jobs/JobListView.tsx
@@ -1,7 +1,7 @@
 import { useCallback, useEffect } from "react";
 import { Box } from "@mui/material";
 import { RootPaper, usePagination } from "@ess-ics/ce-ui-common";
-import { initRequestParams } from "../../components/common/Helper";
+import { initRequestParams } from "../../api/initRequestParams";
 import { JobTable } from "../../components/Job/JobTable";
 import { ROWS_PER_PAGE } from "../../constants";
 import { useLazyListJobsQuery } from "../../store/deployApi";
diff --git a/src/views/jobs/JobLogAccessControl.tsx b/src/views/jobs/JobLogAccessControl.tsx
index 14cc01ea..5c98f2d5 100644
--- a/src/views/jobs/JobLogAccessControl.tsx
+++ b/src/views/jobs/JobLogAccessControl.tsx
@@ -2,8 +2,8 @@ import { useContext, useEffect } from "react";
 import { GlobalAppBarContext } from "@ess-ics/ce-ui-common";
 import { JobListView } from "./JobListView";
 import { AccessControl } from "../../components/auth/AccessControl";
-import { applicationTitle } from "../../components/common/Helper";
-import { type GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
+import { applicationTitle } from "../../components/common/applicationTitle";
+import { GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
 
 export function JobLogAccessControl() {
   const { setTitle } = useContext<GlobalAppBarContextType>(GlobalAppBarContext);
diff --git a/src/views/login/LoginView.tsx b/src/views/login/LoginView.tsx
index 4a2a8fa5..8d23a30d 100644
--- a/src/views/login/LoginView.tsx
+++ b/src/views/login/LoginView.tsx
@@ -7,7 +7,7 @@ import {
   LoginForm
 } from "@ess-ics/ce-ui-common";
 import { useRedirect } from "../../hooks/Redirect";
-import { applicationTitle } from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
 import {
   GlobalAppBarContext as GlobalAppBarContextType,
   UserContext
diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index 49f1663b..2763ae1e 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -12,13 +12,18 @@ import {
 import { useParams, useNavigate } from "react-router-dom";
 import { Alias } from "./Alias";
 import { RecordBadge } from "../../components/records/RecordBadge";
-import { applicationTitle } from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
 import { NotFoundView } from "../../components/navigation/NotFoundView/NotFoundView";
 
 import { RecordDetails, useGetRecordQuery } from "../../store/deployApi";
-import { type GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
+import { GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
 import { getErrorState } from "../../components/common/Alerts/AlertsData";
 
+const LAST_UPDATED = "Last updated";
+const RECORD_TYPE = "Record type";
+const DESCRIPTION = "Description";
+const IOC_REVISION = "IOC Revision";
+
 export function RecordDetailsView() {
   const { name } = useParams();
   const decodedName = decodeURIComponent(name ?? "");
@@ -50,9 +55,9 @@ export function RecordDetailsView() {
       "Alias for": (
         <Alias aliases={record?.aliasFor ? [record?.aliasFor] : []} />
       ),
-      Description: record?.description || <EmptyValue />,
+      [DESCRIPTION]: record?.description || <EmptyValue />,
       Version: record?.iocVersion || <EmptyValue />,
-      "Record type": record.recordType || <EmptyValue />,
+      [RECORD_TYPE]: record.recordType || <EmptyValue />,
       Host: record.hostId ? (
         <Typography>
           <InternalLink
@@ -66,20 +71,20 @@ export function RecordDetailsView() {
         record?.hostName
       ),
       "Alias to": <Alias aliases={record?.aliasTo} />,
-      "Last updated": "",
-      "IOC Revision": ""
+      [LAST_UPDATED]: "",
+      [IOC_REVISION]: ""
     };
 
     if (record?.properties) {
       for (const [key, value] of Object.entries(record.properties)) {
         if (key.toLowerCase().includes("time")) {
-          subset["Last updated"] = formatDateAndTime(value);
+          subset[LAST_UPDATED] = formatDateAndTime(value);
         } else if (key.toLowerCase().includes("recordtype")) {
-          subset["Record type"] = value;
+          subset[RECORD_TYPE] = value;
         } else if (key.toLowerCase().includes("recorddesc")) {
-          subset.Description = value;
+          subset[DESCRIPTION] = value;
         } else if (key.toLowerCase() === "iocversion") {
-          subset["IOC Revision"] = value;
+          subset[IOC_REVISION] = value;
         }
       }
       return subset;
@@ -112,10 +117,7 @@ export function RecordDetailsView() {
         </IconButton>
         {record && (
           <>
-            <RecordBadge
-              record={record}
-              sx={{ mt: 2.5 }}
-            />
+            <RecordBadge record={record} />
             <KeyValueTable
               obj={getSubset(record)}
               variant="overline"
diff --git a/src/views/records/RecordListView.tsx b/src/views/records/RecordListView.tsx
index 43c37b05..26f62f02 100644
--- a/src/views/records/RecordListView.tsx
+++ b/src/views/records/RecordListView.tsx
@@ -7,13 +7,11 @@ import {
   usePagination,
   SearchBar
 } from "@ess-ics/ce-ui-common";
-import {
-  applicationTitle,
-  initRequestParams
-} from "../../components/common/Helper";
+import { applicationTitle } from "../../components/common/applicationTitle";
+import { initRequestParams } from "../../api/initRequestParams";
 import { RecordTable } from "../../components/records/RecordTable";
 import { ROWS_PER_PAGE } from "../../constants";
-import { useLazyFindAllRecordsQuery } from "../../store/deployApi";
+import { Record, useLazyFindAllRecordsQuery } from "../../store/deployApi";
 import {
   GlobalAppBarContext as GlobalAppBarContextType,
   OnPageParams
@@ -29,7 +27,7 @@ export function RecordListView() {
   const [searchParams, setSearchParams] = useSearchParams({ query: "" });
   const [tabIndex, setTabIndex] = useState(0);
   const [recordFilter, setRecordFilter] = useState<
-    "ACTIVE" | "INACTIVE" | undefined
+    Record["pvStatus"] | undefined
   >(undefined);
   // used to request record list again when tab is switched, but request it only once! (totalRecord is a random number that is generated by ChannelFinder)
 
diff --git a/tsconfig.json b/tsconfig.json
index 9744dfaa..69644025 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -3,6 +3,7 @@
     "target": "ESNext",
     "lib": ["dom", "dom.iterable", "esnext"],
     "allowJs": true,
+    "checkJs": true,
     "module": "ESNext",
     "skipLibCheck": true,
     "esModuleInterop": true,
@@ -29,7 +30,12 @@
       "msw"
     ]
   },
-  "include": ["src", "cypress.d.ts", "./global.d.ts", "declaration.d.ts"],
+  "include": [
+    "src",
+    "cypress.d.ts",
+    "src/types/index.d.ts",
+    "src/types/typings.d.ts"
+  ],
   "exclude": [
     "node_modules",
     "build",
-- 
GitLab