|
|
|
@ -79,7 +79,12 @@ Page({ |
|
|
|
messageIds: new Set(), |
|
|
|
|
|
|
|
// 正在发送中的消息ID集合
|
|
|
|
sendingMessages: new Set() |
|
|
|
sendingMessages: new Set(), |
|
|
|
|
|
|
|
// 显示发送中提示
|
|
|
|
showSendingTip: false, |
|
|
|
// 发送中的消息数量
|
|
|
|
sendingCount: 0 |
|
|
|
}, |
|
|
|
|
|
|
|
onLoad: function(options) { |
|
|
|
@ -103,7 +108,9 @@ Page({ |
|
|
|
earliestMsgTime: 0, |
|
|
|
firstLoadComplete: false, |
|
|
|
messageIds: new Set(), |
|
|
|
sendingMessages: new Set() |
|
|
|
sendingMessages: new Set(), |
|
|
|
showSendingTip: false, |
|
|
|
sendingCount: 0 |
|
|
|
}); |
|
|
|
|
|
|
|
// 先创建对话,然后获取聊天记录
|
|
|
|
@ -401,9 +408,8 @@ Page({ |
|
|
|
console.log('格式化消息使用的用户ID:', userId); |
|
|
|
|
|
|
|
return messages.map(msg => { |
|
|
|
// 判断消息类型
|
|
|
|
let contentType = msg.contentType || 'text'; |
|
|
|
let type = msg.type || 'text'; |
|
|
|
// 统一使用contentType字段
|
|
|
|
let contentType = msg.contentType || msg.type || 'text'; |
|
|
|
let content = msg.content || ''; |
|
|
|
|
|
|
|
// 判断发送者
|
|
|
|
@ -418,11 +424,13 @@ Page({ |
|
|
|
sender: isMe ? 'user' : 'expert', |
|
|
|
senderId: msg.senderId || msg.fromUserId || msg.userId, |
|
|
|
contentType: contentType, |
|
|
|
type: type, |
|
|
|
content: content, |
|
|
|
timestamp: msg.createTime || msg.timestamp || Date.now(), |
|
|
|
status: msg.status || 'success', |
|
|
|
...msg |
|
|
|
fileName: msg.fileName || '', |
|
|
|
fileSize: msg.fileSize || 0, |
|
|
|
thumb: msg.thumb || '', |
|
|
|
progress: msg.progress || 100 |
|
|
|
}; |
|
|
|
}); |
|
|
|
}, |
|
|
|
@ -740,7 +748,11 @@ Page({ |
|
|
|
// 从发送中集合移除
|
|
|
|
const sendingMessages = new Set(this.data.sendingMessages); |
|
|
|
sendingMessages.delete(messageId); |
|
|
|
this.setData({ sendingMessages: sendingMessages }); |
|
|
|
this.setData({ |
|
|
|
sendingMessages: sendingMessages, |
|
|
|
sendingCount: sendingMessages.size, |
|
|
|
showSendingTip: sendingMessages.size > 0 |
|
|
|
}); |
|
|
|
|
|
|
|
// 更新本地消息状态为成功
|
|
|
|
this.updateMessageStatus(messageId, 'success'); |
|
|
|
@ -773,18 +785,20 @@ Page({ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// 创建新消息对象
|
|
|
|
// 创建新消息对象 - 统一使用contentType
|
|
|
|
const newMessage = { |
|
|
|
id: messageId, |
|
|
|
isMe: isMe, |
|
|
|
sender: isMe ? 'user' : 'expert', |
|
|
|
senderId: senderId, |
|
|
|
contentType: messageData.contentType || messageData.type || 'text', |
|
|
|
type: messageData.type || messageData.contentType || 'text', |
|
|
|
content: messageData.content || '', |
|
|
|
timestamp: messageData.timestamp || Date.now(), |
|
|
|
status: 'success', |
|
|
|
progress: 100 |
|
|
|
status: 'success', // 对方消息直接显示成功
|
|
|
|
progress: 100, |
|
|
|
fileName: messageData.fileName || '', |
|
|
|
fileSize: messageData.fileSize || 0, |
|
|
|
thumb: messageData.thumb || '' |
|
|
|
}; |
|
|
|
|
|
|
|
console.log('创建的新消息对象:', newMessage); |
|
|
|
@ -838,10 +852,8 @@ Page({ |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
// 如果不是自己发的消息,震动提示
|
|
|
|
// 如果不是自己发的消息,发送已读回执
|
|
|
|
if (!isMe) { |
|
|
|
// wx.vibrateShort({ type: 'light' });
|
|
|
|
// 发送已读回执
|
|
|
|
this.sendReadReceipt(messageId); |
|
|
|
} |
|
|
|
}); |
|
|
|
@ -859,10 +871,14 @@ Page({ |
|
|
|
} |
|
|
|
|
|
|
|
// 如果收到成功状态,从发送中集合移除
|
|
|
|
if (data.status === 'success') { |
|
|
|
if (data.status === 'success' || data.status === 'read') { |
|
|
|
const sendingMessages = new Set(this.data.sendingMessages); |
|
|
|
sendingMessages.delete(messageId); |
|
|
|
this.setData({ sendingMessages: sendingMessages }); |
|
|
|
this.setData({ |
|
|
|
sendingMessages: sendingMessages, |
|
|
|
sendingCount: sendingMessages.size, |
|
|
|
showSendingTip: sendingMessages.size > 0 |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
@ -890,7 +906,7 @@ Page({ |
|
|
|
}, |
|
|
|
|
|
|
|
// 发送消息到服务器
|
|
|
|
sendMessageToServer: function(content, type, messageId) { |
|
|
|
sendMessageToServer: function(content, contentType, messageId) { |
|
|
|
const receiverId = this.data.otherUserId; |
|
|
|
const senderId = this.getCurrentUserId(); |
|
|
|
|
|
|
|
@ -898,7 +914,7 @@ Page({ |
|
|
|
senderId: senderId, |
|
|
|
receiverId: receiverId, |
|
|
|
content: content, |
|
|
|
type: type, |
|
|
|
contentType: contentType, |
|
|
|
messageId: messageId |
|
|
|
}); |
|
|
|
|
|
|
|
@ -912,7 +928,11 @@ Page({ |
|
|
|
// 发送失败,从发送中集合移除
|
|
|
|
const sendingMessages = new Set(this.data.sendingMessages); |
|
|
|
sendingMessages.delete(messageId); |
|
|
|
this.setData({ sendingMessages: sendingMessages }); |
|
|
|
this.setData({ |
|
|
|
sendingMessages: sendingMessages, |
|
|
|
sendingCount: sendingMessages.size, |
|
|
|
showSendingTip: sendingMessages.size > 0 |
|
|
|
}); |
|
|
|
|
|
|
|
// 更新消息状态为失败
|
|
|
|
this.updateMessageStatus(messageId, 'failed'); |
|
|
|
@ -924,7 +944,7 @@ Page({ |
|
|
|
receiverId: receiverId, |
|
|
|
senderId: senderId, |
|
|
|
content: content, |
|
|
|
contentType: type || 'text', |
|
|
|
contentType: contentType, |
|
|
|
timestamp: Date.now(), |
|
|
|
messageId: messageId |
|
|
|
}; |
|
|
|
@ -990,24 +1010,28 @@ Page({ |
|
|
|
const sendingMessages = new Set(this.data.sendingMessages); |
|
|
|
sendingMessages.add(messageId); |
|
|
|
|
|
|
|
// 创建本地消息
|
|
|
|
// 创建本地消息 - 使用contentType
|
|
|
|
const newMessage = { |
|
|
|
id: messageId, |
|
|
|
isMe: true, |
|
|
|
sender: 'user', |
|
|
|
senderId: this.getCurrentUserId(), |
|
|
|
contentType: 'text', |
|
|
|
type: 'text', |
|
|
|
content: content, |
|
|
|
timestamp: Date.now(), |
|
|
|
status: 'sending' |
|
|
|
status: 'sending', // 设置为发送中状态
|
|
|
|
progress: 100 |
|
|
|
}; |
|
|
|
|
|
|
|
// 添加到列表
|
|
|
|
this.addMessageToList(newMessage); |
|
|
|
|
|
|
|
// 更新发送中集合
|
|
|
|
this.setData({ sendingMessages: sendingMessages }); |
|
|
|
// 更新发送中集合和发送计数
|
|
|
|
this.setData({ |
|
|
|
sendingMessages: sendingMessages, |
|
|
|
sendingCount: sendingMessages.size, |
|
|
|
showSendingTip: sendingMessages.size > 0 |
|
|
|
}); |
|
|
|
|
|
|
|
// 清空输入框
|
|
|
|
this.setData({ inputValue: '' }); |
|
|
|
@ -1024,7 +1048,11 @@ Page({ |
|
|
|
// 从发送中集合移除
|
|
|
|
const sendingMessages = new Set(this.data.sendingMessages); |
|
|
|
sendingMessages.delete(messageId); |
|
|
|
this.setData({ sendingMessages: sendingMessages }); |
|
|
|
this.setData({ |
|
|
|
sendingMessages: sendingMessages, |
|
|
|
sendingCount: sendingMessages.size, |
|
|
|
showSendingTip: sendingMessages.size > 0 |
|
|
|
}); |
|
|
|
|
|
|
|
wx.showToast({ |
|
|
|
title: '发送超时', |
|
|
|
@ -1049,7 +1077,7 @@ Page({ |
|
|
|
}, |
|
|
|
|
|
|
|
// 通用文件上传
|
|
|
|
uploadFile: function(tempFilePath, fileName, fileSize = 0, type = 'file', thumbPath = '') { |
|
|
|
uploadFile: function(tempFilePath, fileName, fileSize = 0, contentType = 'file', thumbPath = '') { |
|
|
|
const messageId = 'file_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); |
|
|
|
|
|
|
|
// 将消息ID添加到发送中集合
|
|
|
|
@ -1060,8 +1088,7 @@ Page({ |
|
|
|
id: messageId, |
|
|
|
isMe: true, |
|
|
|
sender: 'user', |
|
|
|
type: type, |
|
|
|
contentType: type, |
|
|
|
contentType: contentType, |
|
|
|
content: tempFilePath, |
|
|
|
thumb: thumbPath, |
|
|
|
fileName: fileName, |
|
|
|
@ -1073,12 +1100,16 @@ Page({ |
|
|
|
}; |
|
|
|
|
|
|
|
this.addMessageToList(message); |
|
|
|
this.setData({ sendingMessages: sendingMessages }); |
|
|
|
this.simulateUpload(messageId, type, tempFilePath); |
|
|
|
this.setData({ |
|
|
|
sendingMessages: sendingMessages, |
|
|
|
sendingCount: sendingMessages.size, |
|
|
|
showSendingTip: sendingMessages.size > 0 |
|
|
|
}); |
|
|
|
this.simulateUpload(messageId, contentType, tempFilePath); |
|
|
|
}, |
|
|
|
|
|
|
|
// 模拟上传
|
|
|
|
simulateUpload: function(messageId, type, tempFilePath) { |
|
|
|
simulateUpload: function(messageId, contentType, tempFilePath) { |
|
|
|
let progress = 0; |
|
|
|
const uploadInterval = setInterval(() => { |
|
|
|
progress += Math.random() * 20 + 10; |
|
|
|
@ -1097,7 +1128,7 @@ Page({ |
|
|
|
this.setData({ messageList }); |
|
|
|
|
|
|
|
const fileUrl = tempFilePath; |
|
|
|
this.sendMessageToServer(fileUrl, type, messageId); |
|
|
|
this.sendMessageToServer(fileUrl, contentType, messageId); |
|
|
|
} |
|
|
|
}, 200); |
|
|
|
} |
|
|
|
@ -1146,6 +1177,17 @@ Page({ |
|
|
|
if (index !== -1) { |
|
|
|
messageList[index].status = status; |
|
|
|
this.setData({ messageList }); |
|
|
|
|
|
|
|
// 如果是失败状态,从发送中集合移除
|
|
|
|
if (status === 'failed' || status === 'timeout') { |
|
|
|
const sendingMessages = new Set(this.data.sendingMessages); |
|
|
|
sendingMessages.delete(messageId); |
|
|
|
this.setData({ |
|
|
|
sendingMessages: sendingMessages, |
|
|
|
sendingCount: sendingMessages.size, |
|
|
|
showSendingTip: sendingMessages.size > 0 |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
|