UNPKG

fhir-react

Version:

React component library for displaying FHIR Resources

141 lines (126 loc) 3.47 kB
import React from 'react'; import PropTypes from 'prop-types'; import Coding from '../../datatypes/Coding'; import Reference from '../../datatypes/Reference'; import Annotation from '../../datatypes/Annotation'; import _get from 'lodash/get'; import { Root, Header, Title, BadgeSecondary, Badge, Body, Value, } from '../../ui'; import UnhandledResourceDataStructure from '../UnhandledResourceDataStructure'; import fhirVersions from '../fhirResourceVersions'; import Date from '../../datatypes/Date'; const commonDTO = fhirResource => { const title = _get(fhirResource, 'condition[0].code.text') || _get(fhirResource, 'condition[0].code.coding[0].display', ''); const date = _get(fhirResource, 'date'); const status = _get(fhirResource, 'status'); const relationship = _get(fhirResource, 'relationship.coding', []); const hasRelationship = relationship.length > 0; const patient = _get(fhirResource, 'patient'); return { title, date, status, relationship, hasRelationship, patient, }; }; const dstu2DTO = fhirResource => { const notes = []; const noteText = _get(fhirResource, 'condition.0.note.text'); if (noteText) { notes.push({ text: noteText }); } const hasNotes = notes.length > 0; return { notes, hasNotes }; }; const stu3DTO = fhirResource => { const notes = _get(fhirResource, 'condition.0.note', []); const hasNotes = notes.length > 0; return { notes, hasNotes }; }; const resourceDTO = (fhirVersion, fhirResource) => { switch (fhirVersion) { case fhirVersions.DSTU2: { return { ...commonDTO(fhirResource), ...dstu2DTO(fhirResource), }; } case fhirVersions.STU3: { return { ...commonDTO(fhirResource), ...stu3DTO(fhirResource), }; } default: throw Error('Unrecognized the fhir version property type.'); } }; const FamilyMemberHistory = props => { const { fhirResource, fhirVersion } = props; let fhirResourceData = {}; try { fhirResourceData = resourceDTO(fhirVersion, fhirResource); } catch (error) { console.warn(error.message); return <UnhandledResourceDataStructure resourceName="Encounter" />; } const { title, date, status, relationship, hasRelationship, patient, hasNotes, notes, } = fhirResourceData; return ( <Root name="FamilyMemberHistory"> <Header> <Title>{title}</Title> {status && <Badge data-testid="status">{status}</Badge>} {date && ( <BadgeSecondary> on <Date fhirData={date} /> </BadgeSecondary> )} </Header> <Body> {patient && ( <Value label="Patient" data-testid="patient"> <Reference fhirData={patient} /> </Value> )} {hasRelationship && ( <Value label="Relationship" data-testid="hasRelationship"> {relationship.map((item, i) => ( <Coding key={`item-${i}`} fhirData={item} /> ))} </Value> )} {hasNotes && ( <Value label="Note" data-testid="noteText"> <Annotation fhirData={notes} /> </Value> )} </Body> </Root> ); }; FamilyMemberHistory.propTypes = { fhirResource: PropTypes.shape({}).isRequired, fhirVersion: PropTypes.oneOf([fhirVersions.DSTU2, fhirVersions.STU3]) .isRequired, }; export default FamilyMemberHistory;