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} ) }