From f35c3ea8219855fb42ea37387879a2749ce7ecf9 Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Thu, 23 Apr 2026 18:13:57 -0300 Subject: [PATCH] =?UTF-8?q?fix(aggressive-alert):=20dispara=20em=20qualque?= =?UTF-8?q?r=20transi=C3=A7=C3=A3o=20pra=20'open'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Race condition: quando o próprio usuário reabre a conversa, o dispatch HTTP (toggleStatus) comita CHANGE_CONVERSATION_STATUS no Vuex ANTES do broadcast actionCable chegar. Aí o check previousStatus === 'open' bloqueava o alerta porque o store já estava em status=open. Broadcast conversation.status_changed (app/listeners/action_cable_listener.rb linha 103) só é emitido em transição real. Conversa nova entra via onConversationCreated, não por status_changed. Não precisa do lookup. Removido: getConversationById + guarda early-return por previousStatus. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dashboard/helper/actionCable.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/app/javascript/dashboard/helper/actionCable.js b/app/javascript/dashboard/helper/actionCable.js index 6713603a8..6fe1c65e8 100644 --- a/app/javascript/dashboard/helper/actionCable.js +++ b/app/javascript/dashboard/helper/actionCable.js @@ -119,17 +119,18 @@ class ActionCableConnector extends BaseActionCableConnector { this.fetchConversationStats(); }; - // Dispara banner + som + push do SO quando conversa transiciona para 'open' - // vindo de outro status (pending/snoozed/resolved). Se já está open, ignora. + // Dispara banner + som + push do SO toda vez que conversa transita + // pra 'open'. Broadcast `conversation.status_changed` só chega em + // mudança real de status, então confiar no evento é suficiente. + // + // Não usar store.getters.getConversationById(id).status pra detectar + // transição: quando o próprio usuário reabre, o dispatch HTTP local + // (toggleStatus→CHANGE_CONVERSATION_STATUS) já mutou o store antes do + // broadcast chegar → previousStatus === 'open' bloqueava o alerta. + // Conversas novas entram via onConversationCreated, não por status_changed. maybeTriggerAggressiveAlert = data => { if (!data || data.status !== 'open') return; const store = this.app.$store; - const existing = store.getters.getConversationById(data.id); - const previousStatus = existing ? existing.status : null; - // Só alerta se a conversa já existia no store com outro status. - // (Conversa nova em 'open' vai por onConversationCreated; não é reabertura.) - if (!previousStatus || previousStatus === 'open') return; - const contactName = data.meta && data.meta.sender ? data.meta.sender.name : ''; const inbox = store.getters['inboxes/getInbox'] @@ -141,7 +142,7 @@ class ActionCableConnector extends BaseActionCableConnector { conversationId: data.id, contactName, inboxName, - previousStatus, + previousStatus: '', }); };