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:
parent
2b9ada259e
commit
f35c3ea821
@ -119,17 +119,18 @@ class ActionCableConnector extends BaseActionCableConnector {
|
|||||||
this.fetchConversationStats();
|
this.fetchConversationStats();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Dispara banner + som + push do SO quando conversa transiciona para 'open'
|
// Dispara banner + som + push do SO toda vez que conversa transita
|
||||||
// vindo de outro status (pending/snoozed/resolved). Se já está open, ignora.
|
// 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 => {
|
maybeTriggerAggressiveAlert = data => {
|
||||||
if (!data || data.status !== 'open') return;
|
if (!data || data.status !== 'open') return;
|
||||||
const store = this.app.$store;
|
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 =
|
const contactName =
|
||||||
data.meta && data.meta.sender ? data.meta.sender.name : '';
|
data.meta && data.meta.sender ? data.meta.sender.name : '';
|
||||||
const inbox = store.getters['inboxes/getInbox']
|
const inbox = store.getters['inboxes/getInbox']
|
||||||
@ -141,7 +142,7 @@ class ActionCableConnector extends BaseActionCableConnector {
|
|||||||
conversationId: data.id,
|
conversationId: data.id,
|
||||||
contactName,
|
contactName,
|
||||||
inboxName,
|
inboxName,
|
||||||
previousStatus,
|
previousStatus: '',
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user