perf(export): reuse list message count in detail

This commit is contained in:
tisonhuang
2026-03-04 15:43:44 +08:00
parent fb1125136c
commit 84ef51f16b
2 changed files with 39 additions and 23 deletions

View File

@@ -4954,24 +4954,10 @@ class ChatService {
} }
} }
const [contactResult, avatarResult] = await Promise.allSettled([ const contactPromise = wcdbService.getContact(normalizedSessionId)
wcdbService.getContact(normalizedSessionId), const avatarPromise = avatarUrl
avatarUrl ? Promise.resolve({ success: true, map: { [normalizedSessionId]: avatarUrl } }) : wcdbService.getAvatarUrls([normalizedSessionId]) ? 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
}
}
let messageCount: number | undefined let messageCount: number | undefined
const cachedCount = this.sessionMessageCountCache.get(normalizedSessionId) 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)) { if (!Number.isFinite(messageCount)) {
const countResult = await wcdbService.getMessageCount(normalizedSessionId) messageCount = messageCountResult.status === 'fulfilled' &&
messageCount = countResult.success && Number.isFinite(countResult.count) messageCountResult.value.success &&
? Math.max(0, Math.floor(countResult.count || 0)) Number.isFinite(messageCountResult.value.count)
? Math.max(0, Math.floor(messageCountResult.value.count || 0))
: 0 : 0
this.sessionMessageCountCache.set(normalizedSessionId, { this.sessionMessageCountCache.set(normalizedSessionId, {
count: messageCount, count: messageCount,

View File

@@ -2875,9 +2875,11 @@ function ExportPage() {
const requestSeq = ++detailRequestSeqRef.current const requestSeq = ++detailRequestSeqRef.current
const mappedSession = sessionRowByUsername.get(normalizedSessionId) const mappedSession = sessionRowByUsername.get(normalizedSessionId)
const mappedContact = contactByUsername.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 const hintedCount = typeof mappedSession?.messageCountHint === 'number' && Number.isFinite(mappedSession.messageCountHint) && mappedSession.messageCountHint >= 0
? Math.floor(mappedSession.messageCountHint) ? Math.floor(mappedSession.messageCountHint)
: undefined : undefined
const initialMessageCount = countedCount ?? hintedCount
setCopiedDetailField(null) setCopiedDetailField(null)
setIsRefreshingSessionDetailStats(false) setIsRefreshingSessionDetailStats(false)
@@ -2891,7 +2893,7 @@ function ExportPage() {
nickName: sameSession ? prev?.nickName : mappedContact?.nickname, nickName: sameSession ? prev?.nickName : mappedContact?.nickname,
alias: sameSession ? prev?.alias : undefined, alias: sameSession ? prev?.alias : undefined,
avatarUrl: mappedSession?.avatarUrl || mappedContact?.avatarUrl || (sameSession ? prev?.avatarUrl : 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, voiceMessages: sameSession ? prev?.voiceMessages : undefined,
imageMessages: sameSession ? prev?.imageMessages : undefined, imageMessages: sameSession ? prev?.imageMessages : undefined,
videoMessages: sameSession ? prev?.videoMessages : undefined, videoMessages: sameSession ? prev?.videoMessages : undefined,
@@ -3035,7 +3037,7 @@ function ExportPage() {
setIsLoadingSessionDetailExtra(false) setIsLoadingSessionDetailExtra(false)
} }
} }
}, [applySessionDetailStats, contactByUsername, sessionRowByUsername]) }, [applySessionDetailStats, contactByUsername, sessionMessageCounts, sessionRowByUsername])
const loadSessionRelationStats = useCallback(async () => { const loadSessionRelationStats = useCallback(async () => {
const normalizedSessionId = String(sessionDetail?.wxid || '').trim() const normalizedSessionId = String(sessionDetail?.wxid || '').trim()