import React, { useCallback, useEffect, useId, useState } from 'react'; import { ActionableNotification, Button, Layer, Select, SelectItem, SkeletonText } from '@carbon/react'; import { TrashCan } from '@carbon/react/icons'; import { FieldArray } from 'formik'; import { useTranslation } from 'react-i18next'; import { Autosuggest } from '../../input/custom-input/autosuggest/autosuggest.component'; import { usePatientRegistrationContext } from '../../patient-registration-context'; import { fetchPerson } from '../../patient-registration.resource'; import { useResourcesContext } from '../../../resources-context'; import { type RelationshipValue } from '../../patient-registration.types'; import sectionStyles from '../section.scss'; import styles from './relationships.scss'; interface RelationshipType { display: string; uuid: string; direction: string; } interface RelationshipViewProps { relationship: RelationshipValue; index: number; displayRelationshipTypes: RelationshipType[]; remove: (index: number) => T; } const RelationshipView: React.FC = ({ relationship, index, displayRelationshipTypes, remove, }) => { const { t } = useTranslation(); const { setFieldValue } = usePatientRegistrationContext(); const [isInvalid, setIsInvalid] = useState(false); const newRelationship = !relationship.uuid; const selectId = useId(); const handleRelationshipTypeChange = useCallback( (event) => { const { target } = event; const field = target.name; const value = target.options[target.selectedIndex].value; setFieldValue(field, value); if (!relationship?.action) { setFieldValue(`relationships[${index}].action`, 'UPDATE'); } }, [index, relationship?.action, setFieldValue], ); const handleSuggestionSelected = useCallback( (field: string, selectedSuggestion: string) => { setIsInvalid(!selectedSuggestion); setFieldValue(field, selectedSuggestion); }, [setFieldValue], ); const searchPerson = async (query: string) => { const abortController = new AbortController(); return await fetchPerson(query, abortController); }; const deleteRelationship = useCallback(() => { if (relationship.action === 'ADD') { remove(index); } else { setFieldValue(`relationships[${index}].action`, 'DELETE'); } }, [relationship, index, remove, setFieldValue]); const restoreRelationship = useCallback(() => { setFieldValue(`relationships[${index}]`, { ...relationship, action: undefined, relationshipType: relationship.initialrelationshipTypeValue, }); }, [index, setFieldValue, relationship]); return relationship.action !== 'DELETE' ? (

{t('relationshipPlaceholder', 'Relationship')}

{newRelationship ? ( item.display} getFieldValue={(item) => item.uuid} /> ) : ( <> {t('relativeFullNameLabelText', 'Full name')}

{relationship.relatedPersonName}

)}
) : ( ); }; export const RelationshipsSection = () => { const { relationshipTypes } = useResourcesContext(); const [displayRelationshipTypes, setDisplayRelationshipTypes] = useState([]); const { t } = useTranslation(); useEffect(() => { if (relationshipTypes) { const tmp: RelationshipType[] = []; relationshipTypes.results.forEach((type) => { const aIsToB = { display: type.displayAIsToB ? type.displayAIsToB : type.displayBIsToA, uuid: type.uuid, direction: 'aIsToB', }; const bIsToA = { display: type.displayBIsToA ? type.displayBIsToA : type.displayAIsToB, uuid: type.uuid, direction: 'bIsToA', }; if (aIsToB.display === bIsToA.display) { tmp.push(aIsToB); } else if (bIsToA.display === 'Patient') { tmp.push(aIsToB, { display: `Patient (${aIsToB.display})`, uuid: type.uuid, direction: 'bIsToA' }); } else { tmp.push(aIsToB, bIsToA); } }); setDisplayRelationshipTypes(tmp); } }, [relationshipTypes]); if (!relationshipTypes) { return (
); } return (
{({ push, remove, form: { values: { relationships }, }, }) => (
{relationships && relationships.length > 0 ? relationships.map((relationship: RelationshipValue, index) => { return (
); }) : null}
)}
); };