import type { ILivechatDepartment, ILivechatUnitMonitor, Serialized, IOmnichannelBusinessUnit, OmnichannelBusinessUnitPayload, } from '@rocket.chat/core-typings'; import type { SelectOption } from '@rocket.chat/fuselage'; import { FieldError, Field, TextInput, Button, Select, ButtonGroup, FieldGroup, Box, FieldLabel, FieldRow } from '@rocket.chat/fuselage'; import { ContextualbarScrollableContent, ContextualbarFooter, ContextualbarTitle, ContextualbarHeader, ContextualbarClose, } from '@rocket.chat/ui-client'; import { useToastMessageDispatch, useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; import { useQueryClient } from '@tanstack/react-query'; import { useId, useMemo } from 'react'; import { useForm, Controller } from 'react-hook-form'; import { useFormSubmitWithDirtyCheck } from '../../../hooks/useFormSubmitWithDirtyCheck'; import AutoCompleteDepartmentMultiple from '../components/AutoCompleteDepartmentMultiple'; import AutoCompleteMonitors from '../components/AutoCompleteMonitors'; type UnitEditFormData = { name: string; visibility: string; departments: { value: string; label: string; }[]; monitors: { value: string; label: string; }[]; }; export type UnitEditProps = { unitData?: Serialized; unitMonitors?: Serialized[]; unitDepartments?: Serialized[]; onUpdate?: (params: OmnichannelBusinessUnitPayload) => void; onDelete?: () => void; onClose: () => void; }; const UnitEdit = ({ unitData, unitMonitors, unitDepartments, onUpdate, onDelete, onClose }: UnitEditProps) => { const t = useTranslation(); const saveUnit = useEndpoint('POST', '/v1/livechat/units'); const dispatchToastMessage = useToastMessageDispatch(); const queryClient = useQueryClient(); const visibilityOpts: SelectOption[] = [ ['public', t('Public')], ['private', t('Private')], ]; const { _id } = unitData || {}; const currUnitDepartments = useMemo( () => unitDepartments?.map(({ _id, name }) => ({ value: _id, label: name, })) || [], [unitDepartments], ); const currUnitMonitors = useMemo( () => unitMonitors?.map(({ monitorId, username }) => ({ value: monitorId, label: username, })) || [], [unitMonitors], ); const { control, formState: { errors, isDirty }, handleSubmit, watch, } = useForm({ values: { name: unitData?.name || '', visibility: unitData?.visibility || '', departments: currUnitDepartments, monitors: currUnitMonitors, }, }); const { departments, monitors } = watch(); const handleSave = useFormSubmitWithDirtyCheck( async ({ name, visibility }: UnitEditFormData) => { const departmentsData = departments.map((department) => ({ departmentId: department.value })); const monitorsData = monitors.map((monitor) => ({ monitorId: monitor.value, username: monitor.label, })); const payload = { unitData: { name, visibility }, unitMonitors: monitorsData, unitDepartments: departmentsData, }; try { if (_id && onUpdate) { await onUpdate(payload); } else { await saveUnit(payload); } dispatchToastMessage({ type: 'success', message: t('Saved') }); queryClient.invalidateQueries({ queryKey: ['livechat-units'], }); onClose(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } }, { isDirty }, ); const formId = useId(); const nameField = useId(); const visibilityField = useId(); const departmentsField = useId(); const monitorsField = useId(); return ( <> {_id ? t('Edit_Unit') : t('New_Unit')} {t('Name')} ( )} /> {errors?.name && ( {errors?.name.message} )} {t('Visibility')} (