import { useMemo } from 'react'; import { ArrowDown } from 'lucide-react'; import { cn } from '@kit/ui/utils'; import { AnalysisResultForDisplay } from './analysis-doctor'; export enum AnalysisResultLevel { VERY_LOW = 0, LOW = 1, NORMAL = 2, HIGH = 3, VERY_HIGH = 4, } const Level = ({ isActive = false, color, isFirst = false, isLast = false, arrowLocation, }: { isActive?: boolean; color: 'destructive' | 'success' | 'warning' | 'gray-200'; isFirst?: boolean; isLast?: boolean; arrowLocation?: number; }) => { return (
{isActive && (
)}
); }; export const AnalysisLevelBarSkeleton = () => { return (
); }; const AnalysisLevelBar = ({ normLowerIncluded = true, normUpperIncluded = true, level, results, }: { normLowerIncluded?: boolean; normUpperIncluded?: boolean; level: AnalysisResultLevel; results: AnalysisResultForDisplay; }) => { const { norm_lower: lower, norm_upper: upper, response_value: value, } = results; const arrowLocation = useMemo(() => { if (value < lower!) { return 0; } if (normLowerIncluded || normUpperIncluded) { return 50; } const calculated = ((value - lower!) / (upper! - lower!)) * 100; if (calculated > 100) { return 100; } return calculated; }, [value, upper, lower]); const [isVeryLow, isLow, isHigh, isVeryHigh] = useMemo( () => [ level === AnalysisResultLevel.VERY_LOW, level === AnalysisResultLevel.LOW, level === AnalysisResultLevel.HIGH, level === AnalysisResultLevel.VERY_HIGH, ], [level, value, upper, lower], ); const hasAbnormalLevel = isVeryLow || isLow || isHigh || isVeryHigh; return (
{normLowerIncluded && ( <> )} {normUpperIncluded && ( <> )}
); }; export default AnalysisLevelBar;