chat: remover placeholder [Anexo]

This commit is contained in:
esdrasrenan 2025-12-12 23:31:35 -03:00
parent 119ada60a6
commit ce5ea5dad5
3 changed files with 42 additions and 21 deletions

View file

@ -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 (
<div key={msg.id} className="space-y-2">
{firstUnreadAgentMessageId === msg.id && unreadCount > 0 && !isAtBottom && (
@ -856,7 +859,7 @@ export function ChatWidget({ ticketId, ticketRef }: ChatWidgetProps) {
{msg.authorName}
</p>
)}
<p className="whitespace-pre-wrap text-sm">{msg.body}</p>
{shouldShowBody && <p className="whitespace-pre-wrap text-sm">{msg.body}</p>}
{/* Anexos */}
{msg.attachments && msg.attachments.length > 0 && (
<div className="mt-2 space-y-2">

View file

@ -14,10 +14,11 @@ const getMessagesSchema = z.object({
limit: z.number().optional(),
})
const postMessageSchema = z.object({
const postMessageSchema = z
.object({
machineToken: z.string().min(1),
ticketId: z.string().min(1),
body: z.string().min(1).max(4000),
body: z.string().max(4000).optional(),
attachments: z
.array(
z.object({
@ -28,7 +29,18 @@ const postMessageSchema = z.object({
})
)
.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"],
})
}
})
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

View file

@ -759,6 +759,10 @@ export function ChatWidget() {
<div className="space-y-3">
{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 (
<div
key={msg.id}
@ -785,9 +789,7 @@ export function ChatWidget() {
{msg.authorName ?? "Cliente"}
</p>
)}
{msg.body && (
<p className="whitespace-pre-wrap text-sm">{msg.body}</p>
)}
{shouldShowBody && <p className="whitespace-pre-wrap text-sm">{msg.body}</p>}
{/* Anexos da mensagem */}
{msg.attachments && msg.attachments.length > 0 && (
<div className={cn("mt-2 flex flex-wrap gap-1.5", isOwn && "justify-end")}>