import type { ILivechatContact, Serialized } from '@rocket.chat/core-typings'; import { Badge, Box, Field, FieldError, FieldGroup, FieldHint, FieldLabel, FieldRow, Select } from '@rocket.chat/fuselage'; import { GenericModal } from '@rocket.chat/ui-client'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { useAtLeastOnePermission } from '@rocket.chat/ui-contexts'; import { useMemo } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { mapLivechatContactConflicts } from '../../../../../lib/mapLivechatContactConflicts'; import { useHasLicenseModule } from '../../../../hooks/useHasLicenseModule'; import { ContactManagerInput } from '../../additionalForms'; import { useCustomFieldsMetadata } from '../../directory/hooks/useCustomFieldsMetadata'; import { useReviewContact } from '../hooks/useReviewContact'; export type ReviewContactModalProps = { contact: Serialized; onCancel: () => void; }; type HandleConflictsPayload = { name: string; contactManager: string; [key: string]: string; }; const ReviewContactModal = ({ contact, onCancel }: ReviewContactModalProps) => { const { t } = useTranslation(); const { data: hasLicense = false } = useHasLicenseModule('livechat-enterprise'); const { control, handleSubmit, formState: { errors }, } = useForm(); const canViewCustomFields = useAtLeastOnePermission(['view-livechat-room-customfields', 'edit-livechat-room-customfields']); const { data: customFieldsMetadata = [] } = useCustomFieldsMetadata({ scope: 'visitor', enabled: canViewCustomFields, }); const editContact = useReviewContact(['getContactById']); const handleConflicts = async ({ name, contactManager, ...customFields }: HandleConflictsPayload) => { const payload = { name, contactManager, ...(customFields && { customFields }), wipeConflicts: true, }; editContact.mutate( { contactId: contact?._id, ...payload }, { onSettled: () => onCancel(), }, ); }; const conflictingFields = useMemo(() => { const mappedConflicts = mapLivechatContactConflicts(contact, customFieldsMetadata); return Object.values(mappedConflicts); }, [contact, customFieldsMetadata]); return ( {conflictingFields.map(({ name, label, values }, index) => { const isContactManagerField = name === 'contactManager'; const mappedOptions = values.map((option) => [option, option] as const); const Component = isContactManagerField ? ContactManagerInput : Select; if (isContactManagerField && !hasLicense) { return null; } return ( {t(label as TranslationKey)} ( )} /> {t('different_values_found', { number: values.length })} {errors?.[name] && {errors?.[name]?.message}} ); })} ); }; export default ReviewContactModal;