fhir-react
Version:
React component library for displaying FHIR Resources
176 lines (163 loc) • 4.54 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import _get from 'lodash/get';
import _has from 'lodash/has';
import Coding from '../../datatypes/Coding';
import CodeableConcept, { hasValue } from '../../datatypes/CodeableConcept';
import Date from '../../datatypes/Date';
import fhirVersions from '../fhirResourceVersions';
import UnhandledResourceDataStructure from '../UnhandledResourceDataStructure';
import {
Root,
Header,
Title,
Badge,
BadgeSecondary,
Body,
Value,
MissingValue,
} from '../../ui';
const commonDTO = fhirResource => {
const model = _get(fhirResource, 'model', 'Device');
const status = _get(fhirResource, 'status', '');
const getTypeCoding = _get(fhirResource, 'type.coding');
const hasTypeCoding = Array.isArray(getTypeCoding);
return {
model,
status,
getTypeCoding,
hasTypeCoding,
};
};
const dstu2DTO = fhirResource => {
const getUdi = _get(fhirResource, 'udi');
const hasExpiry = _has(fhirResource, 'expiry');
const getExpiry = _get(fhirResource, 'expiry');
return {
getUdi,
hasExpiry,
getExpiry,
};
};
const stu3DTO = fhirResource => {
const getUdi = _get(fhirResource, 'udi.name');
const hasExpiry = _has(fhirResource, 'expirationDate');
const getExpiry = _get(fhirResource, 'expirationDate');
const safety = _get(fhirResource, 'safety', []);
const hasSafety = hasValue(safety);
return {
getUdi,
hasExpiry,
getExpiry,
safety,
hasSafety,
};
};
const r4DTO = fhirResource => {
const getUdi = _get(fhirResource, 'udiCarrier.deviceIdentifier');
const hasExpiry = _has(fhirResource, 'expirationDate');
const getExpiry = _get(fhirResource, 'expirationDate');
const udiCarrierAIDC = _get(fhirResource, 'udiCarrier.carrierAIDC');
const udiCarrierHRF = _get(fhirResource, 'udiCarrier.carrierHRF');
const safety = _get(fhirResource, 'safety', []);
const hasSafety = hasValue(safety);
return {
getUdi,
hasExpiry,
getExpiry,
udiCarrierAIDC,
udiCarrierHRF,
safety,
hasSafety,
};
};
const resourceDTO = (fhirVersion, fhirResource) => {
switch (fhirVersion) {
case fhirVersions.DSTU2: {
return {
...commonDTO(fhirResource),
...dstu2DTO(fhirResource),
};
}
case fhirVersions.STU3: {
return {
...commonDTO(fhirResource),
...stu3DTO(fhirResource),
};
}
case fhirVersions.R4: {
return {
...commonDTO(fhirResource),
...r4DTO(fhirResource),
};
}
default:
throw Error('Unrecognized the fhir version property type.');
}
};
const Device = props => {
const { fhirResource, fhirVersion } = props;
let fhirResourceData = {};
try {
fhirResourceData = resourceDTO(fhirVersion, fhirResource);
} catch (error) {
console.warn(error.message);
return <UnhandledResourceDataStructure resourceName="Device" />;
}
const {
model,
status,
hasExpiry,
getExpiry,
getTypeCoding,
hasTypeCoding,
getUdi,
udiCarrierAIDC,
udiCarrierHRF,
safety,
hasSafety,
} = fhirResourceData;
const safetyArr = hasSafety && !Array.isArray(safety) ? [safety] : safety;
return (
<Root name="Device">
<Header>
{model && <Title>{model}</Title>}
{status && <Badge data-testid="status">{status}</Badge>}
{hasExpiry && (
<BadgeSecondary data-testid="expiry">
expires on <Date fhirData={getExpiry} />
</BadgeSecondary>
)}
</Header>
<Body>
{hasTypeCoding && (
<Value data-testid="typeCoding" label="Type">
{getTypeCoding.map((coding, i) => (
<Coding key={`item-${i}`} fhirData={coding} />
))}
</Value>
)}
<Value label="Unique device identifier" data-testid="uniqueId">
{getUdi ? getUdi : <MissingValue />}
</Value>
{udiCarrierAIDC && <Value label="AIDC barcode">{udiCarrierAIDC}</Value>}
{udiCarrierHRF && <Value label="HRF barcode">{udiCarrierHRF}</Value>}
{hasSafety &&
safetyArr.map((item, i) => (
<Value label="HRF barcode" key={`safety-${i}`}>
<CodeableConcept fhirData={item} />
</Value>
))}
</Body>
</Root>
);
};
Device.propTypes = {
fhirResource: PropTypes.shape({}).isRequired,
fhirVersion: PropTypes.oneOf([
fhirVersions.DSTU2,
fhirVersions.STU3,
fhirVersions.R4,
]).isRequired,
};
export default Device;