'use client'; import React, { ReactElement, ReactNode, useMemo, useState } from 'react'; import { UserAnalysisElement } from '@/packages/features/accounts/src/types/accounts'; import { format } from 'date-fns'; import { Info } from 'lucide-react'; import { Trans } from '@kit/ui/trans'; import { cn } from '@kit/ui/utils'; import { AnalysisElement } from '~/lib/services/analysis-element.service'; import AnalysisLevelBar, { AnalysisLevelBarSkeleton, AnalysisResultLevel, } from './analysis-level-bar'; export type AnalysisResultForDisplay = Pick< UserAnalysisElement, | 'norm_status' | 'response_value' | 'unit' | 'norm_lower_included' | 'norm_upper_included' | 'norm_lower' | 'norm_upper' | 'response_time' >; const AnalysisDoctor = ({ analysisElement, results, startIcon, endIcon, isCancelled, }: { analysisElement: Pick; results?: AnalysisResultForDisplay; isCancelled?: boolean; startIcon?: ReactElement | null; endIcon?: ReactNode | null; }) => { const name = analysisElement.analysis_name_lab || ''; const status = results?.norm_status; const value = results?.response_value || 0; const unit = results?.unit || ''; const normLower = results?.norm_lower ?? null; const normUpper = results?.norm_upper ?? null; const [showTooltip, setShowTooltip] = useState(false); const analysisResultLevel = useMemo(() => { if (!results || status === null || status === undefined) { return null; } switch (status) { case 1: return AnalysisResultLevel.WARNING; case 2: return AnalysisResultLevel.CRITICAL; case 0: default: return AnalysisResultLevel.NORMAL; } }, [results, status]); const normRangeText = useMemo(() => { if (normLower === null && normUpper === null) { return null; } return `${normLower ?? '...'} - ${normUpper ?? '...'}`; }, [normLower, normUpper]); return (
{startIcon ||
} {name} {results?.response_time && (
{ e.stopPropagation(); setShowTooltip(!showTooltip); }} onMouseLeave={() => setShowTooltip(false)} > {' '}
)}
{results ? ( <>
{value}
{unit}
{normRangeText}
{endIcon ||
} ) : isCancelled ? null : ( <>
)}
); }; export default AnalysisDoctor;