Skip to content

Commit

Permalink
Make a common patient context hook
Browse files Browse the repository at this point in the history
  • Loading branch information
vasharma05 committed Oct 11, 2024
1 parent 0bd67cf commit 69786c1
Show file tree
Hide file tree
Showing 16 changed files with 57 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import AddressHierarchyLevels from './address-hierarchy-levels.component';
import AddressSearchComponent from './address-search.component';
import styles from '../field.scss';
import type { FormValues } from '../../patient-registration.types';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

function parseString(xmlDockAsString: string) {
const parser = new DOMParser();
Expand Down Expand Up @@ -48,7 +49,7 @@ export const AddressComponent: React.FC = () => {
},
} = config;

const { setValue } = useContext(PatientRegistrationContext);
const { setValue } = usePatientRegistrationContext();
const { orderedFields, isLoadingFieldOrder, errorFetchingFieldOrder } = useOrderedAddressHierarchyLevels();

useEffect(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useAddressEntries, useAddressEntryFetchConfig } from './address-hierarc
import ComboInput from '../../input/combo-input/combo-input.component';
import { PatientRegistrationContext } from '../../patient-registration-context';
import type { FormValues } from '../../patient-registration.types';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

interface AddressComboBoxProps {
attribute: {
Expand All @@ -22,7 +23,7 @@ interface AddressHierarchyLevelsProps {
const AddressComboBox: React.FC<AddressComboBoxProps> = ({ attribute }) => {
const { t } = useTranslation();
const fieldName = `address.${attribute.name}` as keyof FormValues;
const { setValue, watch } = useContext(PatientRegistrationContext);
const { setValue, watch } = usePatientRegistrationContext();
const fieldValue = watch(fieldName);
const { fetchEntriesForField, searchString, updateChildElements } = useAddressEntryFetchConfig(attribute.name);
const { entries } = useAddressEntries(fetchEntriesForField, searchString);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export function useAddressEntries(fetchResults, searchString) {
*/
export function useAddressEntryFetchConfig(addressField: string) {
const { orderedFields, isLoadingFieldOrder } = useOrderedAddressHierarchyLevels();
const { setValue } = useContext(PatientRegistrationContext);
const { setValue } = usePatientRegistrationContext();
const { watch } = usePatientRegistrationContext();
const addressValues = watch('address');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Search } from '@carbon/react';
import { useTranslation } from 'react-i18next';
import { useFormikContext } from 'formik';
import styles from './address-search.scss';
import { PatientRegistrationContext } from '../../patient-registration-context';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

interface AddressSearchComponentProps {
addressLayout: Array<any>;
Expand All @@ -13,7 +13,7 @@ interface AddressSearchComponentProps {
const AddressSearchComponent: React.FC<AddressSearchComponentProps> = ({ addressLayout }) => {
const { t } = useTranslation();
const separator = ' > ';
const { control, setValue } = useContext(PatientRegistrationContext);
const { control, setValue } = usePatientRegistrationContext();
const searchBox = useRef(null);
const wrapper = useRef(null);
const [searchString, setSearchString] = useState<string>('');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import { useConceptAnswers } from '../field.resource';
import styles from '../field.scss';
import { PatientRegistrationContext } from '../../patient-registration-context';
import { Controller } from 'react-hook-form';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

export const CauseOfDeathField: React.FC = () => {
const { t } = useTranslation();
const { fieldConfigurations, freeTextFieldConceptUuid } = useConfig<RegistrationConfig>();
const { getFieldState, control } = useContext(PatientRegistrationContext);
const { getFieldState, control } = usePatientRegistrationContext();
const { error, isTouched } = getFieldState('deathCause');

const conceptUuid = fieldConfigurations?.causeOfDeath?.conceptUuid;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { OpenmrsDatePicker } from '@openmrs/esm-framework';
import { PatientRegistrationContext } from '../../patient-registration-context';
import styles from '../field.scss';
import { Controller } from 'react-hook-form';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

export const DateAndTimeOfDeathField: React.FC = () => {
const { t } = useTranslation();
Expand All @@ -23,7 +24,7 @@ export const DateAndTimeOfDeathField: React.FC = () => {
};

function DeathDateField() {
const { watch, setValue, control } = useContext(PatientRegistrationContext);
const { watch, setValue, control } = usePatientRegistrationContext();
const isDead = watch('isDead');
const { t } = useTranslation();
const today = dayjs().hour(23).minute(59).second(59).toDate();
Expand Down Expand Up @@ -58,7 +59,7 @@ function DeathDateField() {

function DeathTimeField() {
const { t } = useTranslation();
const { control } = useContext(PatientRegistrationContext);
const { control } = usePatientRegistrationContext();

return (
<Controller
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import type {
} from '../../patient-registration.types';
import { ResourcesContext } from '../../../offline.resources';
import styles from '../field.scss';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

export function setIdentifierSource(
identifierSource: IdentifierSource,
Expand Down Expand Up @@ -64,7 +65,7 @@ export const Identifiers: React.FC = () => {
formState: { defaultValues },
setValue,
isOffline,
} = useContext(PatientRegistrationContext);
} = usePatientRegistrationContext();
const identifiers = watch('identifiers');
const { t } = useTranslation();
const layout = useLayoutType();
Expand Down Expand Up @@ -138,6 +139,7 @@ export const Identifiers: React.FC = () => {
</UserHasAccess>
<div>
{Object.entries(identifiers).map(([fieldName, identifier]) => (
// @ts-ignore
<IdentifierInput key={fieldName} fieldName={fieldName} patientIdentifier={identifier} />
))}
{showIdentifierOverlay && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
import { initializeIdentifier, setIdentifierSource } from './id-field.component';
import styles from './identifier-selection.scss';
import { type UseFormSetValue } from 'react-hook-form';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

interface PatientIdentifierOverlayProps {
setFieldValue: UseFormSetValue<FormValues>;
Expand All @@ -26,9 +27,10 @@ const PatientIdentifierOverlay: React.FC<PatientIdentifierOverlayProps> = ({ clo
isOffline,
watch,
formState: { defaultValues },
} = useContext(PatientRegistrationContext);
} = usePatientRegistrationContext();
const identifiers = watch('identifiers');
const [unsavedIdentifierTypes, setUnsavedIdentifierTypes] = useState<FormValues['identifiers']>(identifiers);
console.log({ unsavedIdentifierTypes });

Check failure on line 33 in packages/esm-patient-registration-app/src/patient-registration/field/id/identifier-selection-overlay.component.tsx

View workflow job for this annotation

GitHub Actions / build

Unexpected console statement
const [searchString, setSearchString] = useState<string>('');
const { t } = useTranslation();
const { defaultPatientIdentifierTypes } = useConfig();
Expand Down Expand Up @@ -162,7 +164,7 @@ const PatientIdentifierOverlay: React.FC<PatientIdentifierOverlayProps> = ({ clo

const handleConfiguringIdentifiers = useCallback(() => {
setFieldValue('identifiers', unsavedIdentifierTypes);
closeOverlay();
// closeOverlay();
}, [unsavedIdentifierTypes, setFieldValue, closeOverlay]);

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ interface DateObsFieldProps {
function DateObsField({ concept, label, required, placeholder }: DateObsFieldProps) {
const { t } = useTranslation();
const fieldName = `obs.${concept.uuid}`;
const { setValue } = useContext(PatientRegistrationContext);
const { setValue } = usePatientRegistrationContext();
const { control } = usePatientRegistrationContext();

const onDateChange = (date: Date) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Layer, TextInput } from '@carbon/react';
import { Controller, type ControllerRenderProps } from 'react-hook-form';
import { type FormValues } from '../../../patient-registration.types';
import { PatientRegistrationContext } from '../../../patient-registration-context';
import { usePatientRegistrationContext } from '../../../patient-registration-hooks';

// FIXME Temporarily imported here
export interface TextInputProps
Expand Down Expand Up @@ -132,7 +133,7 @@ interface InputProps extends TextInputProps {

export const Input: React.FC<InputProps> = ({ checkWarning, ...props }) => {
const { t } = useTranslation();
const { getFieldState, control, watch } = useContext(PatientRegistrationContext);
const { getFieldState, control, watch } = usePatientRegistrationContext();
const { error } = getFieldState(props.name);

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import styles from '../input.scss';
import { Controller } from 'react-hook-form';
import { PatientRegistrationContext } from '../../patient-registration-context';
import { type FormValues } from '../../patient-registration.types';
import { usePatientRegistrationContext } from '../../patient-registration-hooks';

interface ComboInputProps {
entries: Array<string>;
Expand All @@ -27,7 +28,7 @@ const ComboInput: React.FC<ComboInputProps> = ({
const [highlightedEntry, setHighlightedEntry] = useState(-1);
const [showEntries, setShowEntries] = useState(false);
const comboInputRef = useRef(null);
const { control, setValue, watch } = useContext(PatientRegistrationContext);
const { control, setValue, watch } = usePatientRegistrationContext();
const value = watch(name) ?? '';

const handleFocus = useCallback(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { PatientRegistrationContext } from '../../../patient-registration-contex
import { Input } from '../../basic-input/input/input.component';
import styles from '../../input.scss';
import { Controller, useFormContext } from 'react-hook-form';
import { usePatientRegistrationContext } from '../../../patient-registration-hooks';

interface IdentifierInputProps {
patientIdentifier: PatientIdentifierValue;
Expand All @@ -21,7 +22,7 @@ const IdentifierInput: React.FC<IdentifierInputProps> = ({ patientIdentifier, fi
const { t } = useTranslation();
const { defaultPatientIdentifierTypes } = useConfig();
const { identifierTypes } = useContext(ResourcesContext);
const { isOffline, watch, setValue, getFieldState, control } = useContext(PatientRegistrationContext);
const { isOffline, watch, setValue, getFieldState, control } = usePatientRegistrationContext();
const identifierType = useMemo(
() => identifierTypes.find((identifierType) => identifierType.uuid === patientIdentifier.identifierTypeUuid),
[patientIdentifier, identifierTypes],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { type RegistrationConfig } from '../config-schema';
import { type CapturePhotoProps, type FormValues } from './patient-registration.types';
import { type UseFormReturn } from 'react-hook-form';

export interface PatientRegistrationContextProps extends UseFormReturn<FormValues> {
export interface PatientRegistrationContextProps {
currentPhoto: string;
identifierTypes: Array<any>;
inEditMode: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import { useInitialPatientRelationships } from './section/patient-relationships/
import dayjs from 'dayjs';
import { z } from 'zod';
import { PatientRegistrationContext } from './patient-registration-context';
import { useFormContext } from 'react-hook-form';

export function useInitialFormValues(patientUuid: string): [FormValues, Dispatch<FormValues>] {
const { freeTextFieldConceptUuid } = useConfig<RegistrationConfig>();
Expand Down Expand Up @@ -340,5 +341,8 @@ function getPatientAttributeUuidMapForPatient(attributes: Array<PersonAttributeR
}

export function usePatientRegistrationContext() {
return useContext(PatientRegistrationContext);
return {
...useContext(PatientRegistrationContext),
...useFormContext<FormValues>(),
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ export const PatientRegistration: React.FC<PatientRegistrationProps> = ({ savePa
reset,
} = methods;

console.log('rerendering');

Check failure on line 88 in packages/esm-patient-registration-app/src/patient-registration/patient-registration-rhf.component.tsx

View workflow job for this annotation

GitHub Actions / build

Unexpected console statement

const onFormSubmit = async (values: FormValues) => {
const abortController = new AbortController();
// helpers.setSubmitting(true);
Expand Down Expand Up @@ -170,6 +172,18 @@ export const PatientRegistration: React.FC<PatientRegistrationProps> = ({ savePa
}
};

const contextState = useMemo(
() => ({
identifierTypes: identifierTypes,
validationSchema,
inEditMode,
setCapturePhotoProps,
currentPhoto: photo?.imageSrc,
isOffline,
}),
[identifierTypes, identifierTypes, validationSchema, inEditMode, setCapturePhotoProps, photo?.imageSrc, isOffline],
);

return (
<Form className={styles.form} onSubmit={handleSubmit(onFormSubmit, displayErrors)}>
<BeforeSavePrompt when={isDirty} redirect={target} />
Expand Down Expand Up @@ -215,27 +229,13 @@ export const PatientRegistration: React.FC<PatientRegistrationProps> = ({ savePa
</div>
</div>
<div className={styles.infoGrid}>
<FormProvider {...methods}>
<PatientRegistrationContext.Provider
value={{
...methods,
identifierTypes: identifierTypes,
validationSchema,
// values: props.values,
inEditMode,
// setFieldValue: props.setFieldValue,
// setFieldTouched: props.setFieldTouched,
setCapturePhotoProps,
currentPhoto: photo?.imageSrc,
isOffline,
// initialFormValues: defaultValues,
// setInitialFormValues,
}}>
<PatientRegistrationContext.Provider value={contextState}>
<FormProvider {...methods}>
{sections.map((section, index) => (
<SectionWrapper key={`registration-section-${section.id}`} sectionDefinition={section} index={index} />
))}
</PatientRegistrationContext.Provider>
</FormProvider>
</FormProvider>
</PatientRegistrationContext.Provider>
</div>
</div>
</Form>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ export const DemographicsSection: React.FC<DemographicsSectionProps> = ({ fields
const nameInLocalLanguage = watch(addNameInLocalLanguageFieldName);
const isTouched = getFieldState(addNameInLocalLanguageFieldName);

useEffect(() => {
if (nameInLocalLanguage && isTouched) {
setValue('additionalGivenName', '');
setValue('additionalMiddleName', '');
setValue('additionalFamilyName', '');
}
}, [nameInLocalLanguage, isTouched]);
// useEffect(() => {
// if (nameInLocalLanguage && isTouched) {
// setValue('additionalGivenName', '');
// setValue('additionalMiddleName', '');
// setValue('additionalFamilyName', '');
// }
// }, [nameInLocalLanguage, isTouched]);

return (
<section className={styles.formSection} aria-label="Demographics Section">
Expand Down

0 comments on commit 69786c1

Please sign in to comment.