@openmrs/esm-styleguide
Version:
The styleguide for OpenMRS SPA
68 lines (60 loc) • 1.99 kB
text/typescript
/** @module @category UI */
import useSWRImmutable from 'swr/immutable';
import { openmrsFetch, restBaseUrl } from '@openmrs/esm-api';
import type { ObsReferenceRanges } from './interpretation-utils';
export interface UseConceptReferenceRangeResult {
referenceRange: ObsReferenceRanges | undefined;
error?: Error;
isLoading: boolean;
}
interface ConceptReferenceRangeResponse {
results: Array<{
concept: string;
display: string;
hiNormal?: number | null;
hiAbsolute?: number | null;
hiCritical?: number | null;
lowNormal?: number | null;
lowAbsolute?: number | null;
lowCritical?: number | null;
units?: string | null;
}>;
}
/**
* Hook to fetch concept reference range from OpenMRS REST API
* @param conceptUuid - The UUID of the concept to fetch reference range for
* @returns Reference range data, loading state, and error
*/
export function useConceptReferenceRange(
conceptUuid: string | undefined,
patientUuid: string | undefined,
): UseConceptReferenceRangeResult {
let apiUrl: string | null = null;
if (conceptUuid) {
if (patientUuid) {
apiUrl = `${restBaseUrl}/conceptreferencerange/?patient=${patientUuid}&concept=${conceptUuid}&v=full`;
} else {
apiUrl = `${restBaseUrl}/conceptreferencerange/?concept=${conceptUuid}&v=full`;
}
}
const { data, error, isLoading } = useSWRImmutable<{ data: ConceptReferenceRangeResponse }, Error>(
apiUrl,
openmrsFetch,
);
const conceptData = data?.data?.results?.[0];
const referenceRange: ObsReferenceRanges | undefined = conceptData
? {
hiNormal: conceptData.hiNormal ?? null,
hiAbsolute: conceptData.hiAbsolute ?? null,
hiCritical: conceptData.hiCritical ?? null,
lowNormal: conceptData.lowNormal ?? null,
lowAbsolute: conceptData.lowAbsolute ?? null,
lowCritical: conceptData.lowCritical ?? null,
}
: undefined;
return {
referenceRange,
error,
isLoading,
};
}