在MessageList组件中添加未知联系人补充功能,异步拉取缺失的头像和昵称信息,并更新会话和联系人数据库,以提升用户信息的准确性和完整性。
This commit is contained in:
@@ -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(只更新未读数量)
|
||||
|
||||
Reference in New Issue
Block a user