From ca783aa8bf578a41d1905fa037e9cb2dc967796e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=98=E9=A3=8E?= Date: Thu, 15 Jan 2026 12:31:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BASearchAnyone=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=BB=A5=E6=9B=B4=E6=9C=89=E6=95=88=E5=9C=B0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E8=81=8A=E5=A4=A9=E4=BC=9A=E8=AF=9D=EF=BC=9A=E4=B8=BA?= =?UTF-8?q?=E6=96=B0=E8=81=94=E7=B3=BB=E4=BA=BA=E6=B7=BB=E5=8A=A0=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=88=9B=E5=BB=BA=E9=80=BB=E8=BE=91=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E6=90=9C=E7=B4=A2=E7=BB=93=E6=9E=9C=E7=9A=84?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SidebarMenu/SearchAnyone/index.tsx | 86 +++++++++++++++++-- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/src/pages/pc/ckbox/weChat/components/SidebarMenu/SearchAnyone/index.tsx b/src/pages/pc/ckbox/weChat/components/SidebarMenu/SearchAnyone/index.tsx index 49131b3..ca92034 100644 --- a/src/pages/pc/ckbox/weChat/components/SidebarMenu/SearchAnyone/index.tsx +++ b/src/pages/pc/ckbox/weChat/components/SidebarMenu/SearchAnyone/index.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef, useCallback } from "react"; import { Input, Avatar, Spin } from "antd"; import { SearchOutlined } from "@ant-design/icons"; -import { Contact } from "@/utils/db"; +import { Contact, ChatSession } from "@/utils/db"; import { getFriendList } from "@/components/FriendSelection/api"; import { getGroupList } from "@/components/GroupSelection/api"; import { useContactStore } from "@/store/module/weChat/contacts"; @@ -25,7 +25,9 @@ const SearchAnyone: React.FC = ({ onContactClick }) => { const { user } = useUserStore(); const currentUserId = user?.id || 0; - const searchTimeoutRef = useRef>(); + const searchTimeoutRef = useRef | undefined>( + undefined, + ); const containerRef = useRef(null); // 搜索防抖处理 @@ -146,12 +148,80 @@ const SearchAnyone: React.FC = ({ onContactClick }) => { // 处理点击搜索结果 const handleResultClick = useCallback( async (contact: Contact) => { - // 设置当前联系人(这会触发 SidebarMenu 中的 useEffect,自动切换到聊天tab并选中会话) - setCurrentContact(contact); + try { + // 1. 先检查会话是否已存在 + let session = await MessageManager.getSessionByContactId( + currentUserId, + contact.id, + contact.type, + ); - // 如果有自定义点击处理,调用它 - if (onContactClick) { - onContactClick(contact); + if (!session) { + // 2. 如果会话不存在,创建新会话(不置顶,但排在非置顶区域第一个) + // 使用当前时间,确保在非置顶会话中排在最前面 + const now = new Date(); + const newSession: ChatSession = { + serverId: `${contact.type}_${contact.id}`, + userId: currentUserId, + id: contact.id, + type: contact.type, + wechatAccountId: + contact.wechatAccountId || currentCustomer?.id || 0, + nickname: contact.nickname || "", + conRemark: contact.conRemark || "", + avatar: contact.avatar || "", + content: "", + lastUpdateTime: now.toISOString(), // 使用当前时间,确保在非置顶区域排第一 + aiType: contact.aiType || 0, + phone: contact.phone || "", + region: contact.region || "", + config: { + unreadCount: 0, + top: 0, // 不置顶,排在非置顶区域 + }, + sortKey: "", + ...(contact.type === "group" + ? { + chatroomId: (contact as any).chatroomId || "", + chatroomOwner: (contact as any).chatroomOwner || "", + selfDisplayName: (contact as any).selfDisplayName || "", + notice: (contact as any).notice || "", + } + : { + wechatFriendId: contact.id, + wechatId: (contact as any).wechatId || "", + alias: (contact as any).alias || "", + }), + extendFields: "{}", + }; + + // 创建会话(会自动生成 sortKey,由于使用当前时间,会在非置顶会话中排在最前面) + await MessageManager.createSession(currentUserId, newSession); + + // 重新获取会话(包含生成的 sortKey) + session = await MessageManager.getSessionByContactId( + currentUserId, + contact.id, + contact.type, + ); + } + + // 5. 设置当前联系人(这会触发 SidebarMenu 中的 useEffect,自动切换到聊天tab并选中会话) + if (session) { + setCurrentContact(session as any); + } else { + // 如果还是没有会话,使用联系人 + setCurrentContact(contact); + } + + // 如果有自定义点击处理,调用它 + if (onContactClick) { + onContactClick(contact); + } + } catch (error) { + console.error("处理搜索结果点击失败:", error); + // 即使出错,也尝试设置联系人 + setCurrentContact(contact); } // 清空搜索并隐藏结果 @@ -159,7 +229,7 @@ const SearchAnyone: React.FC = ({ onContactClick }) => { setSearchResults([]); setShowResults(false); }, - [setCurrentContact, onContactClick], + [currentUserId, currentCustomer, setCurrentContact, onContactClick], ); // 点击外部区域关闭搜索结果