fix: corrige multiplos problemas de chat e infra

- stack.yml: reduz replicas web para 1 (SQLite nao suporta escrita concorrente)
- chat.rs: janela de chat ja abre minimizada para evitar marcar mensagens como lidas prematuramente
- rustdesk.rs: preserva ID existente do RustDesk ao reprovisionar (evita criar novo ID a cada reinstalacao do Raven)
- ChatWidget.tsx: remove isMinimized das dependencias do useEffect para evitar memory leak de resubscriptions

🤖 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-10 23:28:31 -03:00
parent 695a44781a
commit fb97d9bec8
4 changed files with 80 additions and 34 deletions

View file

@ -80,7 +80,13 @@ export function ChatWidget({ ticketId, ticketRef }: ChatWidgetProps) {
hadSessionRef.current = hasSession
}, [hasSession, ticketId])
// Inicializacao via Convex (WS)
// Ref para acessar isMinimized dentro do callback sem causar resubscription
const isMinimizedRef = useRef(isMinimized)
useEffect(() => {
isMinimizedRef.current = isMinimized
}, [isMinimized])
// Inicializacao via Convex (WS) - NAO depende de isMinimized para evitar resubscriptions
useEffect(() => {
setIsLoading(true)
setMessages([])
@ -107,13 +113,8 @@ export function ChatWidget({ ticketId, ticketRef }: ChatWidgetProps) {
const first = payload.messages[0]
setTicketInfo((prevInfo) => prevInfo ?? { ref: 0, subject: "", agentName: first.authorName ?? "Suporte" })
}
// Marca como lidas se a janela estiver expandida e houver nao lidas
if (backendUnreadCount > 0 && !isMinimized) {
const unreadIds = payload.messages.filter(m => !m.isFromMachine).map(m => m.id as string)
if (unreadIds.length > 0) {
markMachineMessagesRead(ticketId, unreadIds).catch(err => console.error("mark read falhou", err))
}
}
// NAO marca como lidas aqui - deixa o useEffect de expansao fazer isso
// Isso evita marcar como lidas antes do usuario expandir o chat
},
(err) => {
setIsLoading(false)
@ -127,7 +128,7 @@ export function ChatWidget({ ticketId, ticketRef }: ChatWidgetProps) {
messagesSubRef.current?.()
messagesSubRef.current = null
}
}, [ticketId, isMinimized])
}, [ticketId]) // Removido isMinimized - evita memory leak de resubscriptions
// Sincroniza estado de minimizado com o tamanho da janela (Tauri pode alterar por fora)
useEffect(() => {