fix(whatsapp): refresh inboxes when opening new conversation composer (#15337)

When an agent starts a new conversation, the WhatsApp template picker in
the composer only shows templates that were already loaded into the
frontend store — it doesn't refresh when the composer opens. If a
template sync completed after the store was last populated, the newly
synced template shows up on the inbox's Settings > Templates page (which
always refetches on load) but not in the New Conversation composer,
since that view relied solely on the account-cache-invalidated websocket
event, which doesn't always reach an already-open session in time.

## What changed
- `ComposeConversation.vue` now dispatches a cache-aware `inboxes/get`
refetch every time the composer popover opens, so the WhatsApp template
list is current before an agent picks a template to message a customer.
The refetch checks the account's cache key first and only re-pulls the
full inbox list when it's actually stale, so it stays cheap in the
common case.

## How to reproduce
1. Sync/update WhatsApp templates for an inbox (e.g. via Settings >
Inboxes > [WhatsApp inbox] > Sync Templates).
2. Without reloading the page, open the New Conversation composer for
that inbox and check the WhatsApp template picker — a newly synced
template may be missing until this fix.

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
This commit is contained in:
Tanmay Deep Sharma
2026-08-06 12:26:12 +05:30
committed by GitHub
parent 78069b01f6
commit 430c5cfef0
4 changed files with 25 additions and 4 deletions

View File

@@ -201,6 +201,9 @@ const onPopoverShow = () => {
// Flag to prevent triggering drag n drop,
// When compose modal is active
emitter.emit(BUS_EVENTS.NEW_CONVERSATION_MODAL, true);
// Cache-aware refetch, so newly synced WhatsApp templates show up here
// even if the account-cache-invalidated websocket event was missed.
store.dispatch('inboxes/get');
};
const onPopoverHide = () => {

View File

@@ -21,10 +21,15 @@ const { t } = useI18n();
const getFilteredWhatsAppTemplates = useMapGetter(
'inboxes/getFilteredWhatsAppTemplates'
);
const inboxesUiFlags = useMapGetter('inboxes/getUIFlags');
const searchQuery = ref('');
const selectedTemplate = ref(null);
// Gates the trigger while ComposeConversation's on-open refetch is in flight,
// so an agent can't open the picker before a stale template list is refreshed.
const isRefreshingTemplates = computed(() => inboxesUiFlags.value.isFetching);
const whatsAppTemplateMessages = computed(() => {
return getFilteredWhatsAppTemplates.value(props.inboxId);
});
@@ -74,7 +79,7 @@ const handleSendMessage = (template, hide) => {
:label="t('COMPOSE_NEW_CONVERSATION.FORM.WHATSAPP_OPTIONS.LABEL')"
color="slate"
size="sm"
:disabled="selectedTemplate"
:disabled="selectedTemplate || isRefreshingTemplates"
class="!text-xs font-medium"
/>
<template #content="{ hide }">