import { useEffect, useId, useRef, useState } from 'react'
import { HoverTooltip } from '@/components/HoverTooltip'
import {
MACHINE_HEALTH_BAR_FILL_CLASS,
type MachineHealthMetricPresentation,
type MachineHealthPresentation
} from '@/lib/machineHealth'
import { cn } from '@/lib/utils'
import { useTranslation } from '@/lib/use-translation'
function TooltipMetricStat(props: {
metric: MachineHealthMetricPresentation
label: string
}) {
return (
{props.label}
{props.metric.percent}%
)
}
function MachineHealthHint() {
const { t } = useTranslation()
const tooltipId = useId()
const [clickOpen, setClickOpen] = useState(false)
const containerRef = useRef(null)
useEffect(() => {
if (!clickOpen) return
const closeOnOutsidePointer = (event: PointerEvent) => {
if (!containerRef.current?.contains(event.target as Node)) {
setClickOpen(false)
}
}
document.addEventListener('pointerdown', closeOnOutsidePointer)
return () => document.removeEventListener('pointerdown', closeOnOutsidePointer)
}, [clickOpen])
const target = (
)
return (
{t('machine.health.tooltip.hint')}
)
}
export function MachineHealthTooltipBody(props: {
presentation: MachineHealthPresentation
}) {
const { t } = useTranslation()
const { presentation } = props
const statusKey = `machine.health.status.${presentation.status}` as const
return (
{t('machine.health.tooltip.title')}
{t(statusKey)}
{presentation.metrics.map((metric) => (
))}
{presentation.loadDetail ? (
{t('machine.health.tooltip.loadShort')}
{presentation.loadDetail}
) : null}
{presentation.uptimeDetail ? (
{t('machine.health.tooltip.uptimeShort')}
{presentation.uptimeDetail}
) : null}
)
}