import { FC, Fragment, useState } from 'react' import { useTranslation } from 'react-i18next' import Input from '../../components/Input' import Textarea from '../../components/Textarea' import UploadBox from '../../components/UploadBox' import Button from '../../components/Button' import { CloseCircle, InfoCircle, Paperclip2 } from 'iconsax-react' import { useNavigate, useParams } from 'react-router-dom' import { useAddMessageTicket, useCloseTicket, useGetMessages } from './hooks/useTicketData' import PageLoading from '../../components/PageLoading' import moment from 'moment-jalaali' import { useFormik } from 'formik' import { AddMessageTicketType, TicketMessageType } from './types/TicketTypes' import * as Yup from 'yup' import { toast } from '../../components/Toast'; import { ErrorType } from '../../helpers/types' import { clx } from '../../helpers/utils' import { Pages } from '../../config/Pages' import { useMultiUpload } from '../service/hooks/useServiceData' import ReferTicket from './components/ReferTicket' import CreateTaskFromTicket from './components/CreateTaskFromTicket' const TicketDetail: FC = () => { const { t } = useTranslation('global') const navigate = useNavigate() const { id } = useParams() const getMessages = useGetMessages(id ? id : '') const [files, setFiles] = useState([]) const addMessage = useAddMessageTicket(id ? id : '') const multiUpload = useMultiUpload() const [isResetFiles, setIsResetFiles] = useState(false) const closeTicket = useCloseTicket() const formik = useFormik({ initialValues: { content: '', attachmentUrls: [], }, validationSchema: Yup.object().shape({ content: Yup.string().required(t('errors.required')), }), onSubmit: async (values) => { if (files.length > 0) { const images = new FormData() files.forEach(file => { images.append('files', file) }) await multiUpload.mutateAsync(images, { onSuccess: async (data) => { values.attachmentUrls = await data.data.map((item: { url: string }) => item?.url) }, onError: (error: ErrorType) => { toast(error.response?.data?.error?.message[0] ?? t('error'), 'error') } }) } else { delete values.attachmentUrls } addMessage.mutate(values, { onSuccess: () => { toast(t('success'), 'success') formik.resetForm() setFiles([]) setIsResetFiles(true) setTimeout(() => { setIsResetFiles(false) }, 1000); }, onError: (error: ErrorType) => { toast(error.response?.data?.error?.message[0] ?? t('error'), 'error') } }) }, }) const hadleCloseTicket = () => { closeTicket.mutate(id ? id : '', { onSuccess: () => { toast(t('success'), 'success') navigate(Pages.ticket.list) }, onError: (error: ErrorType) => { toast(error.response?.data?.error?.message[0] ?? t('error'), 'error') } }) } return (
{t('ticket.ticket_number')}
{getMessages.data?.data?.ticket?.numericId}
{ getMessages.isPending ? :
{getMessages.data?.data?.ticket?.subject}
{ getMessages.data?.data?.messages.map((item: TicketMessageType) => { if (item?.author?.roles[0]?.name === 'user') { return (
{item.content}
{moment(item.createdAt).format('jYYYY-jMM-jDD HH:mm')}
{ item.attachments && item?.attachments?.map((item, index: number) => { return ( ) }) }
) } else { return (
{t('ticket.expert')}
{item.author?.firstName + ' ' + item?.author?.lastName}
{item.content}
{moment(item.createdAt).format('jYYYY-jMM-jDD HH:mm')}
{ item.attachments && item?.attachments?.map((item, index: number) => { return ( ) }) }
) } }) } { getMessages.data?.data?.ticket?.status !== 'CLOSED' &&