import { useCallback, useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { assessmentColor, assessmentExplanation, assessmentLabel, } from '@renderer/utils/reportAssessments'; import type { MetricKey } from '@renderer/utils/reportAssessments'; interface AssessmentBadgeProps { assessment: string; metricKey?: MetricKey; } export const AssessmentBadge = ({ assessment, metricKey }: AssessmentBadgeProps) => { const color = assessmentColor(assessment); const explanation = metricKey ? assessmentExplanation(metricKey, assessment) : ''; const [showTooltip, setShowTooltip] = useState(false); const [tooltipPos, setTooltipPos] = useState({ top: 0, left: 0 }); const badgeRef = useRef(null); const enterTimer = useRef>(undefined); const leaveTimer = useRef>(undefined); const handleMouseEnter = useCallback(() => { if (!explanation) return; clearTimeout(leaveTimer.current); enterTimer.current = setTimeout(() => { if (badgeRef.current) { const rect = badgeRef.current.getBoundingClientRect(); setTooltipPos({ top: rect.bottom + 4, left: rect.left + rect.width / 2 }); } setShowTooltip(true); }, 200); }, [explanation]); const handleMouseLeave = useCallback(() => { clearTimeout(enterTimer.current); leaveTimer.current = setTimeout(() => setShowTooltip(false), 150); }, []); useEffect(() => { return () => { clearTimeout(enterTimer.current); clearTimeout(leaveTimer.current); }; }, []); return ( <> {assessmentLabel(assessment)} {showTooltip && explanation && createPortal(
{explanation}
, document.body )} ); };