import type { IOmnichannelServiceLevelAgreements, Serialized } from '@rocket.chat/core-typings'; import { Field, FieldLabel, FieldRow, FieldError, TextInput, Button, NumberInput, ButtonGroup } from '@rocket.chat/fuselage'; import { ContextualbarFooter, ContextualbarScrollableContent } from '@rocket.chat/ui-client'; import { useToastMessageDispatch, useRoute, useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; import { useId } from 'react'; import { useController, useForm } from 'react-hook-form'; import { useFormSubmitWithDirtyCheck } from '../../../hooks/useFormSubmitWithDirtyCheck'; export type SlaEditProps = { isNew?: boolean; slaId?: string; reload: () => void; data?: Serialized; }; type SlaEditFormData = { name: string; description?: string; dueTimeInMinutes: number; }; function SlaEdit({ data, isNew, slaId, reload, ...props }: SlaEditProps) { const slasRoute = useRoute('omnichannel-sla-policies'); const saveSLA = useEndpoint('POST', '/v1/livechat/sla'); const updateSLA = useEndpoint('PUT', `/v1/livechat/sla/:slaId`, { slaId: slaId || '' }); const dispatchToastMessage = useToastMessageDispatch(); const t = useTranslation(); const { control, formState: { errors, isDirty }, handleSubmit, reset, } = useForm({ defaultValues: { name: data?.name || '', description: data?.description || '', dueTimeInMinutes: data?.dueTimeInMinutes || 0, }, }); const { field: nameField } = useController({ control, name: 'name', rules: { required: t('Required_field', { field: t('Name') }) }, }); const { field: dueTimeField } = useController({ control, name: 'dueTimeInMinutes', rules: { validate(value) { return Number(value || 0) <= 0 ? t('Required_field', { field: t('Estimated_wait_time_in_minutes') }) : true; }, }, }); const { field: descField } = useController({ control, name: 'description' }); const formId = useId(); const nameFieldId = useId(); const descFieldId = useId(); const dueTimeFieldId = useId(); const handleSave = useFormSubmitWithDirtyCheck( async ({ name, description, dueTimeInMinutes }: SlaEditFormData) => { try { const payload = { name, description, dueTimeInMinutes: Number(dueTimeInMinutes) }; if (slaId) { await updateSLA(payload); } else { await saveSLA(payload); } dispatchToastMessage({ type: 'success', message: t('Saved') }); reload(); slasRoute.push({}); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } }, { isDirty }, ); return ( <> {t('Name')} {errors.name && ( {errors.name.message} )} {t('Description')} {t('Estimated_wait_time_in_minutes')} {errors.dueTimeInMinutes && ( {errors.dueTimeInMinutes.message} )} {!isNew && ( )} ); } export default SlaEdit;