findme-miniprogram-frontend/subpackages/social/friend-requests/friend-requests.js
2025-12-27 17:16:03 +08:00

357 lines
9.6 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 app = getApp();
const friendAPI = require('../../../utils/friend-api.js');
const notificationManager = require('../../../utils/notification-manager.js');
const wsManager = require('../../../utils/websocket-manager-v2.js');
Page({
data: {
// 请求列表
friendRequests: [],
pendingRequests: [],
processedRequests: [],
loading: true,
refreshing: false,
// 统计
pendingCount: 0,
processedCount: 0,
// 系统信息
statusBarHeight: 0,
navBarHeight: 0,
// 标签页
activeTab: 'pending', // pending, processed
tabs: [
{ key: 'pending', label: '好友申请', count: 0 },
{ key: 'processed', label: '我的申请', count: 0 }
]
},
onLoad(options) {
this.initSystemInfo();
this.loadFriendRequests();
// 🔥 初始化WebSocket监听
this.initWebSocketListener();
},
onShow() {
// 刷新数据
this.loadFriendRequests();
// 选中好友tab
try {
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setData({ selected: 1 });
}
} catch (_) {}
},
// 初始化系统信息
initSystemInfo() {
const systemInfo = wx.getSystemInfoSync();
const menuButton = wx.getMenuButtonBoundingClientRect();
this.setData({
statusBarHeight: systemInfo.statusBarHeight,
navBarHeight: menuButton.bottom + 10
});
},
// 返回上一页
goBack() {
wx.navigateBack();
},
// 加载好友请求
async loadFriendRequests() {
try {
this.setData({ loading: true });
const response = await friendAPI.getFriendRequests();
// 从API响应中提取数据数组
const requests = response.data || [];
// 分类请求
let pendingRequests = requests.filter(req => req.status === 0);
// pendingRequests = Array(20).fill(pendingRequests).flat();
// console.log('pendingRequests-------',pendingRequests);
const processedRequests = requests.filter(req => req.status !== 0);
// 更新标签页计数
const updatedTabs = this.data.tabs.map(tab => ({
...tab,
count: tab.key === 'pending' ? pendingRequests.length : processedRequests.length
}));
this.setData({
friendRequests: requests,
pendingRequests: pendingRequests,
processedRequests: processedRequests,
pendingCount: pendingRequests.length,
processedCount: processedRequests.length,
tabs: updatedTabs,
loading: false,
refreshing: false
});
// 同步自定义TabBar好友角标
try {
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setFriendsBadge(pendingRequests.length || 0);
}
} catch (_) {}
// 同步通知管理器未读计数
try { notificationManager.setFriendsUnreadCount(pendingRequests.length || 0); } catch (_) {}
} catch (error) {
console.error('加载好友请求失败:', error);
this.setData({
loading: false,
refreshing: false
});
wx.showToast({
title: '加载失败',
icon: 'none'
});
}
},
// 下拉刷新
onRefresh() {
this.setData({ refreshing: true });
this.loadFriendRequests();
// 刷新后也通知好友页面更新数量
setTimeout(() => {
this.notifyFriendsPageRefresh();
}, 500); // 延迟一点确保数据加载完成
},
// 切换标签页
switchTab(e) {
const tab = e.currentTarget.dataset.tab;
this.setData({
activeTab: tab
}); },
// 获取当前标签页的请求列表
getCurrentRequests() {
const { friendRequests, activeTab } = this.data;
if (activeTab === 'pending') {
return friendRequests.filter(req => req.status === 0);
} else {
return friendRequests.filter(req => req.status !== 0);
}
},
// 处理好友请求
async handleRequest(e) {
const { requestId, accept } = e.currentTarget.dataset;
const actionText = accept === 'true' ? '接受' : '拒绝';
try {
wx.showLoading({ title: `${actionText}中...` });
await friendAPI.handleFriendRequest(requestId, accept === 'true');
wx.hideLoading();
wx.showToast({
title: `${actionText}`,
icon: 'success'
});
// 刷新列表
this.loadFriendRequests();
// 通知好友页面刷新请求数量
this.notifyFriendsPageRefresh();
// 同步自定义TabBar的好友红点处理后尝试刷新数量
try {
const resp = await friendAPI.getFriendRequestCount();
const count = (resp && (resp.code === 0 || resp.code === 200)) ? (resp.data?.count || 0) : 0;
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setFriendsBadge(count);
}
try { notificationManager.setFriendsUnreadCount(count); } catch (_) {}
} catch (_) {}
} catch (error) {
wx.hideLoading();
console.error('处理好友请求失败:', error);
wx.showToast({
title: error.message || `${actionText}失败`,
icon: 'none'
});
}
},
// 通知好友页面刷新
notifyFriendsPageRefresh() {
try {
// 通过全局事件通知好友页面刷新
const app = getApp();
if (app.globalData) {
app.globalData.needRefreshFriendRequests = true;
}
// 也可以通过页面栈找到好友页面并直接调用刷新方法
const pages = getCurrentPages();
const friendsPage = pages.find(page => page.route === 'pages/social/friends/friends');
if (friendsPage) {
// 刷新好友请求数量
if (friendsPage.loadFriendRequestsCount) {
friendsPage.loadFriendRequestsCount();
}
// 刷新好友列表(因为可能新增了好友)
if (friendsPage.loadFriends) {
friendsPage.loadFriends();
}
}
} catch (error) {
console.error('❌ 通知好友页面失败:', error);
}
},
// 🔥 初始化WebSocket监听器
initWebSocketListener() {
try {
if (this._wsInited) return;
this._wsInited = true;
console.log('🔌 [好友请求页] 初始化WebSocket监听器');
// 绑定处理函数到 this
this.handleNotificationMessage = this.handleNotificationMessage.bind(this);
// 监听通知消息
wsManager.on('notification', this.handleNotificationMessage);
} catch (error) {
console.error('❌ [好友请求页] 初始化WebSocket监听器失败:', error);
}
},
// 处理通知消息
handleNotificationMessage(msg) {
try {
console.log('🔔 [好友请求页] 收到通知消息:', msg);
const data = msg?.data || msg;
// 判断是否为好友通知
if (data?.type === 'friend_notification') {
this.handleFriendNotification(data);
} else if (data?.type === 'friend_request_notification') {
this.handleFriendRequestNotification(data);
}
} catch (error) {
console.error('❌ [好友请求页] 处理通知消息失败:', error);
}
},
// 处理好友通知
handleFriendNotification(data) {
try {
console.log('🆕 [好友请求页] 处理好友通知:', data);
const subType = data?.subType;
// 对于任何好友通知,都刷新列表
if (subType === 'request' || subType === 'accepted' || subType === 'rejected' || subType === 'count_update') {
// 延迟一点刷新,确保后端数据已更新
setTimeout(() => {
this.loadFriendRequests();
}, 300);
}
} catch (error) {
console.error('❌ [好友请求页] 处理好友通知失败:', error);
}
},
// 处理连接时的待处理好友请求通知
handleFriendRequestNotification(data) {
try {
console.log('📋 [好友请求页] 处理待处理好友请求通知:', data);
const pendingCount = data?.pendingCount || 0;
// 如果有待处理请求,刷新列表
if (pendingCount > 0) {
setTimeout(() => {
this.loadFriendRequests();
}, 300);
}
} catch (error) {
console.error('❌ [好友请求页] 处理待处理好友请求通知失败:', error);
}
},
// 格式化时间
formatTime(timeStr) {
const time = new Date(timeStr);
const now = new Date();
const diff = now - time;
const minute = 60 * 1000;
const hour = 60 * minute;
const day = 24 * hour;
const week = 7 * day;
if (diff < minute) {
return '刚刚';
} else if (diff < hour) {
return `${Math.floor(diff / minute)}分钟前`;
} else if (diff < day) {
return `${Math.floor(diff / hour)}小时前`;
} else if (diff < week) {
return `${Math.floor(diff / day)}天前`;
} else {
return time.toLocaleDateString();
}
},
// 获取状态文本
getStatusText(status) {
switch (status) {
case 0: return '待处理';
case 1: return '已接受';
case 2: return '已拒绝';
default: return '未知';
}
},
// 获取状态样式类
getStatusClass(status) {
switch (status) {
case 0: return 'pending';
case 1: return 'accepted';
case 2: return 'rejected';
default: return 'unknown';
}
},
// 页面卸载
onUnload() {
// 移除 WebSocket 监听器
try {
if (this.handleNotificationMessage) {
wsManager.off('notification', this.handleNotificationMessage);
console.log('✅ [好友请求页] 已移除 WebSocket 监听器');
}
} catch (error) {
console.error('❌ [好友请求页] 移除 WebSocket 监听器失败:', error);
}
}
});