import { Text, Tooltip } from '@mantine/core' import { MonitorState, MonitorTarget } from '@/types/config' import { IconAlertCircle, IconAlertTriangle, IconCircleCheck } from '@tabler/icons-react' import DetailChart from './DetailChart' import DetailBar from './DetailBar' import { getColor } from '@/util/color' import { maintenances } from '@/uptime.config' import { useTranslation } from 'react-i18next' export default function MonitorDetail({ monitor, state, }: { monitor: MonitorTarget state: MonitorState }) { const { t } = useTranslation('common') if (!state.latency[monitor.id]) return ( <> {monitor.name} {t('No data available')} ) let statusIcon = state.incident[monitor.id].slice(-1)[0].end === null ? ( ) : ( ) // Hide real status icon if monitor is in maintenance const now = new Date() const hasMaintenance = maintenances .filter((m) => now >= new Date(m.start) && (!m.end || now <= new Date(m.end))) .find((maintenance) => maintenance.monitors?.includes(monitor.id)) if (hasMaintenance) statusIcon = ( ) let totalTime = Date.now() / 1000 - state.incident[monitor.id][0].start[0] let downTime = 0 for (let incident of state.incident[monitor.id]) { downTime += (incident.end ?? Date.now() / 1000) - incident.start[0] } const uptimePercent = (((totalTime - downTime) / totalTime) * 100).toPrecision(4) // Conditionally render monitor name with or without hyperlink based on monitor.url presence const monitorNameElement = ( {monitor.statusPageLink ? ( {statusIcon} {monitor.name} ) : ( <> {statusIcon} {monitor.name} )} ) return ( <>
{monitor.tooltip ? ( {monitorNameElement} ) : ( monitorNameElement )} {t('Overall', { percent: uptimePercent })}
{!monitor.hideLatencyChart && } ) }