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);
|
2026-04-16 18:09:05 +01:00
|
|
|
const isActive =
|
|
|
|
|
monitor?.status === "up" ||
|
|
|
|
|
monitor?.status === "paused" ||
|
2026-04-16 20:54:09 +01:00
|
|
|
monitor?.status === "maintenance" ||
|
2026-04-16 18:09:05 +01:00
|
|
|
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}
|
2026-04-15 14:51:12 +01:00
|
|
|
title={
|
2026-04-16 18:09:05 +01:00
|
|
|
isActive
|
|
|
|
|
? t("pages.common.monitors.statBoxes.activeFor")
|
|
|
|
|
: t("pages.common.monitors.statBoxes.serviceIsDown")
|
2026-04-15 14:51:12 +01:00
|
|
|
}
|
2026-04-16 18:09:05 +01:00
|
|
|
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>
|
|
|
|
|
);
|
|
|
|
|
};
|