src/applications/mhv-medical-records/containers/LabsAndTests.jsx
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { focusElement } from '@department-of-veterans-affairs/platform-utilities/ui';
import { updatePageTitle } from '@department-of-veterans-affairs/mhv/exports';
import RecordList from '../components/RecordList/RecordList';
import { getLabsAndTestsList, reloadRecords } from '../actions/labsAndTests';
import {
ALERT_TYPE_ERROR,
CernerAlertContent,
accessAlertTypes,
pageTitles,
recordType,
refreshExtractTypes,
} from '../util/constants';
import RecordListSection from '../components/shared/RecordListSection';
import useAlerts from '../hooks/use-alerts';
import useListRefresh from '../hooks/useListRefresh';
import NewRecordsIndicator from '../components/shared/NewRecordsIndicator';
import CernerFacilityAlert from '../components/shared/CernerFacilityAlert';
const LabsAndTests = () => {
const dispatch = useDispatch();
const updatedRecordList = useSelector(
state => state.mr.labsAndTests.updatedList,
);
const labsAndTests = useSelector(
state => state.mr.labsAndTests.labsAndTestsList,
);
const activeAlert = useAlerts(dispatch);
const listState = useSelector(state => state.mr.labsAndTests.listState);
const refresh = useSelector(state => state.mr.refresh);
const labsAndTestsCurrentAsOf = useSelector(
state => state.mr.labsAndTests.listCurrentAsOf,
);
useListRefresh({
listState,
listCurrentAsOf: labsAndTestsCurrentAsOf,
refreshStatus: refresh.status,
extractType: [refreshExtractTypes.CHEM_HEM, refreshExtractTypes.VPR],
dispatchAction: getLabsAndTestsList,
dispatch,
});
useEffect(
/**
* @returns a callback to automatically load any new records when unmounting this component
*/
() => {
return () => {
dispatch(reloadRecords());
};
},
[dispatch],
);
useEffect(
() => {
focusElement(document.querySelector('h1'));
updatePageTitle(pageTitles.LAB_AND_TEST_RESULTS_PAGE_TITLE);
},
[dispatch],
);
return (
<div id="labs-and-tests">
<h1 className="page-title vads-u-margin-bottom--1">
Lab and test results
</h1>
<p className="vads-u-margin-top--0 vads-u-margin-bottom--4">
Most lab and test results are available{' '}
<span className="vads-u-font-weight--bold">36 hours</span> after the lab
confirms them. Pathology results may take{' '}
<span className="vads-u-font-weight--bold">14 days</span> or longer to
confirm.{' '}
</p>
<CernerFacilityAlert {...CernerAlertContent.LABS_AND_TESTS} />
<RecordListSection
accessAlert={activeAlert && activeAlert.type === ALERT_TYPE_ERROR}
accessAlertType={accessAlertTypes.LABS_AND_TESTS}
recordCount={labsAndTests?.length}
recordType={recordType.LABS_AND_TESTS}
listCurrentAsOf={labsAndTestsCurrentAsOf}
initialFhirLoad={refresh.initialFhirLoad}
>
<NewRecordsIndicator
refreshState={refresh}
extractType={[refreshExtractTypes.CHEM_HEM, refreshExtractTypes.VPR]}
newRecordsFound={
Array.isArray(labsAndTests) &&
Array.isArray(updatedRecordList) &&
labsAndTests.length !== updatedRecordList.length
}
reloadFunction={() => {
dispatch(reloadRecords());
}}
/>
<RecordList records={labsAndTests} type={recordType.LABS_AND_TESTS} />
</RecordListSection>
</div>
);
};
export default LabsAndTests;