diff --git a/electron/services/groupAnalyticsService.ts b/electron/services/groupAnalyticsService.ts index 3dd1975..bd4e123 100644 --- a/electron/services/groupAnalyticsService.ts +++ b/electron/services/groupAnalyticsService.ts @@ -3,6 +3,7 @@ import * as path from 'path' import ExcelJS from 'exceljs' import { ConfigService } from './config' import { wcdbService } from './wcdbService' +import { chatService } from './chatService' export interface GroupChatInfo { username: string @@ -240,23 +241,38 @@ class GroupAnalyticsService { .map((row) => row.username || row.user_name || row.userName || '') .filter((username) => username.includes('@chatroom')) - const [displayNames, avatarUrls, memberCounts] = await Promise.all([ - wcdbService.getDisplayNames(groupIds), - wcdbService.getAvatarUrls(groupIds), - wcdbService.getGroupMemberCounts(groupIds) + const [memberCounts, contactInfo] = await Promise.all([ + wcdbService.getGroupMemberCounts(groupIds), + chatService.enrichSessionsContactInfo(groupIds) ]) + let fallbackNames: { success: boolean; map?: Record } | null = null + let fallbackAvatars: { success: boolean; map?: Record } | null = null + if (!contactInfo.success || !contactInfo.contacts) { + const [displayNames, avatarUrls] = await Promise.all([ + wcdbService.getDisplayNames(groupIds), + wcdbService.getAvatarUrls(groupIds) + ]) + fallbackNames = displayNames + fallbackAvatars = avatarUrls + } + const groups: GroupChatInfo[] = [] for (const groupId of groupIds) { + const contact = contactInfo.success && contactInfo.contacts ? contactInfo.contacts[groupId] : undefined + const displayName = contact?.displayName || + (fallbackNames && fallbackNames.success && fallbackNames.map ? (fallbackNames.map[groupId] || '') : '') || + groupId + const avatarUrl = contact?.avatarUrl || + (fallbackAvatars && fallbackAvatars.success && fallbackAvatars.map ? fallbackAvatars.map[groupId] : undefined) + groups.push({ username: groupId, - displayName: displayNames.success && displayNames.map - ? (displayNames.map[groupId] || groupId) - : groupId, + displayName, memberCount: memberCounts.success && memberCounts.map && typeof memberCounts.map[groupId] === 'number' ? memberCounts.map[groupId] : 0, - avatarUrl: avatarUrls.success && avatarUrls.map ? avatarUrls.map[groupId] : undefined + avatarUrl }) } diff --git a/src/pages/GroupAnalyticsPage.scss b/src/pages/GroupAnalyticsPage.scss index dcf6cec..14cd529 100644 --- a/src/pages/GroupAnalyticsPage.scss +++ b/src/pages/GroupAnalyticsPage.scss @@ -333,7 +333,7 @@ .group-avatar { width: 44px; height: 44px; - border-radius: 50%; + border-radius: 8px; overflow: hidden; flex-shrink: 0; @@ -346,11 +346,11 @@ .avatar-placeholder { width: 100%; height: 100%; - background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%); + background: var(--bg-tertiary); display: flex; align-items: center; justify-content: center; - color: #fff; + color: var(--text-secondary); } } @@ -390,7 +390,7 @@ .skeleton-avatar { width: 44px; height: 44px; - border-radius: 50%; + border-radius: 8px; background: var(--bg-tertiary); animation: pulse 1.5s infinite; } @@ -500,7 +500,7 @@ .group-avatar.large { width: 80px; height: 80px; - border-radius: 50%; + border-radius: 10px; overflow: hidden; margin: 0 auto 16px; @@ -513,11 +513,11 @@ .avatar-placeholder { width: 100%; height: 100%; - background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%); + background: var(--bg-tertiary); display: flex; align-items: center; justify-content: center; - color: #fff; + color: var(--text-secondary); } }