From bb2f4b268673f3a9fc89eab213058befa5d91b4c Mon Sep 17 00:00:00 2001 From: 2977094657 <2977094657@qq.com> Date: Sun, 22 Mar 2026 15:34:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(chat-ui):=20=E4=BF=AE=E5=A4=8D=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=9C=AA=E9=80=89=E4=B8=AD=E6=97=B6=E7=9A=84=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=8A=A0=E8=BD=BD=E4=B8=8E=E5=AE=9E=E6=97=B6=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在账号列表已加载但当前账号为空时强制刷新,避免聊天页进入无账号状态 - 为实时增量刷新补充异常兜底和日志,避免单次失败阻断后续更新 - 保留消息归一化中的原始 type/localId 字段,减少前端后续处理丢失信息 --- frontend/composables/chat/useChatMessages.js | 66 ++++++++++++-------- frontend/composables/chat/useChatSessions.js | 4 ++ frontend/lib/chat/message-normalizer.js | 3 +- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/frontend/composables/chat/useChatMessages.js b/frontend/composables/chat/useChatMessages.js index 3c369ff..0991e6c 100644 --- a/frontend/composables/chat/useChatMessages.js +++ b/frontend/composables/chat/useChatMessages.js @@ -35,16 +35,20 @@ export const useChatMessages = ({ } const logMessagePhase = (phase, details = {}) => { - if (!isDesktopRenderer()) return - try { - window.wechatDesktop?.logDebug?.('chat-messages', phase, details) - } catch {} - console.info(`[chat-messages] ${phase}`, { + const payload = { account: String(selectedAccount.value || '').trim(), selectedUsername: String(selectedContact.value?.username || '').trim(), activeMessagesFor: String(activeMessagesFor.value || '').trim(), ...details - }) + } + + if (isDesktopRenderer()) { + try { + window.wechatDesktop?.logDebug?.('chat-messages', phase, payload) + } catch {} + } + + console.info(`[chat-messages] ${phase}`, payload) } const summarizeRenderTypes = (list) => { @@ -556,28 +560,38 @@ export const useChatMessages = ({ params.render_types = messageTypeFilter.value } - const response = await api.listChatMessages(params) - if (selectedContact.value?.username !== username) return + try { + const response = await api.listChatMessages(params) + if (selectedContact.value?.username !== username) return - const latest = (response?.messages || []).map(normalizeMessage) - const seenIds = new Set(existing.map((message) => String(message?.id || ''))) - const newOnes = [] - for (const message of latest) { - const id = String(message?.id || '') - if (!id || seenIds.has(id)) continue - seenIds.add(id) - newOnes.push(message) + const rawMessages = response?.messages || [] + const latest = rawMessages.map(normalizeMessage) + + const seenIds = new Set(existing.map((message) => String(message?.id || ''))) + const newOnes = [] + for (const message of latest) { + const id = String(message?.id || '') + if (!id || seenIds.has(id)) continue + seenIds.add(id) + newOnes.push(message) + } + if (!newOnes.length) return + + allMessages.value = { ...allMessages.value, [username]: [...existing, ...newOnes] } + + await nextTick() + const nextContainer = messageContainerRef.value + if (nextContainer && atBottom) { + nextContainer.scrollTop = nextContainer.scrollHeight + } + updateJumpToBottomState() + } catch (error) { + console.error('[chat-messages] refreshRealtimeIncremental:error', { + account: String(selectedAccount.value || '').trim(), + username: String(username || '').trim(), + error + }) } - if (!newOnes.length) return - - allMessages.value = { ...allMessages.value, [username]: [...existing, ...newOnes] } - - await nextTick() - const nextContainer = messageContainerRef.value - if (nextContainer && atBottom) { - nextContainer.scrollTop = nextContainer.scrollHeight - } - updateJumpToBottomState() } let realtimeRefreshFuture = null diff --git a/frontend/composables/chat/useChatSessions.js b/frontend/composables/chat/useChatSessions.js index 9010b15..5df2802 100644 --- a/frontend/composables/chat/useChatSessions.js +++ b/frontend/composables/chat/useChatSessions.js @@ -250,7 +250,11 @@ export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled isLoadingContacts.value = true contactsError.value = '' try { + const hadLoadedAccountSnapshot = !!chatAccounts.loaded await chatAccounts.ensureLoaded() + if (!selectedAccount.value && hadLoadedAccountSnapshot) { + await chatAccounts.ensureLoaded({ force: true }) + } if (!selectedAccount.value) { clearContactsState(chatAccounts.error || '未检测到已解密账号,请先解密数据库。') diff --git a/frontend/lib/chat/message-normalizer.js b/frontend/lib/chat/message-normalizer.js index 5ac676c..08a162f 100644 --- a/frontend/lib/chat/message-normalizer.js +++ b/frontend/lib/chat/message-normalizer.js @@ -178,8 +178,10 @@ export const createMessageNormalizer = ({ apiBase, getSelectedAccount, getSelect return { id: msg.id, + localId: Number(msg.localId || 0), serverId: msg.serverId || 0, serverIdStr, + type: Number(msg.type || 0), sender, senderUsername: msg.senderUsername || '', senderDisplayName: msg.senderDisplayName || '', @@ -188,7 +190,6 @@ export const createMessageNormalizer = ({ apiBase, getSelectedAccount, getSelect fullTime: formatMessageFullTime(msg.createTime), createTime: Number(msg.createTime || 0), isSent, - type: 'text', renderType: msg.renderType || 'text', voipType: msg.voipType || '', title: msg.title || '',