// 🔍 全局搜索页面逻辑 // ⚠️ 注意:此文件依赖已删除的 message-search-manager,需要重构为使用 NIM SDK 的搜索功能 // TODO: 集成 NIM SDK 的消息搜索 API // const messageSearchManager = require('../../../utils/message-search-manager.js'); const app = getApp(); Page({ data: { // 系统信息 statusBarHeight: 44, // 搜索状态 searchKeyword: '', searchFocus: true, isSearching: false, isLoadingMore: false, // 会话搜索 conversationId: null, conversationName: '', isConversationSearch: false, // 搜索结果 searchResults: [], searchTotal: 0, currentPage: 1, hasMoreResults: false, searchStatusText: '', // 搜索历史和建议 searchHistory: [], // 防抖定时器 searchTimer: null }, onLoad(options) { // 获取系统信息 this.getSystemInfo(); // 初始化搜索管理器 this.initSearchManager(); // 加载搜索历史 this.loadSearchHistory(); // 处理会话内搜索 if (options.conversationId) { this.setData({ conversationId: options.conversationId, conversationName: decodeURIComponent(options.conversationName || '聊天'), isConversationSearch: true }); // 更新页面标题 wx.setNavigationBarTitle({ title: `在"${this.data.conversationName}"中搜索` }); } // 处理传入的搜索关键词 if (options.keyword) { this.setData({ searchKeyword: options.keyword, searchFocus: false }); this.performSearch(); } }, onShow() { // 刷新搜索历史 this.loadSearchHistory(); }, onUnload() { // 清理定时器 if (this.data.searchTimer) { clearTimeout(this.data.searchTimer); } }, // 获取系统信息 getSystemInfo() { try { const windowInfo = wx.getWindowInfo(); this.setData({ statusBarHeight: windowInfo.statusBarHeight || 44 }); } catch (error) { console.error('获取系统信息失败:', error); this.setData({ statusBarHeight: 44 }); } }, // 初始化搜索管理器 async initSearchManager() { try { // TODO: 集成 NIM SDK 的搜索初始化 // await messageSearchManager.init(); console.warn('⚠️ 搜索功能需要重构为使用 NIM SDK'); } catch (error) { console.error('❌ 搜索管理器初始化失败:', error); } }, // 加载搜索历史 loadSearchHistory() { // TODO: 集成 NIM SDK 的搜索历史 // const history = messageSearchManager.getSearchHistory(); this.setData({ searchHistory: [] // 暂时返回空数组 }); }, // 🔍 ===== 搜索输入处理 ===== // 搜索输入 onSearchInput(e) { const keyword = e.detail.value; this.setData({ searchKeyword: keyword }); // 防抖搜索 this.searchWithDebounce(keyword); }, // 搜索确认 onSearchConfirm(e) { const keyword = e.detail.value.trim(); if (keyword) { this.performSearch(); } }, // 防抖搜索 searchWithDebounce(keyword) { // 清除之前的定时器 if (this.data.searchTimer) { clearTimeout(this.data.searchTimer); } // 如果关键词为空,清除结果 if (!keyword.trim()) { this.setData({ searchResults: [], searchTotal: 0, hasMoreResults: false }); return; } // 设置新的定时器 const timer = setTimeout(() => { this.performSearch(); }, 500); this.setData({ searchTimer: timer }); }, // 清除搜索 clearSearch() { this.setData({ searchKeyword: '', searchResults: [], searchTotal: 0, hasMoreResults: false, searchFocus: true }); }, // 🔍 ===== 搜索执行 ===== // 执行搜索 async performSearch() { const keyword = this.data.searchKeyword.trim(); if (!keyword) { return; } // 关键词长度与字符校验(限制过长或异常字符,允许中英文、数字、常见符号) if (keyword.length > 120) { wx.showToast({ title: '关键词过长', icon: 'none' }); return; } const allowedPattern = /^[\u4e00-\u9fa5\w\s\-_.!@#¥$??::;,,。、“”"'’‘()()/\\]{1,120}$/; if (!allowedPattern.test(keyword)) { wx.showToast({ title: '含非法字符', icon: 'none' }); return; } try { this.setData({ isSearching: true, currentPage: 1, searchResults: [], searchStatusText: '正在搜索...' }); // 调用搜索管理器 const searchOptions = { page: 1 }; // 如果是会话内搜索,添加会话ID if (this.data.isConversationSearch && this.data.conversationId) { searchOptions.conversationId = this.data.conversationId; } // TODO: 集成 NIM SDK 的消息搜索 // const result = await messageSearchManager.searchMessages(keyword, searchOptions); // 暂时返回空结果 const result = { success: false, message: '搜索功能正在重构中' }; if (result.success) { // 处理搜索结果(按会话聚合) const processedResults = this.processConversationResults(result.data.conversations || []); // 更新搜索状态文本 const statusText = this.data.isConversationSearch ? `在"${this.data.conversationName}"中找到 ${result.data.total} 条结果` : `找到 ${result.data.total} 条相关结果`; this.setData({ searchResults: processedResults, searchTotal: result.data.total, hasMoreResults: result.data.hasMore, currentPage: 1, searchStatusText: statusText }); } else { console.error('❌ 搜索失败:', result.error, result.status); let toastMsg = result.error || '搜索失败'; if (result.status === 400) toastMsg = '参数错误'; else if (result.status === 404) toastMsg = '未找到相关结果'; else if (result.status === 500) toastMsg = '服务器开小差'; else if (!result.status && /网络|timeout|超时|Network/i.test(result.error || '')) toastMsg = '网络异常'; wx.showToast({ title: toastMsg, icon: 'none' }); this.setData({ searchStatusText: toastMsg }); } } catch (error) { console.error('❌ 搜索异常:', error); wx.showToast({ title: '搜索出错', icon: 'none' }); } finally { this.setData({ isSearching: false }); } }, // 加载更多结果 async loadMoreResults() { if (!this.data.hasMoreResults || this.data.isLoadingMore) { return; } try { this.setData({ isLoadingMore: true }); const nextPage = this.data.currentPage + 1; const searchOptions = { page: nextPage }; // 如果是会话内搜索,添加会话ID if (this.data.isConversationSearch && this.data.conversationId) { searchOptions.conversationId = this.data.conversationId; } // TODO: 集成 NIM SDK 的消息搜索 // const result = await messageSearchManager.searchMessages(this.data.searchKeyword, searchOptions); // 暂时返回空结果 const result = { success: false }; if (result.success) { const processedResults = this.processConversationResults(result.data.conversations || []); const allResults = [...this.data.searchResults, ...processedResults]; this.setData({ searchResults: allResults, hasMoreResults: result.data.hasMore, currentPage: nextPage }); } } catch (error) { console.error('❌ 加载更多失败:', error); wx.showToast({ title: '加载失败', icon: 'none' }); } finally { this.setData({ isLoadingMore: false }); } }, // 处理搜索结果(会话聚合) processConversationResults(conversations) { try { const metaMap = wx.getStorageSync('activeConversationMap') || {}; return (conversations || []).map(raw => { const conv = { ...raw }; const cid = String(conv.conversationId || conv.id || ''); // 兜底补齐名称/头像 const meta = cid && metaMap[cid] ? metaMap[cid] : null; if (!conv.conversationName && meta && meta.conversationName) { conv.conversationName = meta.conversationName; } if (!conv.conversationAvatar && meta && meta.conversationAvatar) { conv.conversationAvatar = meta.conversationAvatar; } // 与 message 页对齐:提供通用字段 name/avatar const name = conv.conversationName || (meta && meta.conversationName) || ''; const avatar = conv.conversationAvatar || (meta && meta.conversationAvatar) || ''; const ts = conv.topMatch && conv.topMatch.timestamp ? conv.topMatch.timestamp : null; const formattedTime = ts ? this.formatMessageTime(ts) : ''; const conversationInitial = this.getConversationInitial(name); return { ...conv, name, avatar, formattedTime, conversationInitial }; }); } catch (e) { // 兜底:不因异常影响渲染 return (conversations || []).map(conv => { const ts = conv.topMatch && conv.topMatch.timestamp ? conv.topMatch.timestamp : null; const formattedTime = ts ? this.formatMessageTime(ts) : ''; const name = conv.conversationName || ''; const avatar = conv.conversationAvatar || ''; const conversationInitial = this.getConversationInitial(name); return { ...conv, name, avatar, formattedTime, conversationInitial }; }); } }, // 格式化消息时间 formatMessageTime(timestamp) { const now = new Date(); const messageTime = new Date(timestamp); const diffMs = now.getTime() - messageTime.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); if (diffDays === 0) { // 今天 return messageTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' }); } else if (diffDays === 1) { // 昨天 return '昨天 ' + messageTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' }); } else if (diffDays < 7) { // 一周内 const weekdays = ['日', '一', '二', '三', '四', '五', '六']; return `周${weekdays[messageTime.getDay()]}`; } else { // 更早 return messageTime.toLocaleDateString('zh-CN', { month: '2-digit', day: '2-digit' }); } }, // 获取会话名称 getConversationName(message) { // 这里可以根据conversationId获取会话名称 // 暂时返回默认值 if (message.conversationId) { return message.conversationName || '群聊'; } return '私聊'; }, // 获取会话头像首字 getConversationInitial(name) { if (!name || typeof name !== 'string') return '聊'; const trimmed = name.trim(); if (!trimmed) return '聊'; // 取首个字符(兼容 emoji/代理空格时的情况) return trimmed.charAt(0); }, // (已移除)搜索类型切换相关逻辑 // 🔍 ===== 搜索历史管理 ===== // 选择历史搜索项 selectHistoryItem(e) { const keyword = e.currentTarget.dataset.keyword; this.setData({ searchKeyword: keyword, searchFocus: false }); this.performSearch(); }, // 删除历史搜索项 removeHistoryItem(e) { const keyword = e.currentTarget.dataset.keyword; // TODO: 集成 NIM SDK 的搜索历史管理 // messageSearchManager.removeSearchHistoryItem(keyword); this.loadSearchHistory(); }, // 清除搜索历史 clearSearchHistory() { wx.showModal({ title: '清除搜索历史', content: '确定要清除所有搜索历史吗?', success: (res) => { if (res.confirm) { // TODO: 集成 NIM SDK 的搜索历史管理 // messageSearchManager.clearSearchHistory(); this.loadSearchHistory(); } } }); }, // (已移除)热门搜索相关逻辑 // 🔍 ===== 搜索结果操作 ===== // 打开会话 openConversation(e) { const item = e.currentTarget.dataset.conversation; if (!item) return; const convId = item.conversationId; const name = encodeURIComponent(item.conversationName || '聊天'); const chatType = typeof item.chatType === 'number' ? item.chatType : 0; const targetId = item.targetId || ''; // 跳转到聊天页面(遵循消息页约定路径) wx.navigateTo({ url: `/pages/message/chat/chat?conversationId=${convId}&targetId=${targetId}&name=${name}&chatType=${chatType}` }); }, // 🔍 ===== 页面导航 ===== // 返回上一页 goBack() { wx.navigateBack(); } });