import type { ILivechatAgent, ILivechatAgentStatus, ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; import { Field, FieldLabel, FieldGroup, FieldRow, TextInput, Button, Box, Icon, Select, ButtonGroup } from '@rocket.chat/fuselage'; import type { SelectOption } from '@rocket.chat/fuselage'; import { useStableCallback } from '@rocket.chat/fuselage-hooks'; import { ContextualbarTitle, ContextualbarClose, ContextualbarHeader, ContextualbarScrollableContent, ContextualbarFooter, } from '@rocket.chat/ui-client'; import { useToastMessageDispatch, useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; import { useQueryClient } from '@tanstack/react-query'; import { useId, useMemo } from 'react'; import { useForm, Controller, FormProvider } from 'react-hook-form'; import { getUserEmailAddress } from '../../../../lib/getUserEmailAddress'; import { UserInfoAvatar } from '../../../components/UserInfo'; import { omnichannelQueryKeys } from '../../../lib/queryKeys'; import { MaxChatsPerAgent } from '../additionalForms'; import AutoCompleteDepartmentMultiple from '../components/AutoCompleteDepartmentMultiple'; type AgentEditFormData = { name: string | undefined; username: string | undefined; email: string | undefined; departments: { label: string; value: string }[]; status: ILivechatAgentStatus; maxNumberSimultaneousChat: number; }; export type AgentEditProps = { agentData: Pick; agentDepartments: (Pick & { departmentName: string })[]; }; const AgentEdit = ({ agentData, agentDepartments }: AgentEditProps) => { const t = useTranslation(); const router = useRouter(); const queryClient = useQueryClient(); const dispatchToastMessage = useToastMessageDispatch(); const { name, username, livechat, statusLivechat } = agentData; const email = getUserEmailAddress(agentData); const statusOptions: SelectOption[] = useMemo( () => [ ['available', t('Available')], ['not-available', t('Not_Available')], ], [t], ); const initialDepartmentValue = useMemo( () => agentDepartments.map(({ departmentName, departmentId }) => ({ label: departmentName, value: departmentId })) || [], [agentDepartments], ); const methods = useForm({ values: { name, username, email, departments: initialDepartmentValue, status: statusLivechat, maxNumberSimultaneousChat: livechat?.maxNumberSimultaneousChat || 0, }, }); const { control, handleSubmit, reset, formState: { isDirty }, } = methods; const saveAgentInfo = useEndpoint('POST', '/v1/livechat/agents.saveInfo'); const saveAgentStatus = useEndpoint('POST', '/v1/livechat/agent.status'); const handleSave = useStableCallback(async ({ status, departments, ...data }: AgentEditFormData) => { try { await saveAgentStatus({ agentId: agentData._id, status }); await saveAgentInfo({ agentId: agentData._id, agentData: data, agentDepartments: departments.map((dep) => dep.value), }); dispatchToastMessage({ type: 'success', message: t('Success') }); router.navigate('/omnichannel/agents'); queryClient.invalidateQueries({ queryKey: omnichannelQueryKeys.agents() }); queryClient.invalidateQueries({ queryKey: omnichannelQueryKeys.agentDepartments(agentData._id) }); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } }); const formId = useId(); const nameField = useId(); const usernameField = useId(); const emailField = useId(); const departmentsFieldId = useId(); const statusField = useId(); return ( <> {t('Edit_User')} router.navigate('/omnichannel/agents')} />
{username && ( )} {t('Name')} } /> {t('Username')} } />} /> {t('Email')} } />} /> {t('Departments')} ( )} /> {t('Status')} (