11import { EditOutlined } from '@mui/icons-material' ;
22import { IconButton , Table , TableBody , TableCell , TableRow , Tooltip , Typography } from '@mui/material' ;
3+ import { QuestionnaireResponseItem } from 'fhir/r4b' ;
34import { t } from 'i18next' ;
45import { DateTime } from 'luxon' ;
56import { useCallback , useEffect , useMemo , useState } from 'react' ;
@@ -8,17 +9,20 @@ import { TermsAndConditions } from 'src/components/TermsAndConditions';
89import { makeValidationSchema , pickFirstValueFromAnswerItem , ServiceMode , uuidRegex , VisitType } from 'utils' ;
910import { ValidationError } from 'yup' ;
1011import { dataTestIds } from '../../src/helpers/data-test-ids' ;
12+ import api from '../api/ottehrApi' ;
1113import { intakeFlowPageRoute } from '../App' ;
1214import { PageContainer } from '../components' ;
1315import { ErrorDialog , ErrorDialogConfig } from '../components/ErrorDialog' ;
1416import PageForm from '../components/PageForm' ;
15- import { usePaperworkContext } from '../features/paperwork' ;
17+ import { FormValidationErrorObject , getFormValidationErrors , usePaperworkContext } from '../features/paperwork' ;
18+ import ValidationErrorMessageContent from '../features/paperwork/components/ValidationErrorMessage' ;
19+ import { UNEXPECTED_ERROR_CONFIG } from '../helpers' ;
1620import { getLocaleDateTimeString } from '../helpers/dateUtils' ;
1721import { getValueBoolean } from '../helpers/form' ;
1822import useAppointmentNotFoundInformation from '../helpers/information' ;
1923import { useGetFullName } from '../hooks/useGetFullName' ;
2024import { usePaperworkInviteParams } from '../hooks/usePaperworkInviteParams' ;
21- import { useUCZambdaClient } from '../hooks/useUCZambdaClient' ;
25+ import { useUCZambdaClient , ZambdaClient } from '../hooks/useUCZambdaClient' ;
2226import { otherColors } from '../IntakeThemeProvider' ;
2327import i18n from '../lib/i18n' ;
2428import { useAppointmentStore } from '../telemed/features/appointments/appointment.store' ;
@@ -32,8 +36,10 @@ const ReviewPaperwork = (): JSX.Element => {
3236 const navigate = useNavigate ( ) ;
3337 const { id : appointmentID } = useParams ( ) ;
3438 const { pathname } = useLocation ( ) ;
39+ const [ loading , setLoading ] = useState ( false ) ;
3540 const [ appointmentNotFound , setAppointmentNotFound ] = useState < boolean > ( false ) ;
3641 const zambdaClient = useUCZambdaClient ( { tokenless : true } ) ;
42+ const [ validationErrors , setValidationErrors ] = useState < FormValidationErrorObject | undefined > ( ) ;
3743 const [ errorDialogConfig , setErrorDialogConfig ] = useState < ErrorDialogConfig | undefined > ( undefined ) ;
3844
3945 useEffect ( ( ) => {
@@ -186,10 +192,14 @@ const ReviewPaperwork = (): JSX.Element => {
186192 testId : dataTestIds . checkInTimePaperworkReviewScreen ,
187193 } ,
188194 ...( paperworkPages ?? [ ] ) . map ( ( paperworkPage ) => {
195+ let hasError = false ;
196+ if ( validationErrors ) {
197+ hasError = validationErrors [ paperworkPage . linkId ] ?. length ? true : false ;
198+ }
189199 return {
190200 name : paperworkPage . text ?? 'Review' ,
191201 path : `/paperwork/${ appointmentID } /${ slugFromLinkId ( paperworkPage . linkId ) } ` ,
192- valueBoolean : paperworkCompletedStatus [ paperworkPage . linkId ] ,
202+ valueBoolean : paperworkCompletedStatus [ paperworkPage . linkId ] && ! hasError ,
193203 testId : paperworkPage . linkId + '-status' ,
194204 rowID : paperworkPage . linkId ,
195205 valueTestId : paperworkPage . linkId + '-edit' ,
@@ -206,9 +216,48 @@ const ReviewPaperwork = (): JSX.Element => {
206216 }
207217 } ) ( ) ;
208218
209- const onSubmit = useCallback ( async ( ) : Promise < void > => {
219+ const submitPaperwork = useCallback ( async ( ) : Promise < void > => {
220+ const submitPaperwork = async (
221+ data : QuestionnaireResponseItem [ ] ,
222+ questionnaireResponseId : string ,
223+ zambdaClient : ZambdaClient ,
224+ appointmentId : string
225+ ) : Promise < void > => {
226+ await api . submitPaperwork ( zambdaClient , { answers : data , questionnaireResponseId, appointmentId } ) ;
227+ } ;
210228 if ( appointmentID && questionnaireResponseId && zambdaClient ) {
211229 try {
230+ setLoading ( true ) ;
231+ try {
232+ // try to find out a better way of modeling when appointment id is/isn't needed when consolidating
233+ // this with the telemed code
234+ await submitPaperwork ( [ ] , questionnaireResponseId , zambdaClient , appointmentID ) ;
235+ } catch ( e ) {
236+ const validationErrors = getFormValidationErrors ( e ) ;
237+ if ( validationErrors ) {
238+ console . log ( 'validation errors returned: ' , validationErrors ) ;
239+ setValidationErrors ( validationErrors ) ;
240+ const links = paperworkPages . reduce (
241+ ( accum , current ) => {
242+ if ( Object . keys ( validationErrors ) . includes ( current . linkId ) ) {
243+ accum [ current . linkId ] = {
244+ path : `/paperwork/${ appointmentID } /${ slugFromLinkId ( current . linkId ) } ` ,
245+ pageName : current . text ?? current . linkId ,
246+ } ;
247+ }
248+ return accum ;
249+ } ,
250+ { } as { [ pageId : string ] : { path : string ; pageName : string } }
251+ ) ;
252+ setErrorDialogConfig ( {
253+ title : t ( 'paperworkPages.validationError' ) ,
254+ description : < ValidationErrorMessageContent errorObject = { validationErrors } links = { links } /> ,
255+ } ) ;
256+ } else {
257+ setErrorDialogConfig ( UNEXPECTED_ERROR_CONFIG ( t ) ) ;
258+ }
259+ return ;
260+ }
212261 if ( visitType === VisitType . WalkIn ) {
213262 if ( serviceMode === ServiceMode [ 'virtual' ] ) {
214263 // navigate to waiting room
@@ -245,6 +294,8 @@ const ReviewPaperwork = (): JSX.Element => {
245294 } catch ( e ) {
246295 // todo: handle this better, direct to page where error was found if available
247296 console . error ( 'error submitting paperwork' , e ) ;
297+ } finally {
298+ setLoading ( false ) ;
248299 }
249300 }
250301 } , [
@@ -253,6 +304,7 @@ const ReviewPaperwork = (): JSX.Element => {
253304 zambdaClient ,
254305 visitType ,
255306 serviceMode ,
307+ paperworkPages ,
256308 navigate ,
257309 inviteParams ,
258310 createInviteMutation ,
@@ -337,8 +389,9 @@ const ReviewPaperwork = (): JSX.Element => {
337389 < PageForm
338390 controlButtons = { {
339391 submitLabel : submitButtonLabel ,
392+ loading : loading ,
340393 } }
341- onSubmit = { onSubmit }
394+ onSubmit = { submitPaperwork }
342395 />
343396 < ErrorDialog
344397 open = { ! ! errorDialogConfig }
0 commit comments