diff --git a/echotrace b/echotrace deleted file mode 160000 index 98280f0..0000000 --- a/echotrace +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 98280f0d0d7b764b2f2027fc4d103024e8ed30fd diff --git a/electron/services/chatService.ts b/electron/services/chatService.ts index 17cabfe..1e7457a 100644 --- a/electron/services/chatService.ts +++ b/electron/services/chatService.ts @@ -1687,11 +1687,24 @@ class ChatService { } const cleanedWxid = this.cleanAccountDirName(myWxid) - const result = await wcdbService.getAvatarUrls([myWxid, cleanedWxid]) + // 增加 'self' 作为兜底标识符,微信有时将个人信息存储在 'self' 记录中 + const fetchList = Array.from(new Set([myWxid, cleanedWxid, 'self'])) + + console.log(`[ChatService] 尝试获取个人头像, wxids: ${JSON.stringify(fetchList)}`) + const result = await wcdbService.getAvatarUrls(fetchList) + if (result.success && result.map) { - const avatarUrl = result.map[myWxid] || result.map[cleanedWxid] - return { success: true, avatarUrl } + // 按优先级尝试匹配 + const avatarUrl = result.map[myWxid] || result.map[cleanedWxid] || result.map['self'] + if (avatarUrl) { + console.log(`[ChatService] 成功获取个人头像: ${avatarUrl.substring(0, 50)}...`) + return { success: true, avatarUrl } + } + console.warn(`[ChatService] 未能在 contact.db 中找到个人头像, 请求列表: ${JSON.stringify(fetchList)}`) + return { success: true, avatarUrl: undefined } } + + console.error(`[ChatService] 查询个人头像失败: ${result.error || '未知错误'}`) return { success: true, avatarUrl: undefined } } catch (e) { console.error('ChatService: 获取当前用户头像失败:', e) diff --git a/package.json b/package.json index 5b102ed..3a6fce7 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "postinstall": "echo 'No native modules to rebuild'", "rebuild": "echo 'No native modules to rebuild'", "dev": "vite", - "build": "vue-tsc && vite build && electron-builder", + "build": "tsc && vite build && electron-builder", "preview": "vite preview", "electron:dev": "vite --mode electron", "electron:build": "npm run build" diff --git a/src/pages/ChatPage.tsx b/src/pages/ChatPage.tsx index 03f8c0a..6376593 100644 --- a/src/pages/ChatPage.tsx +++ b/src/pages/ChatPage.tsx @@ -127,6 +127,7 @@ function ChatPage(_props: ChatPageProps) { const sessionListRef = useRef(null) const [currentOffset, setCurrentOffset] = useState(0) const [myAvatarUrl, setMyAvatarUrl] = useState(undefined) + const [myWxid, setMyWxid] = useState(undefined) const [showScrollToBottom, setShowScrollToBottom] = useState(false) const [sidebarWidth, setSidebarWidth] = useState(260) const [isResizing, setIsResizing] = useState(false) @@ -203,6 +204,9 @@ function ChatPage(_props: ChatPageProps) { setConnected(true) await loadSessions() await loadMyAvatar() + // 获取 myWxid 用于匹配个人头像 + const wxid = await window.electronAPI.config.get('myWxid') + if (wxid) setMyWxid(wxid as string) } else { setConnectionError(result.error || '连接失败') } @@ -434,6 +438,12 @@ function ChatPage(_props: ChatPageProps) { for (const [username, contact] of Object.entries(result.contacts)) { contactUpdateQueueRef.current.set(username, contact) + // 如果是自己的信息且当前个人头像为空,同步更新 + if (myWxid && username === myWxid && contact.avatarUrl && !myAvatarUrl) { + console.log('[ChatPage] 从联系人同步获取到个人头像') + setMyAvatarUrl(contact.avatarUrl) + } + // 【核心优化】同步更新全局发送者头像缓存,供 MessageBubble 使用 senderAvatarCache.set(username, { avatarUrl: contact.avatarUrl, @@ -1378,9 +1388,9 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat }: }) } - // 群聊中获取发送者信息 + // 群聊中获取发送者信息 (如果自己发的没头像,也尝试拉取) useEffect(() => { - if (isGroupChat && !isSent && message.senderUsername) { + if (message.senderUsername && (isGroupChat || (isSent && !myAvatarUrl))) { const sender = message.senderUsername const cached = senderAvatarCache.get(sender) if (cached) { @@ -1410,7 +1420,7 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat }: senderAvatarLoading.delete(sender) }) } - }, [isGroupChat, isSent, message.senderUsername]) + }, [isGroupChat, isSent, message.senderUsername, myAvatarUrl]) // 自动下载表情包 useEffect(() => { @@ -1577,11 +1587,11 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat }: const bubbleClass = isSent ? 'sent' : 'received' // 头像逻辑: - // - 自己发的:使用 myAvatarUrl + // - 自己发的:优先使用 myAvatarUrl,缺失则用 senderAvatarUrl (补救) // - 群聊中对方发的:使用发送者头像 // - 私聊中对方发的:使用会话头像 const avatarUrl = isSent - ? myAvatarUrl + ? (myAvatarUrl || senderAvatarUrl) : (isGroupChat ? senderAvatarUrl : session.avatarUrl) const avatarLetter = isSent ? '我' diff --git a/wx_key b/wx_key deleted file mode 160000 index 40be59d..0000000 --- a/wx_key +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 40be59dc472ac283b3de0e3a0ad87e029610082a