From ce5ea5dad5fb4690260d7335d7e4820d9ff84445 Mon Sep 17 00:00:00 2001 From: esdrasrenan Date: Fri, 12 Dec 2025 23:31:35 -0300 Subject: [PATCH] chat: remover placeholder [Anexo] --- apps/desktop/src/chat/ChatWidget.tsx | 7 ++- src/app/api/machines/chat/messages/route.ts | 48 ++++++++++++++------- src/components/chat/chat-widget.tsx | 8 ++-- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/apps/desktop/src/chat/ChatWidget.tsx b/apps/desktop/src/chat/ChatWidget.tsx index af70455..acacacd 100644 --- a/apps/desktop/src/chat/ChatWidget.tsx +++ b/apps/desktop/src/chat/ChatWidget.tsx @@ -612,7 +612,7 @@ export function ChatWidget({ ticketId, ticketRef }: ChatWidgetProps) { setIsSending(true) try { - const bodyToSend = messageText || (attachmentsToSend.length > 0 ? "[Anexo]" : "") + const bodyToSend = messageText const cfg = await ensureConfig() await invoke("send_chat_message", { baseUrl: cfg.apiBaseUrl, @@ -814,6 +814,9 @@ export function ChatWidget({ ticketId, ticketRef }: ChatWidgetProps) { // No desktop: isFromMachine=true significa mensagem do cliente (maquina) // Layout igual à web: cliente à esquerda, agente à direita const isAgent = !msg.isFromMachine + const bodyText = msg.body.trim() + const shouldShowBody = + bodyText.length > 0 && !(bodyText === "[Anexo]" && (msg.attachments?.length ?? 0) > 0) return (
{firstUnreadAgentMessageId === msg.id && unreadCount > 0 && !isAtBottom && ( @@ -856,7 +859,7 @@ export function ChatWidget({ ticketId, ticketRef }: ChatWidgetProps) { {msg.authorName}

)} -

{msg.body}

+ {shouldShowBody &&

{msg.body}

} {/* Anexos */} {msg.attachments && msg.attachments.length > 0 && (
diff --git a/src/app/api/machines/chat/messages/route.ts b/src/app/api/machines/chat/messages/route.ts index 4fff30b..e431795 100644 --- a/src/app/api/machines/chat/messages/route.ts +++ b/src/app/api/machines/chat/messages/route.ts @@ -14,21 +14,33 @@ const getMessagesSchema = z.object({ limit: z.number().optional(), }) -const postMessageSchema = z.object({ - machineToken: z.string().min(1), - ticketId: z.string().min(1), - body: z.string().min(1).max(4000), - attachments: z - .array( - z.object({ - storageId: z.string(), - name: z.string(), - size: z.number().optional(), - type: z.string().optional(), +const postMessageSchema = z + .object({ + machineToken: z.string().min(1), + ticketId: z.string().min(1), + body: z.string().max(4000).optional(), + attachments: z + .array( + z.object({ + storageId: z.string(), + name: z.string(), + size: z.number().optional(), + type: z.string().optional(), + }) + ) + .optional(), + }) + .superRefine((value, ctx) => { + const body = (value.body ?? "").trim() + const hasAttachments = (value.attachments?.length ?? 0) > 0 + if (body.length === 0 && !hasAttachments) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Mensagem vazia", + path: ["body"], }) - ) - .optional(), -}) + } + }) const CORS_METHODS = "POST, OPTIONS" @@ -123,14 +135,18 @@ export async function POST(request: Request) { } try { + const body = (payload.body ?? "").trim() + const attachments = + payload.attachments && payload.attachments.length > 0 ? payload.attachments : undefined + // Retry com backoff exponencial para falhas transientes const result = await withRetry( () => client.mutation(api.liveChat.postMachineMessage, { machineToken: payload.machineToken, ticketId: payload.ticketId as Id<"tickets">, - body: payload.body, - attachments: payload.attachments as + body, + attachments: attachments as | Array<{ storageId: Id<"_storage"> name: string diff --git a/src/components/chat/chat-widget.tsx b/src/components/chat/chat-widget.tsx index e8aee90..dd781c4 100644 --- a/src/components/chat/chat-widget.tsx +++ b/src/components/chat/chat-widget.tsx @@ -759,6 +759,10 @@ export function ChatWidget() {
{messages.map((msg) => { const isOwn = String(msg.authorId) === String(viewerId) + const bodyText = msg.body?.trim() ?? "" + const shouldShowBody = + bodyText.length > 0 && + !(bodyText === "[Anexo]" && (msg.attachments?.length ?? 0) > 0) return (
)} - {msg.body && ( -

{msg.body}

- )} + {shouldShowBody &&

{msg.body}

} {/* Anexos da mensagem */} {msg.attachments && msg.attachments.length > 0 && (