-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathform-processor-factory.component.tsx
126 lines (115 loc) · 4.91 KB
/
form-processor-factory.component.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import React, { useEffect, useMemo, useState } from 'react';
import useProcessorDependencies from '../../hooks/useProcessorDependencies';
import useInitialValues from '../../hooks/useInitialValues';
import { FormRenderer } from '../renderer/form/form-renderer.component';
import { type FormProcessorContextProps, type FormSchema } from '../../types';
import { CustomHooksRenderer } from '../renderer/custom-hooks-renderer.component';
import { useFormFields } from '../../hooks/useFormFields';
import { useConcepts } from '../../hooks/useConcepts';
import { useFormFieldValidators } from '../../hooks/useFormFieldValidators';
import { useFormFieldsMeta } from '../../hooks/useFormFieldsMeta';
import { useFormFactory } from '../../provider/form-factory-provider';
import { useFormFieldValueAdapters } from '../../hooks/useFormFieldValueAdapters';
import { EncounterFormProcessor } from '../../processors/encounter/encounter-form-processor';
import { reportError } from '../../utils/error-utils';
import { useTranslation } from 'react-i18next';
import Loader from '../loaders/loader.component';
import { registerFormFieldAdaptersForCleanUp } from '../../lifecycle';
interface FormProcessorFactoryProps {
formJson: FormSchema;
isSubForm?: boolean;
setIsLoadingFormDependencies: (isLoading: boolean) => void;
}
const FormProcessorFactory = ({
formJson,
isSubForm = false,
setIsLoadingFormDependencies,
}: FormProcessorFactoryProps) => {
const { patient, sessionMode, formProcessors, layoutType, location, provider, sessionDate, visit, appointments } = useFormFactory();
const processor = useMemo(() => {
const ProcessorClass = formProcessors[formJson.processor];
if (ProcessorClass) {
return new ProcessorClass(formJson);
}
console.error(`Form processor ${formJson.processor} not found, defaulting to EncounterFormProcessor`);
return new EncounterFormProcessor(formJson);
}, [formProcessors, formJson.processor]);
const [processorContext, setProcessorContext] = useState<FormProcessorContextProps>({
patient,
formJson,
sessionMode,
layoutType,
location,
currentProvider: provider,
processor,
sessionDate,
visit,
appointments,
formFields: [],
formFieldAdapters: {},
formFieldValidators: {},
});
const { t } = useTranslation();
const { formFields: rawFormFields, conceptReferences } = useFormFields(formJson);
const { concepts: formFieldsConcepts, isLoading: isLoadingConcepts } = useConcepts(conceptReferences);
const formFieldsWithMeta = useFormFieldsMeta(rawFormFields, formFieldsConcepts);
const formFieldAdapters = useFormFieldValueAdapters(rawFormFields);
const formFieldValidators = useFormFieldValidators(rawFormFields);
const { isLoading: isLoadingCustomDeps } = useProcessorDependencies(processor, processorContext, setProcessorContext);
const useCustomHooks = processor.getCustomHooks().useCustomHooks;
const [isLoadingCustomHooks, setIsLoadingCustomHooks] = useState(!!useCustomHooks);
const [isLoadingProcessorDependencies, setIsLoadingProcessorDependencies] = useState(true);
const {
isLoadingInitialValues,
initialValues,
error: initialValuesError,
} = useInitialValues(processor, isLoadingCustomDeps || isLoadingCustomHooks || isLoadingConcepts, processorContext);
useEffect(() => {
const isLoading = isLoadingCustomDeps || isLoadingCustomHooks || isLoadingConcepts || isLoadingInitialValues;
setIsLoadingFormDependencies(isLoading);
setIsLoadingProcessorDependencies(isLoading);
}, [isLoadingCustomDeps, isLoadingCustomHooks, isLoadingConcepts, isLoadingInitialValues]);
useEffect(() => {
setProcessorContext((prev) => ({
...prev,
...(formFieldAdapters && { formFieldAdapters }),
...(formFieldValidators && { formFieldValidators }),
...(formFieldsWithMeta?.length
? { formFields: formFieldsWithMeta }
: rawFormFields?.length
? { formFields: rawFormFields }
: {}),
}));
}, [formFieldAdapters, formFieldValidators, rawFormFields, formFieldsWithMeta]);
useEffect(() => {
reportError(initialValuesError, t('errorLoadingInitialValues', 'Error loading initial values'));
}, [initialValuesError]);
useEffect(() => {
if (formFieldAdapters) {
registerFormFieldAdaptersForCleanUp(formFieldAdapters);
}
}, [formFieldAdapters]);
return (
<>
{useCustomHooks && (
<CustomHooksRenderer
context={processorContext}
setContext={setProcessorContext}
useCustomHooks={useCustomHooks}
setIsLoadingCustomHooks={setIsLoadingCustomHooks}
/>
)}
{isLoadingProcessorDependencies && !isSubForm ? (
<Loader />
) : (
<FormRenderer
processorContext={processorContext}
initialValues={initialValues}
isSubForm={isSubForm}
setIsLoadingFormDependencies={setIsLoadingFormDependencies}
/>
)}
</>
);
};
export default FormProcessorFactory;