@openmrs/esm-styleguide
Version:
The styleguide for OpenMRS SPA
60 lines (53 loc) • 2.62 kB
text/typescript
import { useMemo } from 'react';
import useSWRImmutable from 'swr/immutable';
import { openmrsFetch, restBaseUrl } from '@openmrs/esm-api';
import { useConfig } from '@openmrs/esm-react-utils';
import { type Patient } from './types';
const customRepresentation =
'custom:(uuid,display,identifiers:(identifier,uuid,preferred,location:(uuid,name),identifierType:(uuid,name,format,formatDescription,validator)),person:(uuid,display,gender,birthdate,dead,age,deathDate,birthdateEstimated,causeOfDeath,preferredName:(uuid,preferred,givenName,middleName,familyName),attributes,preferredAddress:(uuid,preferred,address1,address2,cityVillage,longitude,stateProvince,latitude,country,postalCode,countyDistrict,address3,address4,address5,address6,address7)))';
/**
* React hook that takes patientUuid and return Patient Attributes {@link Attribute}
* @param patientUuid Unique Patient identifier
* @returns Object containing `patient-attributes`, `isLoading` loading status, `error`
*/
export const usePatientAttributes = (patientUuid: string) => {
const { data, error, isLoading } = useSWRImmutable<{ data: Patient }>(
`${restBaseUrl}/patient/${patientUuid}?v=${customRepresentation}`,
openmrsFetch,
);
return {
isLoading,
attributes: data?.data.person.attributes ?? [],
error: error,
};
};
/**
* React hook that takes patientUuid and returns contact details
* derived from patient attributes using configured attributeTypes.
*
* Note: This hook loads configuration from '@openmrs/esm-patient-banner-app'
* because the contact attribute types are defined in the patient banner's
* configuration schema. While this hook lives in esm-styleguide, it serves
* the patient banner's contact details display.
*
* @param patientUuid - Unique patient identifier
* @returns {Object} Object containing filtered contact attributes, loading status, and error
* @property {Array} contactAttributes - List of contact-related attributes
* @property {boolean} isLoading - Loading status
* @property {Error|null} error - Error object if request fails
*/
export const usePatientContactAttributes = (patientUuid: string) => {
const { contactAttributeTypes = [] } = useConfig({
externalModuleName: '@openmrs/esm-patient-banner-app',
});
const { attributes, error, isLoading } = usePatientAttributes(patientUuid);
const contactAttributes = useMemo(
() => attributes.filter(({ attributeType }) => contactAttributeTypes?.some((uuid) => attributeType.uuid === uuid)),
[attributes, contactAttributeTypes],
);
return {
contactAttributes,
isLoading,
error,
};
};