@@ -19,9 +19,11 @@ import {
1919 prepareEncounter ,
2020 preparePatientIdentifiers ,
2121 preparePatientPrograms ,
22+ preparePersonAttributes ,
2223 saveAttachments ,
2324 savePatientIdentifiers ,
2425 savePatientPrograms ,
26+ savePersonAttributes ,
2527} from './encounter-processor-helper' ;
2628import { type OpenmrsResource , showSnackbar , translateFrom } from '@openmrs/esm-framework' ;
2729import { moduleName } from '../../globals' ;
@@ -31,6 +33,7 @@ import { useEncounterRole } from '../../hooks/useEncounterRole';
3133import { evaluateAsyncExpression , type FormNode } from '../../utils/expression-runner' ;
3234import { hasRendering } from '../../utils/common-utils' ;
3335import { extractObsValueAndDisplay } from '../../utils/form-helper' ;
36+ import { usePersonAttributes } from '../../hooks/usePersonAttributes' ;
3437
3538function useCustomHooks ( context : Partial < FormProcessorContextProps > ) {
3639 const [ isLoading , setIsLoading ] = useState ( true ) ;
@@ -40,13 +43,14 @@ function useCustomHooks(context: Partial<FormProcessorContextProps>) {
4043 context . patient ?. id ,
4144 context . formJson ,
4245 ) ;
46+ const { isLoading : isLoadingPersonAttributes , personAttributes } = usePersonAttributes ( context . patient ?. id ) ;
4347
4448 useEffect ( ( ) => {
45- setIsLoading ( isLoadingPatientPrograms || isLoadingEncounter || isLoadingEncounterRole ) ;
46- } , [ isLoadingPatientPrograms , isLoadingEncounter , isLoadingEncounterRole ] ) ;
49+ setIsLoading ( isLoadingPatientPrograms || isLoadingEncounter || isLoadingEncounterRole || isLoadingPersonAttributes ) ;
50+ } , [ isLoadingPatientPrograms , isLoadingEncounter , isLoadingEncounterRole , isLoadingPersonAttributes ] ) ;
4751
4852 return {
49- data : { encounter, patientPrograms, encounterRole } ,
53+ data : { encounter, patientPrograms, encounterRole, personAttributes } ,
5054 isLoading,
5155 error : null ,
5256 updateContext : ( setContext : React . Dispatch < React . SetStateAction < FormProcessorContextProps > > ) => {
@@ -59,6 +63,7 @@ function useCustomHooks(context: Partial<FormProcessorContextProps>) {
5963 ...context . customDependencies ,
6064 patientPrograms : patientPrograms ,
6165 defaultEncounterRole : encounterRole ,
66+ personAttributes : personAttributes ,
6267 } ,
6368 } ;
6469 } ) ;
@@ -79,6 +84,7 @@ const contextInitializableTypes = [
7984 'patientIdentifier' ,
8085 'encounterRole' ,
8186 'programState' ,
87+ 'personAttributes' ,
8288] ;
8389
8490export class EncounterFormProcessor extends FormProcessor {
@@ -162,6 +168,27 @@ export class EncounterFormProcessor extends FormProcessor {
162168 } ) ;
163169 }
164170
171+ // save person attributes
172+ try {
173+ const personattributes = preparePersonAttributes ( context . formFields , context . location ?. uuid ) ;
174+ const savedPrograms = await savePersonAttributes ( context . patient , personattributes ) ;
175+ if ( savedPrograms ?. length ) {
176+ showSnackbar ( {
177+ title : translateFn ( 'personAttributesSaved' , 'Person attribute(s) saved successfully' ) ,
178+ kind : 'success' ,
179+ isLowContrast : true ,
180+ } ) ;
181+ }
182+ } catch ( error ) {
183+ const errorMessages = extractErrorMessagesFromResponse ( error ) ;
184+ return Promise . reject ( {
185+ title : translateFn ( 'errorSavingPersonAttributes' , 'Error saving person attributes' ) ,
186+ description : errorMessages . join ( ', ' ) ,
187+ kind : 'error' ,
188+ critical : true ,
189+ } ) ;
190+ }
191+
165192 // save encounter
166193 try {
167194 const { data : savedEncounter } = await saveEncounter ( abortController , encounter , encounter . uuid ) ;
0 commit comments