//Components import Stack from "@mui/material/Stack"; import DataTable from "@/Components/v1/Table/index.jsx"; import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableRow from "@mui/material/TableRow"; import TableCell from "@mui/material/TableCell"; import TableSkeleton from "@/Components/v1/Table/skeleton.jsx"; import Pagination from "@/Components/v1/Table/TablePagination/index.jsx"; import { StatusLabel } from "@/Components/v1/Label/index.jsx"; import { HttpStatusLabel } from "@/Components/v1/HttpStatusLabel/index.jsx"; import GenericFallback from "@/Components/v1/GenericFallback/index.jsx"; import NetworkError from "@/Components/v1/GenericFallback/NetworkError.jsx"; //Utils import { formatDateWithTz } from "@/Utils/timeUtilsLegacy.js"; import { useSelector } from "react-redux"; import { useState } from "react"; import PropTypes from "prop-types"; import { useTranslation } from "react-i18next"; import { useFetchChecksTeam, useFetchChecksByMonitor } from "@/Hooks/checkHooks.js"; import { Typography, useTheme } from "@mui/material"; import { lighten } from "@mui/material/styles"; const GetTooltip = (row) => { const theme = useTheme(); const phases = row?.timings?.phases; const phaseKeyFormattingMap = { firstByte: "first byte", }; return ( {`Status code: ${row?.statusCode}`} {`Response time: ${row?.responseTime} ms`} {phases && ( <> {`Request timing: `} {Object.keys(phases)?.map((phaseKey) => ( {`${phaseKeyFormattingMap[phaseKey] || phaseKey}:`} {`${phases[phaseKey]} ms`} ))}
)}
); }; const IncidentTable = ({ isLoading, monitors, selectedMonitor, filter, dateRange, updateTrigger, }) => { //Redux state const uiTimezone = useSelector((state) => state.ui.timezone); //Local state const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(10); const selectedMonitorDetails = monitors?.[selectedMonitor]; const selectedMonitorType = selectedMonitorDetails?.type; //Hooks const [checksMonitor, checksCountMonitor, isLoadingMonitor, networkErrorMonitor] = useFetchChecksByMonitor({ monitorId: selectedMonitor === "0" ? undefined : selectedMonitor, type: selectedMonitorType, status: false, sortOrder: "desc", limit: null, dateRange, filter: filter === "resolved" ? "all" : filter, ack: filter === "resolved" ? true : false, page: page, rowsPerPage: rowsPerPage, enabled: selectedMonitor !== "0", updateTrigger, }); const [checksTeam, checksCountTeam, isLoadingTeam, networkErrorTeam] = useFetchChecksTeam({ status: false, sortOrder: "desc", limit: null, dateRange, filter: filter === "resolved" ? "all" : filter, ack: filter === "resolved" ? true : false, page: page, rowsPerPage: rowsPerPage, enabled: selectedMonitor === "0", updateTrigger, }); const checks = selectedMonitor === "0" ? checksTeam : checksMonitor; const checksCount = selectedMonitor === "0" ? checksCountTeam : checksCountMonitor; isLoading = isLoadingTeam || isLoadingMonitor; const networkError = selectedMonitor === "0" ? networkErrorTeam : networkErrorMonitor; const { t } = useTranslation(); //Handlers const handleChangePage = (_, newPage) => { setPage(newPage); }; const handleChangeRowsPerPage = (event) => { setRowsPerPage(event.target.value); }; const headers = [ { id: "monitorName", content: t("incidentsTableMonitorName"), render: (row) => { return monitors?.[row.metadata?.monitorId]?.name || "N/A"; }, }, { id: "status", content: t("incidentsTableStatus"), render: (row) => { const status = row.status === true ? "up" : "down"; return ( ); }, }, { id: "dateTime", content: t("incidentsTableDateTime"), render: (row) => { const formattedDate = formatDateWithTz( row.createdAt, "YYYY-MM-DD HH:mm:ss A", uiTimezone ); return formattedDate; }, }, { id: "statusCode", content: t("incidentsTableStatusCode"), render: (row) => , }, { id: "message", content: t("incidentsTableMessage"), render: (row) => row.message }, ]; if (isLoading) return ; if (networkError) { return ( ); } if (!isLoading && typeof checksCount === "undefined") { return {t("incidentsTableNoIncidents")}; } return ( <> ); }; IncidentTable.propTypes = { isLoading: PropTypes.bool, monitors: PropTypes.object, selectedMonitor: PropTypes.string, filter: PropTypes.string, dateRange: PropTypes.string, updateTrigger: PropTypes.bool, setUpdateTrigger: PropTypes.func, }; export default IncidentTable;