diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/SidebarMenu/MessageList/index.tsx b/Touchkebao/src/pages/pc/ckbox/weChat/components/SidebarMenu/MessageList/index.tsx index 1e08ff0a..efbcbad8 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/SidebarMenu/MessageList/index.tsx +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/SidebarMenu/MessageList/index.tsx @@ -47,6 +47,7 @@ const MessageList: React.FC = () => { } = useMessageStore(); const [filteredSessions, setFilteredSessions] = useState([]); const [syncing, setSyncing] = useState(false); // 同步状态 + const hasEnrichedRef = useRef(false); // 是否已做过未知联系人补充 // 右键菜单相关状态 const [contextMenu, setContextMenu] = useState<{ @@ -296,7 +297,130 @@ const MessageList: React.FC = () => { }; }, [contextMenu.visible]); - // ==================== 数据加载 ==================== + // ==================== 数据加载 & 未知联系人补充 ==================== + + // 同步完成后,检查是否存在“未知联系人”或缺失头像/昵称的会话,并异步补充详情 + const enrichUnknownContacts = async () => { + if (!currentUserId) return; + if (hasEnrichedRef.current) return; // 避免重复执行 + + // 只在会话有数据时执行 + if (!sessions || sessions.length === 0) return; + + const needEnrich = sessions.filter(s => { + const noName = !s.conRemark && !s.nickname && !s.wechatId; + const isUnknownNickname = s.nickname === "未知联系人"; + const noAvatar = !s.avatar; + return noName || isUnknownNickname || noAvatar; + }); + + if (needEnrich.length === 0) { + hasEnrichedRef.current = true; + return; + } + + hasEnrichedRef.current = true; + + // 逐个异步拉取详情,失败不打断整体流程 + for (const session of needEnrich) { + try { + let detailResult: any = null; + if (session.type === "friend") { + detailResult = await getWechatFriendDetail({ id: session.id }); + } else { + detailResult = await getWechatChatroomDetail({ id: session.id }); + } + + const detail = detailResult?.detail; + if (!detail) continue; + + // 更新会话列表 UI + setSessionState(prev => + prev.map(s => + s.id === session.id && s.type === session.type + ? { + ...s, + avatar: + session.type === "group" + ? detail.chatroomAvatar || s.avatar + : detail.avatar || s.avatar, + nickname: detail.nickname || s.nickname, + conRemark: detail.conRemark || s.conRemark, + wechatId: detail.wechatId || s.wechatId, + } + : s, + ), + ); + + // 同步到会话数据库 + await MessageManager.updateSession({ + userId: currentUserId, + id: session.id, + type: session.type, + avatar: + session.type === "group" + ? detail.chatroomAvatar || session.avatar + : detail.avatar || session.avatar, + nickname: detail.nickname || session.nickname, + conRemark: detail.conRemark || session.conRemark, + wechatId: detail.wechatId || session.wechatId, + }); + + // 同步到联系人数据库(方便后续搜索、其它页面使用) + const contactBase: any = { + serverId: `${session.type}_${session.id}`, + userId: currentUserId, + id: session.id, + type: session.type, + wechatAccountId: detail.wechatAccountId, + nickname: detail.nickname || "", + conRemark: detail.conRemark || "", + avatar: + session.type === "group" + ? detail.chatroomAvatar || "" + : detail.avatar || "", + lastUpdateTime: new Date().toISOString(), + sortKey: "", + searchKey: (detail.conRemark || detail.nickname || "").toLowerCase(), + }; + + if (session.type === "group") { + Object.assign(contactBase, { + chatroomId: detail.chatroomId, + chatroomOwner: detail.chatroomOwner, + selfDisplayName: detail.selfDisplyName, + notice: detail.notice, + }); + } else { + Object.assign(contactBase, { + wechatFriendId: detail.id, + wechatId: detail.wechatId, + alias: detail.alias, + gender: detail.gender, + region: detail.region, + signature: detail.signature, + phone: detail.phone, + quanPin: detail.quanPin, + groupId: detail.groupId, + }); + } + + // 使用 upsert 逻辑:如果已存在就更新,不存在则新增 + const existContact = await ContactManager.getContactByIdAndType( + currentUserId, + session.id, + session.type, + ); + if (existContact) { + await ContactManager.updateContact(contactBase); + } else { + await ContactManager.addContact(contactBase); + } + } catch (error) { + console.error("补拉未知联系人详情失败:", error, session); + } + } + }; // 与服务器同步数据(优化版:逐页同步,立即更新UI) const syncWithServer = async () => { @@ -379,6 +503,8 @@ const MessageList: React.FC = () => { console.log( `会话同步完成: 成功${successCount}页, 失败${failCount}页, 共处理${totalProcessed}条数据`, ); + // 同步完成后,异步补充未知联系人信息 + enrichUnknownContacts(); } catch (error) { console.error("同步服务器数据失败:", error); } finally { @@ -805,59 +931,6 @@ const MessageList: React.FC = () => { // 设置当前会话 setCurrentContact(session as any); - // 如果头像或昵称缺失,则尝试拉取详情并更新列表 - const needFetchDetail = - !session.avatar || - !(session.conRemark || session.nickname || session.wechatId); - - if (needFetchDetail) { - try { - let detailResult: any = null; - if (session.type === "friend") { - detailResult = await getWechatFriendDetail({ id: session.id }); - } else { - detailResult = await getWechatChatroomDetail({ id: session.id }); - } - - const detail = detailResult?.detail; - if (detail) { - // 1. 更新会话列表中的该条记录(驱动 UI 立即更新头像和昵称) - setSessionState(prev => - prev.map(s => - s.id === session.id && s.type === session.type - ? { - ...s, - avatar: - session.type === "group" - ? detail.chatroomAvatar || s.avatar - : detail.avatar || s.avatar, - nickname: detail.nickname || s.nickname, - conRemark: detail.conRemark || s.conRemark, - wechatId: detail.wechatId || s.wechatId, - } - : s, - ), - ); - - // 2. 同步到会话数据库,保证刷新后数据仍然是最新的 - await MessageManager.updateSession({ - userId: currentUserId, - id: session.id, - type: session.type, - avatar: - session.type === "group" - ? detail.chatroomAvatar || session.avatar - : detail.avatar || session.avatar, - nickname: detail.nickname || session.nickname, - conRemark: detail.conRemark || session.conRemark, - wechatId: detail.wechatId || session.wechatId, - }); - } - } catch (e) { - console.error("点击会话补拉详情失败:", e); - } - } - // 标记为已读(不更新时间和排序) if (session.config.unreadCount > 0) { // 立即更新UI(只更新未读数量)