import React, { useEffect, useState, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { SkeletonText, InlineNotification } from '@carbon/react';
import { type Session, useConfig, useConnectivity } from '@openmrs/esm-framework';
import { useOrderedAddressHierarchyLevels } from './address-hierarchy.resource';
import {
type PatientRegistrationContextProps,
PatientRegistrationContextProvider,
usePatientRegistrationContext,
} from '../../patient-registration-context';
import { ResourcesContextProvider, useResourcesContext } from '../../../resources-context';
import { type AddressTemplate } from '../../patient-registration.types';
import { Input } from '../../input/basic-input/input/input.component';
import AddressHierarchyLevels from './address-hierarchy-levels.component';
import AddressSearchComponent from './address-search.component';
import styles from '../field.scss';
export const AddressComponent: React.FC = () => {
const config = useConfig();
const { t } = useTranslation();
const { setFieldValue } = usePatientRegistrationContext();
const { orderedFields, isLoadingFieldOrder, errorFetchingFieldOrder } = useOrderedAddressHierarchyLevels();
const isOnline = useConnectivity();
const {
fieldConfigurations: {
address: {
useAddressHierarchy: { enabled: addressHierarchyEnabled, useQuickSearch, searchAddressByLevel },
},
},
} = config;
const { addressTemplate } = useResourcesContext();
const addressLayout = useMemo(() => {
if (!addressTemplate?.lines) {
return [];
}
const allFields = addressTemplate?.lines?.flat();
const fields = allFields?.filter(({ isToken }) => isToken === 'IS_ADDR_TOKEN');
const allRequiredFields = Object.fromEntries(addressTemplate?.requiredElements?.map((curr) => [curr, curr]) || []);
return fields.map(({ displayText, codeName }) => {
return {
id: codeName,
name: codeName,
label: displayText,
required: Boolean(allRequiredFields[codeName]),
};
});
}, [addressTemplate]);
const [selected, setSelected] = useState('');
useEffect(() => {
if (addressTemplate?.elementDefaults) {
Object.entries(addressTemplate.elementDefaults).forEach(([name, defaultValue]) => {
setFieldValue(`address.${name}`, defaultValue);
});
}
}, [addressTemplate, setFieldValue]);
const orderedAddressFields = useMemo(() => {
if (isLoadingFieldOrder || errorFetchingFieldOrder) {
return [];
}
const orderMap = Object.fromEntries(orderedFields.map((field, indx) => [field, indx]));
return [...addressLayout].sort(
(existingField1, existingField2) => orderMap[existingField1.name] - orderMap[existingField2.name],
);
}, [isLoadingFieldOrder, errorFetchingFieldOrder, orderedFields, addressLayout]);
if (addressTemplate && !Object.keys(addressTemplate)?.length) {
return (
);
}
if (!addressHierarchyEnabled || !isOnline) {
return (
{addressLayout.map((attributes, index) => (
))}
);
}
if (isLoadingFieldOrder) {
return (
);
}
if (errorFetchingFieldOrder) {
return (
);
}
return (
{useQuickSearch && }
{searchAddressByLevel ? (
) : (
orderedAddressFields.map((attributes, index) => (
))
)}
);
};
const AddressComponentContainer = ({ children }) => {
const { t } = useTranslation();
const contextValue = useMemo(
() =>
({
fieldConfigurations: {},
setFieldValue: async () => {},
values: {},
}) as unknown as PatientRegistrationContextProps,
[],
);
return (
{t('addressHeader', 'Address')}
{children}
);
};