@@ -19,9 +19,11 @@ import {
19
19
prepareEncounter ,
20
20
preparePatientIdentifiers ,
21
21
preparePatientPrograms ,
22
+ preparePersonAttributes ,
22
23
saveAttachments ,
23
24
savePatientIdentifiers ,
24
25
savePatientPrograms ,
26
+ savePersonAttributes ,
25
27
} from './encounter-processor-helper' ;
26
28
import { type OpenmrsResource , showSnackbar , translateFrom } from '@openmrs/esm-framework' ;
27
29
import { moduleName } from '../../globals' ;
@@ -31,6 +33,7 @@ import { useEncounterRole } from '../../hooks/useEncounterRole';
31
33
import { evaluateAsyncExpression , type FormNode } from '../../utils/expression-runner' ;
32
34
import { hasRendering } from '../../utils/common-utils' ;
33
35
import { extractObsValueAndDisplay } from '../../utils/form-helper' ;
36
+ import { usePersonAttributes } from '../../hooks/usePersonAttributes' ;
34
37
35
38
function useCustomHooks ( context : Partial < FormProcessorContextProps > ) {
36
39
const [ isLoading , setIsLoading ] = useState ( true ) ;
@@ -40,13 +43,14 @@ function useCustomHooks(context: Partial<FormProcessorContextProps>) {
40
43
context . patient ?. id ,
41
44
context . formJson ,
42
45
) ;
46
+ const { isLoading : isLoadingPersonAttributes , personAttributes } = usePersonAttributes ( context . patient ?. id ) ;
43
47
44
48
useEffect ( ( ) => {
45
- setIsLoading ( isLoadingPatientPrograms || isLoadingEncounter || isLoadingEncounterRole ) ;
46
- } , [ isLoadingPatientPrograms , isLoadingEncounter , isLoadingEncounterRole ] ) ;
49
+ setIsLoading ( isLoadingPatientPrograms || isLoadingEncounter || isLoadingEncounterRole || isLoadingPersonAttributes ) ;
50
+ } , [ isLoadingPatientPrograms , isLoadingEncounter , isLoadingEncounterRole , isLoadingPersonAttributes ] ) ;
47
51
48
52
return {
49
- data : { encounter, patientPrograms, encounterRole } ,
53
+ data : { encounter, patientPrograms, encounterRole, personAttributes } ,
50
54
isLoading,
51
55
error : null ,
52
56
updateContext : ( setContext : React . Dispatch < React . SetStateAction < FormProcessorContextProps > > ) => {
@@ -59,6 +63,7 @@ function useCustomHooks(context: Partial<FormProcessorContextProps>) {
59
63
...context . customDependencies ,
60
64
patientPrograms : patientPrograms ,
61
65
defaultEncounterRole : encounterRole ,
66
+ personAttributes : personAttributes ,
62
67
} ,
63
68
} ;
64
69
} ) ;
@@ -79,6 +84,7 @@ const contextInitializableTypes = [
79
84
'patientIdentifier' ,
80
85
'encounterRole' ,
81
86
'programState' ,
87
+ 'personAttributes' ,
82
88
] ;
83
89
84
90
export class EncounterFormProcessor extends FormProcessor {
@@ -162,6 +168,27 @@ export class EncounterFormProcessor extends FormProcessor {
162
168
} ) ;
163
169
}
164
170
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
+
165
192
// save encounter
166
193
try {
167
194
const { data : savedEncounter } = await saveEncounter ( abortController , encounter , encounter . uuid ) ;
0 commit comments