From 24dee5d5eb671a9a79843e2132c8a52f3b0ad454 Mon Sep 17 00:00:00 2001 From: Seu Nome Date: Mon, 8 Dec 2025 11:06:01 -0300 Subject: [PATCH] feat: melhorias no sistema de chat ao vivo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Chat do agente abre expandido automaticamente ao iniciar nova sessao - Toasts fecham apos tempo fixo independente do foco da janela - Janela de chat do desktop com transparencia (sem fundo branco) - Chat reabre quando usuario abre o Raven (duplo clique no tray) - Chat nao reabre sozinho com novas mensagens (apenas notificacao) - Mensagem de toast simplificada: "Chat ao vivo iniciado" - Reduz intervalo de polling SSE de 2s para 1s (mais responsivo) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- apps/desktop/src-tauri/src/chat.rs | 25 ++++++++++---------- apps/desktop/src-tauri/src/lib.rs | 14 +++++++++++ apps/desktop/src/chat/ChatWidget.tsx | 4 ++-- apps/desktop/src/index.css | 8 ++++++- apps/desktop/src/main.tsx | 2 +- src/app/api/machines/chat/stream/route.ts | 4 ++-- src/components/chat/chat-widget.tsx | 21 ++++++++++++++++ src/components/tickets/ticket-chat-panel.tsx | 4 ++-- src/components/ui/sonner.tsx | 23 +++++++++--------- 9 files changed, 74 insertions(+), 31 deletions(-) diff --git a/apps/desktop/src-tauri/src/chat.rs b/apps/desktop/src-tauri/src/chat.rs index 4740e8b..ce5518a 100644 --- a/apps/desktop/src-tauri/src/chat.rs +++ b/apps/desktop/src-tauri/src/chat.rs @@ -663,7 +663,7 @@ async fn run_polling_loop( crate::log_info!("Iniciando polling HTTP (fallback)"); let start = std::time::Instant::now(); - let poll_interval = Duration::from_secs(2); + let poll_interval = Duration::from_secs(1); // 1s para ser mais responsivo let mut last_checked_at: Option = None; loop { @@ -747,10 +747,15 @@ async fn process_chat_update( }, ); + // Abrir janela de chat imediatamente quando nova sessao e detectada + if let Err(e) = open_chat_window(app, &session.ticket_id) { + crate::log_warn!("Falha ao abrir janela de chat para nova sessao: {}", e); + } + // Notificacao nativa let notification_title = format!("Chat iniciado - Chamado #{}", session.ticket_ref); let notification_body = format!( - "{} iniciou um chat de suporte.\nClique no icone do Raven para abrir.", + "{} iniciou um chat de suporte.", session.agent_name ); let _ = app @@ -797,7 +802,7 @@ async fn process_chat_update( }), ); - // Notificar novas mensagens + // Notificar novas mensagens (sem abrir janela automaticamente - so na nova sessao) if new_messages && total_unread > 0 { let new_count = total_unread - prev_unread; @@ -812,12 +817,7 @@ async fn process_chat_update( }), ); - // Abrir janela de chat - if let Some(session) = current_sessions.first() { - let _ = open_chat_window(app, &session.ticket_id); - } - - // Notificacao nativa + // Notificacao nativa (sem abrir janela - usuario pode clicar para abrir) let notification_title = "Nova mensagem de suporte"; let notification_body = if new_count == 1 { "Voce recebeu 1 nova mensagem no chat".to_string() @@ -875,9 +875,10 @@ fn open_chat_window_internal(app: &tauri::AppHandle, ticket_id: &str) -> Result< ) .title("Chat de Suporte") .inner_size(380.0, 520.0) - .min_inner_size(300.0, 400.0) + .min_inner_size(168.0, 36.0) // Tamanho minimo para modo minimizado .position(x, y) .decorations(false) // Sem decoracoes nativas - usa header customizado + .transparent(true) // Permite fundo transparente .always_on_top(true) .skip_taskbar(true) .focused(true) @@ -914,9 +915,9 @@ pub fn set_chat_minimized(app: &tauri::AppHandle, ticket_id: &str, minimized: bo let label = format!("chat-{}", ticket_id); let window = app.get_webview_window(&label).ok_or("Janela nao encontrada")?; - // Tamanhos + // Tamanhos - chip minimizado precisa ser exato para transparencia funcionar let (width, height) = if minimized { - (200.0, 56.0) // Tamanho do chip + (168.0, 36.0) // Tamanho exato do chip rounded-full } else { (380.0, 520.0) // Tamanho expandido }; diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 7e45c7d..baff18e 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -577,6 +577,13 @@ fn setup_tray(app: &tauri::AppHandle) -> tauri::Result<()> { let _ = win.show(); let _ = win.set_focus(); } + // Reabrir chat se houver sessao ativa + if let Some(chat_runtime) = tray.app_handle().try_state::() { + let sessions = chat_runtime.get_sessions(); + if let Some(session) = sessions.first() { + let _ = chat::open_chat_window(tray.app_handle(), &session.ticket_id); + } + } } "chat" => { // Abrir janela de chat se houver sessao ativa @@ -601,6 +608,13 @@ fn setup_tray(app: &tauri::AppHandle) -> tauri::Result<()> { let _ = win.show(); let _ = win.set_focus(); } + // Reabrir chat se houver sessao ativa + if let Some(chat_runtime) = tray.app_handle().try_state::() { + let sessions = chat_runtime.get_sessions(); + if let Some(session) = sessions.first() { + let _ = chat::open_chat_window(tray.app_handle(), &session.ticket_id); + } + } } }); diff --git a/apps/desktop/src/chat/ChatWidget.tsx b/apps/desktop/src/chat/ChatWidget.tsx index 220e602..bc8fcf3 100644 --- a/apps/desktop/src/chat/ChatWidget.tsx +++ b/apps/desktop/src/chat/ChatWidget.tsx @@ -359,7 +359,7 @@ export function ChatWidget({ ticketId }: ChatWidgetProps) { // Quando não há sessão, mostrar versão minimizada com indicador de offline if (!hasSession) { return ( -
+
@@ -375,7 +375,7 @@ export function ChatWidget({ ticketId }: ChatWidgetProps) { // Versão minimizada (chip compacto igual web) if (isMinimized) { return ( -
+