fix(aggressive-alert): dispara em qualquer transição pra 'open'

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) <noreply@anthropic.com>
This commit is contained in:
Rodribm10 2026-04-23 18:13:57 -03:00
parent 2b9ada259e
commit f35c3ea821

View File

@ -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: '',
});
};