在MessageList组件中添加未知联系人补充功能,异步拉取缺失的头像和昵称信息,并更新会话和联系人数据库,以提升用户信息的准确性和完整性。

This commit is contained in:
乘风
2025-12-01 15:09:25 +08:00
parent 75aab08a72
commit 11a4ec8c67

View File

@@ -47,6 +47,7 @@ const MessageList: React.FC<MessageListProps> = () => {
} = useMessageStore();
const [filteredSessions, setFilteredSessions] = useState<ChatSession[]>([]);
const [syncing, setSyncing] = useState(false); // 同步状态
const hasEnrichedRef = useRef(false); // 是否已做过未知联系人补充
// 右键菜单相关状态
const [contextMenu, setContextMenu] = useState<{
@@ -296,7 +297,130 @@ const MessageList: React.FC<MessageListProps> = () => {
};
}, [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<MessageListProps> = () => {
console.log(
`会话同步完成: 成功${successCount}页, 失败${failCount}页, 共处理${totalProcessed}条数据`,
);
// 同步完成后,异步补充未知联系人信息
enrichUnknownContacts();
} catch (error) {
console.error("同步服务器数据失败:", error);
} finally {
@@ -805,59 +931,6 @@ const MessageList: React.FC<MessageListProps> = () => {
// 设置当前会话
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只更新未读数量