import { type FC, useMemo, useState } from "react"; import { useParams } from "react-router-dom"; import Input from "@/components/Input"; import { clx } from "@/helpers/utils"; import { t } from "@/locale"; import { getTicketDisplayName } from "./types/TicketTypes"; import type { TicketDetailType } from "./types/TicketTypes"; import { useCloseTicket, useCreateOrReplyTicket, useGetTicketById } from "./hooks/useTicketData"; import { buildThreadItems, getStatusClass } from "./detailUtils"; import MessageBubble from "./MessageBubble"; import ReplyForm from "./ReplyForm"; import TicketInfoSidebar from "./TicketInfoSidebar"; import TicketDetailActions from "./TicketDetailActions"; const STATUS_CLOSED = "closed"; const TicketDetail: FC = () => { const { id } = useParams<{ id: string }>(); const [content, setContent] = useState(""); const [files, setFiles] = useState([]); const getTicket = useGetTicketById(id ?? ""); const addMessage = useCreateOrReplyTicket(); const closeTicket = useCloseTicket(); const ticket = getTicket.data?.data; const threadItems = useMemo( () => (ticket ? buildThreadItems(ticket) : []), [ticket] ); const isClosed = ticket?.status?.toLowerCase() === STATUS_CLOSED || ticket?.status?.toUpperCase() === "CLOSED"; const handleCloseTicket = () => { if (!id) return; closeTicket.mutate( { id, params: { status: "closed" } }, { onSuccess: () => getTicket.refetch(), } ); }; const handleSendReply = () => { if (!id || !ticket || !content.trim()) return; addMessage.mutate( { parentId: id, subject: ticket.subject, content: content.trim(), attachments: files.length ? files.map(() => ({})) : [], }, { onSuccess: () => { setContent(""); setFiles([]); getTicket.refetch(); }, } ); }; const handleScrollToReply = () => { document.getElementById("content")?.scrollIntoView({ behavior: "smooth" }); document.getElementById("content")?.focus(); }; if (getTicket.isPending) { return (
{t("ticket.ticket_number")}
Loading...
); } if (!ticket) { return (
{t("ticket.ticket_number")}
{t("ticket.info_ticket")}
); } const extendedTicket = ticket as TicketDetailType & { danakService?: { name?: string }; numericId?: string; }; return (
{t("ticket.ticket_number")}: {extendedTicket.numericId ?? ticket.id} {t(`ticket.${ticket.status}`) || t(`ticket.${ticket.status?.toUpperCase()}`)}
{extendedTicket.danakService && ( )}
{threadItems.map((item) => (
))}
{!isClosed && ( )}
); }; export default TicketDetail;