@epcare/esm-referal-laboratory-app
Version:
Laboratory microfrontend for OpenMRS 3.x
145 lines (124 loc) • 4.08 kB
text/typescript
import { openmrsFetch, restBaseUrl, useConfig } from '@openmrs/esm-framework';
import { useCallback } from 'react';
import useSWR, { mutate } from 'swr';
export interface Result {
uuid: string;
orderNumber: string;
display: string;
accessionNumber?: string;
instructions?: string;
careSetting: CareSetting;
encounter: Encounter;
specimenSource?: {
uuid: string;
display: string;
};
fulfillerComment?: string;
orderType: OrderType;
concept: Concept;
action: string;
dateStopped?: string;
fulfillerStatus: string;
dateActivated: string;
orderer: Orderer;
urgency: string;
patient: Patient2;
type: string;
}
export interface CareSetting {
uuid: string;
}
export interface Encounter {
uuid: string;
obs: Ob[];
}
export interface Ob {
order?: Order;
}
export interface Order {
uuid: string;
display: string;
patient: Patient;
}
export interface Patient {
uuid: string;
display: string;
}
export interface OrderType {
uuid: string;
display: string;
}
export interface Concept {
display: string;
uuid: string;
}
export interface Orderer {
uuid: string;
display: string;
}
export interface Patient2 {
uuid: string;
names: Name[];
display: string;
gender: string;
birthdate: string;
identifiers: Identifier[];
}
export interface Name {
display: string;
}
export interface Identifier {
voided: boolean;
preferred: boolean;
uuid: string;
display: string;
identifierType: IdentifierType;
}
export interface IdentifierType {
uuid: string;
}
export function useGetOrdersWorklist(fulfillerStatus: string, dateTo?: string) {
const { laboratoryOrderTypeUuid } = useConfig();
const customRepresentation =
'v=custom:(uuid,orderNumber,accessionNumber,instructions,specimenSource:(uuid,display),careSetting:(uuid),encounter:(uuid,obs:(order:(uuid,display,patient:(uuid,display)))),fulfillerComment,orderType:(display),concept:(display,uuid),action,dateStopped,fulfillerStatus,dateActivated,orderer:(uuid,display),urgency,patient:(uuid,names:(display),display,gender,birthdate,identifiers:(voided,preferred,uuid,display,identifierType:(uuid))))';
const orderTypeQuery = laboratoryOrderTypeUuid !== '' ? `orderTypes=${laboratoryOrderTypeUuid}` : '';
let apiUrl = `${restBaseUrl}/order?${orderTypeQuery}&fulfillerStatus=${fulfillerStatus}&${customRepresentation}`;
if (dateTo) {
apiUrl += `&activatedOnOrAfterDate=${dateTo}`;
}
const mutateOrders = useCallback(
() =>
mutate(
(key) =>
typeof key === 'string' && key.startsWith(`${restBaseUrl}/order?orderTypes=${laboratoryOrderTypeUuid}`),
),
[laboratoryOrderTypeUuid],
);
const { data, error, isLoading } = useSWR<{ data: { results: Array<Result> } }, Error>(apiUrl, openmrsFetch);
return {
data: data?.data ? data.data.results : [],
isLoading,
isError: error,
mutate: mutateOrders,
};
}
// get new refered orders
export function useGetNewReferredOrders(status: string, dateTo?: string) {
const customRepresentation =
'v=custom:(order:(uuid,orderNumber,accessionNumber,instructions,specimenSource:(uuid,display),careSetting:(uuid),encounter:(uuid,obs:(order:(uuid,display,patient:(uuid,display)))),fulfillerComment,orderType:(display),concept:(display,uuid),action,dateStopped,fulfillerStatus,dateActivated,orderer:(uuid,display),urgency,patient:(uuid,names:(display),display,gender,birthdate,identifiers:(voided,preferred,uuid,display,identifierType:(uuid)))),syncTask)';
let apiUrl = `${restBaseUrl}/referredorders?fulfillerStatus=${status}&${customRepresentation}`;
if (dateTo) {
apiUrl += `&activatedOnOrAfterDate=${dateTo}`;
}
const { data, error, isLoading } = useSWR<{ data: { results: Array<any> } }, Error>(apiUrl, openmrsFetch);
const mutateReferredOrders = useCallback(
() => mutate((key) => typeof key === 'string' && key.startsWith(`${restBaseUrl}/syncreferralorder`)),
[],
);
return {
data: data?.data?.results ?? [],
isLoading,
isError: error,
mutate: mutateReferredOrders,
};
}