Files
Checkmate/client/src/Components/monitors/MonitorStatBoxes.tsx
T

81 lines
2.2 KiB
TypeScript
Raw Normal View History

2026-01-25 04:09:40 +00:00
import Stack from "@mui/material/Stack";
2026-02-20 18:13:39 +00:00
import { StatBox } from "@/Components/design-elements";
2026-01-25 04:09:40 +00:00
2026-02-06 19:42:06 +00:00
import prettyMilliseconds from "pretty-ms";
2026-01-25 04:09:40 +00:00
import { useTheme } from "@mui/material/styles";
import type { MonitorStats, Monitor } from "@/Types/Monitor";
import { getStatusPalette } from "@/Utils/MonitorUtils";
import { useTranslation } from "react-i18next";
interface MonitorStatBoxesProps {
monitor?: Monitor;
monitorStats: MonitorStats | null;
certificateExpiry?: string;
}
export const MonitorStatBoxes = ({
monitor,
monitorStats,
certificateExpiry,
}: MonitorStatBoxesProps) => {
const theme = useTheme();
const { t } = useTranslation();
if (!monitorStats || !monitor) {
return null;
}
const timeOfLastFailure = monitorStats?.timeOfLastFailure || 0;
2026-04-15 11:06:30 -07:00
const timeSinceLastFailure = timeOfLastFailure > 0 ? Date.now() - timeOfLastFailure : 0;
2026-01-25 04:09:40 +00:00
// Determine time since last check
const timeOfLastCheck = monitorStats?.lastCheckTimestamp || 0;
2026-02-06 19:42:06 +00:00
const timeSinceLastCheck = Date.now() - timeOfLastCheck || 0;
2026-01-25 04:09:40 +00:00
2026-02-06 19:42:06 +00:00
const options = {
secondsDecimalDigits: 0,
millisecondsDecimalDigits: 0,
};
2026-01-25 04:09:40 +00:00
2026-02-06 19:42:06 +00:00
const streakTime = prettyMilliseconds(timeSinceLastFailure, options);
const lastCheckTime = prettyMilliseconds(timeSinceLastCheck, options);
const isActive =
monitor?.status === "up" ||
monitor?.status === "paused" ||
2026-04-16 20:54:09 +01:00
monitor?.status === "maintenance" ||
monitor?.status === "initializing" ||
monitor?.status === "breached";
2026-01-25 04:09:40 +00:00
const palette = getStatusPalette(monitor?.status);
return (
<Stack
direction={{ xs: "column", md: "row" }}
gap={theme.spacing(8)}
>
<StatBox
palette={palette}
title={
isActive
? t("pages.common.monitors.statBoxes.activeFor")
: t("pages.common.monitors.statBoxes.serviceIsDown")
}
subtitle={isActive ? streakTime : ""}
2026-01-25 04:09:40 +00:00
/>
<StatBox
title={t("pages.common.monitors.statBoxes.lastCheck")}
subtitle={lastCheckTime}
/>
<StatBox
title={t("pages.common.monitors.statBoxes.lastResponseTime")}
2026-02-06 19:42:06 +00:00
subtitle={prettyMilliseconds(monitorStats?.lastResponseTime ?? 0)}
2026-01-25 04:09:40 +00:00
/>
{monitor?.type === "http" && (
<StatBox
title={t("pages.common.monitors.statBoxes.certificateExpiry")}
subtitle={certificateExpiry || "N/A"}
/>
)}
</Stack>
);
};