diff --git a/Client/src/Hooks/useIsAdmin.js b/Client/src/Hooks/useIsAdmin.js
new file mode 100644
index 000000000..7d593b874
--- /dev/null
+++ b/Client/src/Hooks/useIsAdmin.js
@@ -0,0 +1,11 @@
+import { useSelector } from "react-redux";
+
+const useIsAdmin = () => {
+ const { user } = useSelector((state) => state.auth);
+ const isAdmin =
+ (user?.role?.includes("admin") ?? false) ||
+ (user?.role?.includes("superadmin") ?? false);
+ return isAdmin;
+};
+
+export { useIsAdmin };
diff --git a/Client/src/Pages/Infrastructure/components/Menu/index.jsx b/Client/src/Pages/Infrastructure/components/Menu/index.jsx
new file mode 100644
index 000000000..4bf3cb209
--- /dev/null
+++ b/Client/src/Pages/Infrastructure/components/Menu/index.jsx
@@ -0,0 +1,235 @@
+/* TODO I basically copied and pasted this component from the actionsMenu. Check how we can make it reusable */
+
+import { useRef, useState } from "react";
+import { useSelector, useDispatch } from "react-redux";
+import { useTheme } from "@emotion/react";
+import { useNavigate } from "react-router-dom";
+import { createToast } from "../../../../Utils/toastUtils";
+/* import { logger } from "../../../Utils/Logger"; */
+import { IconButton, Menu, MenuItem } from "@mui/material";
+import {
+ deleteUptimeMonitor,
+ /* pauseUptimeMonitor, */
+ getUptimeMonitorsByTeamId,
+} from "../../../../Features/UptimeMonitors/uptimeMonitorsSlice";
+import Settings from "../../../../assets/icons/settings-bold.svg?react";
+import PropTypes from "prop-types";
+import Dialog from "../../../../Components/Dialog";
+import { networkService } from "../../../../Utils/NetworkService.js";
+
+const InfrastructureMenu = ({ monitor, isAdmin, updateCallback }) => {
+ /* const [anchorEl, setAnchorEl] = useState(null);
+ const [actions, setActions] = useState({}); */
+ const actions = { id: monitor.id, url: monitor.url };
+ const anchor = useRef(null);
+ const [isOpen, setIsOpen] = useState(false);
+ const [isDialogOpen, setIsDialogOpen] = useState(false);
+ const dispatch = useDispatch();
+ const theme = useTheme();
+ const authState = useSelector((state) => state.auth);
+ const authToken = authState.authToken;
+ const { isLoading } = useSelector((state) => state.uptimeMonitors);
+
+ /* const handlePause = async () => {
+ try {
+ const action = await dispatch(
+ pauseUptimeMonitor({ authToken, monitorId: monitor._id })
+ );
+ if (pauseUptimeMonitor.fulfilled.match(action)) {
+ updateCallback();
+ const state = action?.payload?.data.isActive === false ? "paused" : "resumed";
+ createToast({ body: `Monitor ${state} successfully.` });
+ } else {
+ throw new Error(action?.error?.message ?? "Failed to pause monitor.");
+ }
+ } catch (error) {
+ logger.error("Error pausing monitor:", monitor._id, error);
+ createToast({ body: "Failed to pause monitor." });
+ }
+ }; */
+
+ /* TODO
+1) Clean component
+2) Rerender after removing
+3) Add padding to inputs (I took of their height)
+ */
+
+ const openMenu = (e) => {
+ e.stopPropagation();
+ setIsOpen(true);
+ };
+
+ const closeMenu = (e) => {
+ e.stopPropagation();
+ setIsOpen(false);
+ };
+
+ const openRemove = (e) => {
+ closeMenu(e);
+ setIsDialogOpen(true);
+ };
+ const cancelRemove = () => {
+ setIsDialogOpen(false);
+ };
+
+ const navigate = useNavigate();
+
+ function openDetails(id) {
+ navigate(`/infrastructure/${id}`);
+ }
+
+ const handleRemove = async () => {
+ try {
+ /* TODO not working, dont know why */
+ const result = await networkService.deleteMonitorById({
+ authToken,
+ monitorId: actions.id,
+ });
+ console.log(result);
+ /* Toast success */
+ } catch (error) {
+ console.log(error);
+ /* Toast error */
+ } finally {
+ setIsDialogOpen(false);
+ updateCallback();
+ }
+ /* let monitor = { _id: actions.id };
+ const action = await dispatch(
+ deleteUptimeMonitor({ authToken: authState.authToken, monitor })
+ );
+ if (action.meta.requestStatus === "fulfilled") {
+ setIsOpen(false); // close modal
+ dispatch(getUptimeMonitorsByTeamId(authState.authToken));
+ updateCallback();
+ createToast({ body: "Monitor deleted successfully." });
+ } else {
+ createToast({ body: "Failed to delete monitor." });
+ } */
+ };
+
+ return (
+ <>
+