'use client'; import React, { ReactElement, ReactNode, useMemo, useState } from 'react'; 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 { NestedAnalysisElement } from '@/packages/features/doctor/src/lib/server/schema/doctor-analysis-detail-view.schema'; import AnalysisLevelBar, { AnalysisLevelBarSkeleton, AnalysisResultLevel, } from './analysis-level-bar'; export type AnalysisResultForDisplay = { norm_status?: number | null; response_value?: number | null; unit?: string | null; norm_lower_included?: boolean | null; norm_upper_included?: boolean | null; norm_lower?: number | null; norm_upper?: number | null; response_time?: string | null; nestedElements?: NestedAnalysisElement[]; }; 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]); const nestedElements = results?.nestedElements ?? null; const hasNestedElements = Array.isArray(nestedElements) && nestedElements.length > 0; const isAnalysisLevelBarHidden = isCancelled || !results || hasNestedElements; return (
{startIcon ||
} {name} {results?.response_time && (
{ e.stopPropagation(); setShowTooltip(!showTooltip); }} onMouseLeave={() => setShowTooltip(false)} > {' '}
)}
{isAnalysisLevelBarHidden ? null : ( <>
{value}
{unit}
{normRangeText}
{endIcon ||
} )} {(() => { // If parent has nested elements, don't show anything if (hasNestedElements) { return null; } // If we're showing the level bar, don't show waiting if (!isAnalysisLevelBarHidden) { return null; } // If cancelled, don't show waiting if (isCancelled) { return null; } // Otherwise, show waiting for results return ( <>
); })()}
); }; export default AnalysisDoctor;