diff --git a/electron/services/chatService.ts b/electron/services/chatService.ts index 2adc0aa..c8e2042 100644 --- a/electron/services/chatService.ts +++ b/electron/services/chatService.ts @@ -4954,24 +4954,10 @@ class ChatService { } } - const [contactResult, avatarResult] = await Promise.allSettled([ - wcdbService.getContact(normalizedSessionId), - avatarUrl ? Promise.resolve({ success: true, map: { [normalizedSessionId]: avatarUrl } }) : wcdbService.getAvatarUrls([normalizedSessionId]) - ]) - - if (contactResult.status === 'fulfilled' && contactResult.value.success && contactResult.value.contact) { - remark = contactResult.value.contact.remark || undefined - nickName = contactResult.value.contact.nickName || undefined - alias = contactResult.value.contact.alias || undefined - displayName = remark || nickName || alias || displayName - } - - if (avatarResult.status === 'fulfilled' && avatarResult.value.success && avatarResult.value.map) { - const avatarCandidate = avatarResult.value.map[normalizedSessionId] - if (this.isValidAvatarUrl(avatarCandidate)) { - avatarUrl = avatarCandidate - } - } + const contactPromise = wcdbService.getContact(normalizedSessionId) + const avatarPromise = avatarUrl + ? Promise.resolve({ success: true, map: { [normalizedSessionId]: avatarUrl } }) + : wcdbService.getAvatarUrls([normalizedSessionId]) let messageCount: number | undefined const cachedCount = this.sessionMessageCountCache.get(normalizedSessionId) @@ -4988,10 +4974,38 @@ class ChatService { } } + const messageCountPromise = Number.isFinite(messageCount) + ? Promise.resolve<{ success: boolean; count?: number }>({ + success: true, + count: Math.max(0, Math.floor(messageCount as number)) + }) + : wcdbService.getMessageCount(normalizedSessionId) + + const [contactResult, avatarResult, messageCountResult] = await Promise.allSettled([ + contactPromise, + avatarPromise, + messageCountPromise + ]) + + if (contactResult.status === 'fulfilled' && contactResult.value.success && contactResult.value.contact) { + remark = contactResult.value.contact.remark || undefined + nickName = contactResult.value.contact.nickName || undefined + alias = contactResult.value.contact.alias || undefined + displayName = remark || nickName || alias || displayName + } + + if (avatarResult.status === 'fulfilled' && avatarResult.value.success && avatarResult.value.map) { + const avatarCandidate = avatarResult.value.map[normalizedSessionId] + if (this.isValidAvatarUrl(avatarCandidate)) { + avatarUrl = avatarCandidate + } + } + if (!Number.isFinite(messageCount)) { - const countResult = await wcdbService.getMessageCount(normalizedSessionId) - messageCount = countResult.success && Number.isFinite(countResult.count) - ? Math.max(0, Math.floor(countResult.count || 0)) + messageCount = messageCountResult.status === 'fulfilled' && + messageCountResult.value.success && + Number.isFinite(messageCountResult.value.count) + ? Math.max(0, Math.floor(messageCountResult.value.count || 0)) : 0 this.sessionMessageCountCache.set(normalizedSessionId, { count: messageCount, diff --git a/src/pages/ExportPage.tsx b/src/pages/ExportPage.tsx index 4dabe1d..ebb7407 100644 --- a/src/pages/ExportPage.tsx +++ b/src/pages/ExportPage.tsx @@ -2875,9 +2875,11 @@ function ExportPage() { const requestSeq = ++detailRequestSeqRef.current const mappedSession = sessionRowByUsername.get(normalizedSessionId) const mappedContact = contactByUsername.get(normalizedSessionId) + const countedCount = normalizeMessageCount(sessionMessageCounts[normalizedSessionId]) const hintedCount = typeof mappedSession?.messageCountHint === 'number' && Number.isFinite(mappedSession.messageCountHint) && mappedSession.messageCountHint >= 0 ? Math.floor(mappedSession.messageCountHint) : undefined + const initialMessageCount = countedCount ?? hintedCount setCopiedDetailField(null) setIsRefreshingSessionDetailStats(false) @@ -2891,7 +2893,7 @@ function ExportPage() { nickName: sameSession ? prev?.nickName : mappedContact?.nickname, alias: sameSession ? prev?.alias : undefined, avatarUrl: mappedSession?.avatarUrl || mappedContact?.avatarUrl || (sameSession ? prev?.avatarUrl : undefined), - messageCount: hintedCount ?? (sameSession ? prev.messageCount : Number.NaN), + messageCount: initialMessageCount ?? (sameSession ? prev.messageCount : Number.NaN), voiceMessages: sameSession ? prev?.voiceMessages : undefined, imageMessages: sameSession ? prev?.imageMessages : undefined, videoMessages: sameSession ? prev?.videoMessages : undefined, @@ -3035,7 +3037,7 @@ function ExportPage() { setIsLoadingSessionDetailExtra(false) } } - }, [applySessionDetailStats, contactByUsername, sessionRowByUsername]) + }, [applySessionDetailStats, contactByUsername, sessionMessageCounts, sessionRowByUsername]) const loadSessionRelationStats = useCallback(async () => { const normalizedSessionId = String(sessionDetail?.wxid || '').trim()