findme-miniprogram-frontend/subpackages/social/friend-detail/friend-detail.js

403 lines
11 KiB
JavaScript
Raw Permalink Normal View History

2025-12-27 17:16:03 +08:00
// 好友详情页面
const app = getApp();
const friendAPI = require('../../../utils/friend-api.js');
Page({
data: {
// 好友信息
friendInfo: null,
loading: true,
// 操作状态
isDeleting: false,
// UI 预计算字段
friendInitial: '?'
},
onLoad(options) {
// 获取好友ID
const customId = options.customId;
if (customId) {
this.loadFriendDetail(customId);
} else {
wx.showToast({
title: '参数错误',
icon: 'none'
});
setTimeout(() => {
wx.navigateBack();
}, 1500);
}
},
// 加载好友详情
async loadFriendDetail(customId) {
try {
this.setData({ loading: true });
const response = await friendAPI.getFriendDetail(customId);
if (response && (response.code === 0 || response.code === 200 || response.code === '0' || response.code === '200')) {
const friendInfo = response.data;
const initial = this._computeInitial(friendInfo);
// 计算年龄(根据生日)
const calculatedAge = this.calculateAge(friendInfo?.birthday);
// 将家乡数组转换为字符串
let hometownText = '';
if (friendInfo?.hometown) {
if (Array.isArray(friendInfo.hometown)) {
hometownText = friendInfo.hometown.filter(item => item).join(' ');
} else if (typeof friendInfo.hometown === 'string') {
hometownText = friendInfo.hometown;
}
}else if(friendInfo.locationInfo){
hometownText = friendInfo.locationInfo.district + friendInfo.locationInfo.city
}
this.setData({
friendInfo: friendInfo,
loading: false,
friendInitial: initial,
calculatedAge: calculatedAge,
hometownText: hometownText
});
} else {
throw new Error(response?.message || '获取好友详情失败');
}
} catch (error) {
console.error('❌ 加载好友详情失败:', error);
this.setData({ loading: false });
wx.showToast({
title: error.message || '加载失败',
icon: 'none'
});
// 延迟返回上一页
setTimeout(() => {
wx.navigateBack();
}, 1500);
}
},
// 根据生日计算年龄
calculateAge(birthday) {
if (!birthday) {
return null;
}
try {
// 处理 YYYY-MM-DD 格式的日期
let birthDate;
if (typeof birthday === 'string' && birthday.includes('-')) {
const dateParts = birthday.split('-');
if (dateParts.length === 3) {
birthDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]));
} else {
birthDate = new Date(birthday);
}
} else {
birthDate = new Date(birthday);
}
if (isNaN(birthDate.getTime())) {
return null;
}
const today = new Date();
let age = today.getFullYear() - birthDate.getFullYear();
const monthDiff = today.getMonth() - birthDate.getMonth();
// 如果还没过生日年龄减1
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
// 年龄应该大于等于0
return age >= 0 ? age : null;
} catch (error) {
console.error('计算年龄失败:', error, birthday);
return null;
}
},
// 发送消息
sendMessage() {
const { friendInfo } = this.data;
if (!friendInfo) return;
wx.navigateTo({
url: `/pages/message/chat/chat?targetId=${friendInfo.customId}&name=${encodeURIComponent(friendInfo.nickname)}&chatType=0`
});
},
previewImage(e) {
try {
// 获取当前点击的图片索引和动态索引
const avatar = e.currentTarget.dataset.avatar;
// 🔥 设置标志,防止预览关闭后触发页面刷新
this._skipNextOnShowReload = true;
const imageUrls=[avatar];
// 调用微信小程序的图片预览API
wx.previewImage({
current: avatar,
urls: imageUrls,
success: () => {
// 预览打开成功,标志已设置,关闭时会触发 onShow
},
fail: (err) => {
console.error('图片预览失败:', err);
// 预览失败,清除标志
this._skipNextOnShowReload = false;
wx.showToast({
title: '预览图片失败',
icon: 'none'
});
}
});
} catch (error) {
console.error('图片预览过程中出错:', error);
// 出错时清除标志
this._skipNextOnShowReload = false;
wx.showToast({
title: '预览图片失败',
icon: 'none'
});
}
},
// 视频通话
videoCall() {
const { friendInfo } = this.data;
if (!friendInfo) return;
wx.showToast({
title: '视频通话功能开发中',
icon: 'none'
});
},
// 设置备注
setRemark() {
const { friendInfo } = this.data;
if (!friendInfo) {
wx.showToast({
title: '好友信息不存在',
icon: 'none'
});
return;
}
console.log('🔍 准备跳转到备注页面,好友信息:', friendInfo);
const nickname = friendInfo.nickname || friendInfo.remark || '好友';
const customId = friendInfo.customId || '';
const friendId = friendInfo.id || friendInfo.friendId || customId;
const remark = friendInfo.remark || '';
wx.navigateTo({
url: `/subpackages/social-remark/friend-remark?friendId=${encodeURIComponent(friendId)}&customId=${encodeURIComponent(customId)}&remark=${encodeURIComponent(remark)}&nickname=${encodeURIComponent(nickname)}`,
success: () => {
console.log('✅ 跳转成功');
},
fail: (err) => {
console.error('❌ 跳转失败:', err);
wx.showToast({
title: '跳转失败: ' + (err.errMsg || '未知错误'),
icon: 'none',
duration: 2000
});
}
});
},
// 删除好友
deleteFriend() {
const { friendInfo } = this.data;
if (!friendInfo) return;
wx.showModal({
title: '删除好友',
content: `确定要删除好友"${friendInfo.nickname}"吗?删除后将同时清理聊天记录。`,
confirmText: '删除',
confirmColor: '#ff4757',
success: async (res) => {
if (res.confirm) {
try {
this.setData({ isDeleting: true });
wx.showLoading({ title: '正在删除...' });
// 后端删除好友关系
await friendAPI.deleteFriend(friendInfo.customId);
// 🔥 删除对应的会话记录
try {
const nimConversationManager = require('../../../utils/nim-conversation-manager.js');
const app = getApp();
// 获取当前用户的 NIM accountId
const userInfo = app.globalData.userInfo;
const myAccountId = userInfo?.neteaseIMAccid || userInfo?.user?.neteaseIMAccid;
console.log('删除会话 - 用户信息:', {
myAccountId,
friendId: friendInfo.customId
});
if (myAccountId && friendInfo.customId) {
const conversationId = `${myAccountId}|1|${friendInfo.customId}`;
console.log('🗑️ 准备删除会话:', conversationId);
await nimConversationManager.deleteConversation(conversationId);
console.log('✅ 已删除好友会话:', conversationId);
} else {
console.warn('⚠️ 缺少必要信息,无法删除会话', {
hasMyAccountId: !!myAccountId,
hasFriendId: !!friendInfo.customId
});
}
} catch (convError) {
console.error('⚠️ 删除会话失败(不影响主流程):', convError);
}
wx.hideLoading();
wx.showToast({
title: '已删除好友',
icon: 'success'
});
// 延迟返回并刷新好友列表
setTimeout(() => {
// 通知好友页面刷新
const pages = getCurrentPages();
const friendsPage = pages.find(page => page.route === 'pages/social/friends/friends');
if (friendsPage && friendsPage.loadFriends) {
friendsPage.loadFriends();
}
wx.navigateBack();
}, 1000);
} catch (error) {
console.error('❌ 删除好友失败:', error);
wx.hideLoading();
this.setData({ isDeleting: false });
wx.showToast({
title: error.message || '删除失败',
icon: 'none'
});
}
}
}
});
},
// 查看位置
viewLocation() {
const { friendInfo } = this.data;
if (!friendInfo || !friendInfo.locationInfo) {
wx.showToast({
title: '暂无位置信息',
icon: 'none'
});
return;
}
const { locationInfo } = friendInfo;
wx.openLocation({
latitude: locationInfo.latitude,
longitude: locationInfo.longitude,
name: friendInfo.nickname,
address: locationInfo.address || '未知位置'
});
},
// ===== 置顶/免打扰开关 =====
async onTogglePin(e) {
wx.showToast({
title: '请使用消息页面管理会话',
icon: 'none'
});
},
async onToggleMute(e) {
wx.showToast({
title: '请使用消息页面管理会话',
icon: 'none'
});
},
// 计算头像首字母
_computeInitial(friendInfo) {
try {
const name = String(friendInfo?.remark || friendInfo?.nickname || '').trim();
if (!name) return '?';
return name.charAt(0);
} catch (_) {
return '?';
}
},
// 复制ID
copyId() {
const { friendInfo } = this.data;
const id = friendInfo?.customId || (friendInfo?.id ? 'findme_' + friendInfo.id : '未设置');
if (!id || id === '未设置') {
wx.showToast({
title: 'ID不存在',
icon: 'none'
});
return;
}
wx.setClipboardData({
data: id,
success: () => {
wx.showToast({
title: '复制成功',
icon: 'success',
duration: 2000
});
},
fail: () => {
wx.showToast({
title: '复制失败',
icon: 'none'
});
}
});
},
// 查看二维码
viewQRCode() {
const { friendInfo } = this.data;
if (!friendInfo || !friendInfo.customId) {
wx.showToast({
title: '好友信息不存在',
icon: 'none'
});
return;
}
// 传递好友的 customId 参数,用于生成好友的二维码
wx.navigateTo({
url: `/subpackages/qr/qr-code/qr-code?customId=${friendInfo.customId}`,
success: (res) => {
console.log('跳转二维码页面成功', res);
},
fail: (err) => {
console.error('跳转二维码页面失败', err);
wx.showToast({
title: '跳转失败',
icon: 'none'
});
}
});
},
});