Browse Source

feat(call): 添加通话状态结束类型并优化通话消息更新机制

- 添加 terminated 通话状态类型
- 在通话消息中添加日志记录功能
- 实现通话消息状态变更时的实时更新机制
- 支持通过 channelId 匹配通话消息进行更新
- 优化消息属性初始化逻辑
- 添加通话消息错误处理和日志记录
master
Jolie 3 months ago
parent
commit
4e2c3b15a8
2 changed files with 147 additions and 4 deletions
  1. 143
      lib/im/im_manager.dart
  2. 8
      lib/widget/message/call_item.dart

143
lib/im/im_manager.dart

@ -249,6 +249,145 @@ class IMManager {
Get.log('📨 [IMManager] 消息内容已修改: ${message.localTime}');
}
//
bool isCallMessage = false;
try {
if (message.body.type == MessageType.CUSTOM) {
final customBody = message.body as EMCustomMessageBody;
isCallMessage = customBody.event == 'call';
}
} catch (e) {
//
}
// CallItem
if (isCallMessage) {
try {
if (Get.isLogEnable) {
Get.log('📞 [IMManager] 检测到通话消息内容修改: msgId=${message.msgId}');
}
String? userId;
// userId
if (message.direction == MessageDirection.RECEIVE) {
// 使ID
userId = message.from;
} else if (message.direction == MessageDirection.SEND) {
// 使ID
userId = message.to;
}
if (Get.isLogEnable) {
Get.log('📞 [IMManager] 通话消息方向: ${message.direction}, userId: $userId');
}
// ChatController
if (userId != null && userId.isNotEmpty) {
final controller = _activeChatControllers[userId];
if (controller != null) {
//
var index = controller.messages.indexWhere((msg) => msg.msgId == message.msgId);
if (index != -1) {
if (Get.isLogEnable) {
final oldMessage = controller.messages[index];
final customBody = oldMessage.body as EMCustomMessageBody;
Get.log('📞 [IMManager] 找到通话消息,index=$index, 旧状态: ${customBody.params?['callStatus']}, 新状态: ${(message.body as EMCustomMessageBody).params?['callStatus']}');
}
//
controller.messages[index] = message;
// RxList UI
controller.messages.refresh();
// update() GetBuilder
controller.update();
if (Get.isLogEnable) {
Get.log('✅ [IMManager] 已更新通话消息: msgId=${message.msgId}, userId=$userId, index=$index');
} else {
print('✅ [IMManager] 已更新通话消息: msgId=${message.msgId}, userId=$userId, index=$index');
}
} else {
// channelId和时间戳
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 未找到通话消息(通过msgId),尝试其他匹配方式: msgId=${message.msgId}, userId=$userId');
}
// channelId
final customBody = message.body as EMCustomMessageBody;
final channelId = customBody.params?['channelId'];
if (channelId != null && channelId.isNotEmpty) {
// channelId和时间戳匹配
final matchedIndex = controller.messages.indexWhere((msg) {
if (msg.body.type == MessageType.CUSTOM) {
final msgBody = msg.body as EMCustomMessageBody;
if (msgBody.event == 'call' && msgBody.params != null) {
final msgChannelId = msgBody.params?['channelId'];
// channelId和相似的时间戳
if (msgChannelId == channelId) {
// 5
final timeDiff = (message.serverTime - msg.serverTime).abs();
return timeDiff < 5000;
}
}
}
return false;
});
if (matchedIndex != -1) {
if (Get.isLogEnable) {
Get.log('📞 [IMManager] 通过channelId匹配到通话消息,index=$matchedIndex');
}
//
controller.messages[matchedIndex] = message;
controller.messages.refresh();
controller.update();
if (Get.isLogEnable) {
Get.log('✅ [IMManager] 已通过channelId更新通话消息: msgId=${message.msgId}, userId=$userId, index=$matchedIndex');
} else {
print('✅ [IMManager] 已通过channelId更新通话消息: msgId=${message.msgId}, userId=$userId, index=$matchedIndex');
}
} else {
//
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 无法匹配通话消息,添加到列表: msgId=${message.msgId}');
}
controller.messages.add(message);
controller.messages.refresh();
controller.update();
}
} else {
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 通话消息没有channelId,无法匹配: msgId=${message.msgId}');
}
}
}
} else {
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 未找到 ChatController: userId=$userId');
} else {
print('⚠️ [IMManager] 未找到 ChatController: userId=$userId');
}
}
} else {
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] userId 为空,无法更新通话消息');
}
}
} catch (e, stackTrace) {
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 处理通话消息更新失败: $e');
Get.log('堆栈跟踪: $stackTrace');
} else {
print('⚠️ [IMManager] 处理通话消息更新失败: $e');
print('堆栈跟踪: $stackTrace');
}
}
}
//
// attributes revenueInfo
//
@ -1257,9 +1396,7 @@ class IMManager {
//
//
//
if (message.attributes == null) {
message.attributes = {};
}
message.attributes ??= {};
// sender_
message.attributes!['sender_userId'] = currentUserId;

8
lib/widget/message/call_item.dart

@ -20,6 +20,7 @@ enum CallStatus {
missed, //
cancelled, //
rejected, //
terminated
}
class CallItem extends StatelessWidget {
@ -46,6 +47,7 @@ class CallItem extends StatelessWidget {
if (customBody.event == 'call' && customBody.params != null) {
// Map<String, String> Map<String, dynamic>
final params = customBody.params!;
Get.log('通话信息: $params');
return {
'callType': params['callType'] ?? 'voice',
'callStatus': params['callStatus'] ?? 'missed',
@ -89,6 +91,8 @@ class CallItem extends StatelessWidget {
return CallStatus.cancelled;
} else if (statusStr == 'rejected') {
return CallStatus.rejected;
} else if (statusStr == 'terminated') {
return CallStatus.terminated;
}
}
return CallStatus.missed; //
@ -151,7 +155,9 @@ class CallItem extends StatelessWidget {
return '已取消';
} else if (callStatus == CallStatus.rejected) {
return '已拒绝';
} else {
} else if(callStatus == CallStatus.terminated){
return '已结束';
}else {
return callType == CallType.video ? '视频通话' : '语音通话';
}
}

Loading…
Cancel
Save