Fix chat widget UI and allow attachment-only messages

- Allow sending messages with only attachments (no text required)
- Change "Chat Ativo" header to just "Chat"
- Replace Headphones icon with MessageCircle for own messages
- Replace PhoneOff icon with XCircle for end chat button

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
esdrasrenan 2025-12-07 03:09:51 -03:00
parent 60e98dd47c
commit f45ee91804
2 changed files with 18 additions and 15 deletions

View file

@ -3178,14 +3178,17 @@ export const postChatMessage = mutation({
}
const trimmedBody = body.replace(/\r\n/g, "\n").trim()
if (trimmedBody.length === 0) {
throw new ConvexError("Digite uma mensagem para enviar no chat")
const files = attachments ?? []
// Validar que há pelo menos texto ou anexo
if (trimmedBody.length === 0 && files.length === 0) {
throw new ConvexError("Digite uma mensagem ou anexe um arquivo")
}
if (trimmedBody.length > 4000) {
throw new ConvexError("Mensagem muito longa (máx. 4000 caracteres)")
}
const files = attachments ?? []
// Validar anexos
if (files.length > 5) {
throw new ConvexError("Envie até 5 arquivos por mensagem")
}
@ -3196,13 +3199,14 @@ export const postChatMessage = mutation({
}
}
const normalizedBody = await normalizeTicketMentions(ctx, trimmedBody, { user: participant.user, role: participant.role ?? "" }, ticketDoc.tenantId)
const plainLength = plainTextLength(normalizedBody)
if (plainLength === 0) {
throw new ConvexError("A mensagem está vazia após a formatação")
}
if (plainLength > 4000) {
throw new ConvexError("Mensagem muito longa (máx. 4000 caracteres)")
// Normalizar corpo apenas se houver texto
let normalizedBody = ""
if (trimmedBody.length > 0) {
normalizedBody = await normalizeTicketMentions(ctx, trimmedBody, { user: participant.user, role: participant.role ?? "" }, ticketDoc.tenantId)
const plainLength = plainTextLength(normalizedBody)
if (plainLength > 4000) {
throw new ConvexError("Mensagem muito longa (máx. 4000 caracteres)")
}
}
const authorSnapshot: CommentAuthorSnapshot = {