import { 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 { Button, IconButton, Menu, MenuItem, Modal, Stack, Typography, } from "@mui/material"; import { deleteUptimeMonitor, getUptimeMonitorsByTeamId, } from "../../../Features/UptimeMonitors/uptimeMonitorsSlice"; import Settings from "../../../assets/icons/settings-bold.svg?react"; import PropTypes from "prop-types"; const ActionsMenu = ({ monitor, isAdmin }) => { const [anchorEl, setAnchorEl] = useState(null); const [actions, setActions] = useState({}); const [isOpen, setIsOpen] = useState(false); const dispatch = useDispatch(); const theme = useTheme(); const authState = useSelector((state) => state.auth); const handleRemove = async (event) => { event.preventDefault(); event.stopPropagation(); 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)); createToast({ body: "Monitor deleted successfully." }); } else { createToast({ body: "Failed to delete monitor." }); } }; const openMenu = (event, id, url) => { event.preventDefault(); event.stopPropagation(); setAnchorEl(event.currentTarget); setActions({ id: id, url: url }); }; const openRemove = (e) => { closeMenu(e); setIsOpen(true); }; const closeMenu = (e) => { e.stopPropagation(); setAnchorEl(null); }; const navigate = useNavigate(); return ( <> { event.stopPropagation(); openMenu( event, monitor._id, monitor.type === "ping" ? null : monitor.url ); }} sx={{ "&:focus": { outline: "none", }, "& svg path": { stroke: theme.palette.other.icon, }, }} > closeMenu(e)} slotProps={{ paper: { sx: { "& ul": { p: theme.spacing(2.5) }, "& li": { m: 0 }, "& li:last-of-type": { color: theme.palette.error.text, }, }, }, }} > {actions.url !== null ? ( { closeMenu(e); e.stopPropagation(); window.open(actions.url, "_blank", "noreferrer"); }} > Open site ) : ( "" )} { e.stopPropagation(); navigate(`/monitors/${actions.id}`); }} > Details {/* TODO - pass monitor id to Incidents page */} Incidents {isAdmin && ( { e.stopPropagation(); navigate(`/monitors/configure/${actions.id}`); }} > Configure )} {isAdmin && ( { e.stopPropagation(); openRemove(e); }} > Remove )} { e.stopPropagation(); setIsOpen(false); }} > Do you really want to delete this monitor? Once deleted, this monitor cannot be retrieved. ); }; ActionsMenu.propTypes = { monitor: PropTypes.shape({ _id: PropTypes.string, url: PropTypes.string, type: PropTypes.string, }).isRequired, isAdmin: PropTypes.bool, }; export default ActionsMenu;