feat: melhorias no sistema de chat ao vivo
- 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 <noreply@anthropic.com>
This commit is contained in:
parent
3700ac9dad
commit
24dee5d5eb
9 changed files with 74 additions and 31 deletions
|
|
@ -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<i64> = 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
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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::<ChatRuntime>() {
|
||||
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::<ChatRuntime>() {
|
||||
let sessions = chat_runtime.get_sessions();
|
||||
if let Some(session) = sessions.first() {
|
||||
let _ = chat::open_chat_window(tray.app_handle(), &session.ticket_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue