miniprogramme/pages/search/global-search.js
2025-09-12 16:08:17 +08:00

457 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 🔍 全局搜索页面逻辑
const messageSearchManager = require('../../utils/message-search-manager.js');
const app = getApp();
Page({
data: {
// 系统信息
statusBarHeight: 44,
// 搜索状态
searchKeyword: '',
searchFocus: true,
searchType: 'all',
isSearching: false,
isLoadingMore: false,
// 会话搜索
conversationId: null,
conversationName: '',
isConversationSearch: false,
// 搜索结果
searchResults: [],
searchTotal: 0,
currentPage: 1,
hasMoreResults: false,
searchStatusText: '',
// 搜索历史和建议
searchHistory: [],
hotSearches: ['图片', '文件', '链接', '表情包'],
// 防抖定时器
searchTimer: null
},
onLoad(options) {
console.log('🔍 全局搜索页面加载', 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() {
console.log('🔍 全局搜索页面显示');
// 刷新搜索历史
this.loadSearchHistory();
},
onUnload() {
console.log('🔍 全局搜索页面卸载');
// 清理定时器
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 {
await messageSearchManager.init();
console.log('✅ 搜索管理器初始化完成');
} catch (error) {
console.error('❌ 搜索管理器初始化失败:', error);
}
},
// 加载搜索历史
loadSearchHistory() {
const history = messageSearchManager.getSearchHistory();
this.setData({
searchHistory: history.slice(0, 10) // 只显示前10条
});
},
// 🔍 ===== 搜索输入处理 =====
// 搜索输入
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;
}
console.log('🔍 执行搜索:', keyword);
try {
this.setData({
isSearching: true,
currentPage: 1,
searchResults: [],
searchStatusText: '正在搜索...'
});
// 调用搜索管理器
const searchOptions = {
type: this.data.searchType,
page: 1
};
// 如果是会话内搜索添加会话ID
if (this.data.isConversationSearch && this.data.conversationId) {
searchOptions.conversationId = this.data.conversationId;
}
const result = await messageSearchManager.searchMessages(keyword, searchOptions);
if (result.success) {
// 处理搜索结果
const processedResults = this.processSearchResults(result.data.messages);
// 更新搜索状态文本
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
});
console.log(`🔍 搜索完成,找到 ${result.data.total} 条结果`);
} else {
console.error('❌ 搜索失败:', result.error);
wx.showToast({
title: result.error || '搜索失败',
icon: 'none'
});
}
} 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;
}
console.log('🔍 加载更多搜索结果');
try {
this.setData({
isLoadingMore: true
});
const nextPage = this.data.currentPage + 1;
const searchOptions = {
type: this.data.searchType,
page: nextPage
};
// 如果是会话内搜索添加会话ID
if (this.data.isConversationSearch && this.data.conversationId) {
searchOptions.conversationId = this.data.conversationId;
}
const result = await messageSearchManager.searchMessages(this.data.searchKeyword, searchOptions);
if (result.success) {
const processedResults = this.processSearchResults(result.data.messages);
const allResults = [...this.data.searchResults, ...processedResults];
this.setData({
searchResults: allResults,
hasMoreResults: result.data.hasMore,
currentPage: nextPage
});
console.log(`🔍 加载更多完成,当前共 ${allResults.length} 条结果`);
}
} catch (error) {
console.error('❌ 加载更多失败:', error);
wx.showToast({
title: '加载失败',
icon: 'none'
});
} finally {
this.setData({
isLoadingMore: false
});
}
},
// 处理搜索结果
processSearchResults(messages) {
return messages.map(message => {
// 格式化时间
const formattedTime = this.formatMessageTime(message.timestamp);
// 获取会话名称
const conversationName = this.getConversationName(message);
return {
...message,
formattedTime: formattedTime,
conversationName: conversationName
};
});
},
// 格式化消息时间
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 '私聊';
},
// 🔍 ===== 搜索类型切换 =====
// 切换搜索类型
changeSearchType(e) {
const type = e.currentTarget.dataset.type;
if (type === this.data.searchType) {
return;
}
console.log('🔍 切换搜索类型:', type);
this.setData({
searchType: type
});
// 如果有搜索关键词,重新搜索
if (this.data.searchKeyword.trim()) {
this.performSearch();
}
},
// 🔍 ===== 搜索历史管理 =====
// 选择历史搜索项
selectHistoryItem(e) {
const keyword = e.currentTarget.dataset.keyword;
this.setData({
searchKeyword: keyword,
searchFocus: false
});
this.performSearch();
},
// 删除历史搜索项
removeHistoryItem(e) {
const keyword = e.currentTarget.dataset.keyword;
messageSearchManager.removeSearchHistoryItem(keyword);
this.loadSearchHistory();
},
// 清除搜索历史
clearSearchHistory() {
wx.showModal({
title: '清除搜索历史',
content: '确定要清除所有搜索历史吗?',
success: (res) => {
if (res.confirm) {
messageSearchManager.clearSearchHistory();
this.loadSearchHistory();
}
}
});
},
// 选择热门搜索
selectHotSearch(e) {
const keyword = e.currentTarget.dataset.keyword;
this.setData({
searchKeyword: keyword,
searchFocus: false
});
this.performSearch();
},
// 🔍 ===== 搜索结果操作 =====
// 打开消息
openMessage(e) {
const message = e.currentTarget.dataset.message;
console.log('🔍 打开消息:', message.id);
// 跳转到聊天页面并定位到该消息
this.jumpToMessage(e);
},
// 跳转到消息
jumpToMessage(e) {
const message = e.currentTarget.dataset.message;
// 跳转到聊天页面
wx.navigateTo({
url: `/pages/chat/chat?conversationId=${message.conversationId}&messageId=${message.id}`
});
},
// 🔍 ===== 页面导航 =====
// 返回上一页
goBack() {
wx.navigateBack();
}
});