H-43: fix WEB Captain takeover E2E flow (#8)

* test(shangwutong): cover CID rename reliability

* H-43: fix WEB Captain takeover flow

* H-48: preserve compatible provider model

* H-49: make Captain takeover atomic

* H-50: prevent duplicate widget initialization

---------

Co-authored-by: Rogee <rogee@ipao.vip>
This commit is contained in:
Rogee
2026-08-13 14:49:04 +08:00
committed by GitHub
co-authored by rogee
parent fff3dce1bd
commit 74eb006985
21 changed files with 431 additions and 63 deletions
@@ -68,7 +68,7 @@ const isHMACVerified = computed(() => {
});
const currentContact = computed(() =>
store.getters['contacts/getContact'](props.chat.meta.sender.id)
store.getters['contacts/getContact'](props.chat?.meta?.sender?.id)
);
const isSnoozed = computed(
@@ -245,7 +245,8 @@ export const mutations = {
if (!conversation?.id) return;
const { allConversations } = _state;
const index = allConversations.findIndex(c => c.id === conversation.id);
const normalizedId = Number(conversation.id);
const index = allConversations.findIndex(c => Number(c.id) === normalizedId);
if (index > -1) {
const selectedConversation = allConversations[index];
@@ -256,8 +257,12 @@ export const mutations = {
}
const { messages, ...updates } = conversation;
allConversations[index] = { ...selectedConversation, ...updates };
if (_state.selectedChatId === conversation.id) {
allConversations[index] = {
...selectedConversation,
...updates,
id: selectedConversation.id,
};
if (Number(_state.selectedChatId) === normalizedId) {
emitter.emit(BUS_EVENTS.SCROLL_TO_MESSAGE);
}
} else {
@@ -802,6 +802,28 @@ describe('#mutations', () => {
});
});
it('should update when route and API ids use different primitive types', () => {
const state = {
allConversations: [{ id: '3', status: 'pending', updated_at: 100 }],
selectedChatId: '3',
};
mutations[types.UPDATE_CONVERSATION](state, {
id: 3,
status: 'open',
ai_takeover_active: false,
updated_at: 200,
});
expect(state.allConversations).toHaveLength(1);
expect(state.allConversations[0]).toMatchObject({
id: '3',
status: 'open',
ai_takeover_active: false,
});
expect(emitter.emit).toHaveBeenCalled();
});
it('should add conversation if not found on normal view', () => {
const state = {
allConversations: [],