"use client"; import { useEffect, useRef, useState } from "react"; import Link from "next/link"; import { AnimatePresence, motion } from "framer-motion"; import { ArrowLeft, Send } from "lucide-react"; import { useTicketEvents } from "@/lib/events/use-ticket-events"; import { formatRelativeTime } from "@/lib/format"; import type { TicketDTO, MessageDTO, TicketStatus } from "@/lib/tickets/types"; const STATUS_LABEL: Record = { new: "Новая", open: "Открыта", pending: "В ожидании", closed: "Закрыта", }; export function TicketThread({ ticket: initialTicket, initialMessages, agents, }: { ticket: TicketDTO; initialMessages: MessageDTO[]; agents: { id: string; name: string }[]; }) { const [ticket, setTicket] = useState(initialTicket); const [messages, setMessages] = useState(initialMessages); const [draft, setDraft] = useState(""); const [sending, setSending] = useState(false); const bottomRef = useRef(null); useTicketEvents("/api/events", (event) => { if (event.type === "ticket.updated" && event.ticket.id === ticket.id) { setTicket(event.ticket); } if (event.type === "message.created" && event.ticketId === ticket.id) { setMessages((prev) => (prev.some((m) => m.id === event.message.id) ? prev : [...prev, event.message])); } }); useEffect(() => { bottomRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages.length]); async function sendReply() { if (!draft.trim()) return; setSending(true); const res = await fetch(`/api/tickets/${ticket.id}/messages`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ body: draft }), }); setSending(false); if (res.ok) setDraft(""); } async function updateStatus(status: TicketStatus) { const res = await fetch(`/api/tickets/${ticket.id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ status }), }); if (res.ok) { const { ticket: updated } = await res.json(); setTicket(updated); } } async function updateAssignee(assigneeId: string) { const res = await fetch(`/api/tickets/${ticket.id}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ assigneeId: assigneeId || null }), }); if (res.ok) { const { ticket: updated } = await res.json(); setTicket(updated); } } return (
Дашборд

{ticket.subject}

{ticket.customerName}

{messages.map((message) => ( ))}