forwardMessages method
Implementation
Future<void> forwardMessages(
RCIMIWConversation forwardConversation, BuildContext context) async {
String targetId = forwardConversation.targetId ?? '';
String? channelId = forwardConversation.channelId;
RCIMIWConversationType conversationType =
forwardConversation.conversationType ?? RCIMIWConversationType.invalid;
if (_chatProvider == null) return;
RCKChatProvider chatProvider = _chatProvider!;
// 转发页打开后仍可能收到远端修改事件。以消息 UID 重新取当前会话
// 中的对象,避免把构造 Provider 时的旧正文发送出去。
final messages = messagesToForward
.map((message) {
final messageUId = message.messageUId;
if (messageUId == null || messageUId.isEmpty) return message;
final state = chatProvider.referenceMessageState(messageUId);
if (state == RCIMIWReferenceMessageStatus.recalled ||
state == RCIMIWReferenceMessageStatus.deleted) {
return null;
}
return chatProvider.messageByUId(messageUId) ?? message;
})
.where((message) {
if (message == null) return false;
return message is! RCIMIWRecallNotificationMessage &&
message.messageType != RCIMIWMessageType.recall;
})
.cast<RCIMIWMessage>()
.toList(growable: false);
messagesToForward = messages;
for (var message in messages) {
final effectiveMessage =
useModifiedContent ? getEffectiveMessage(message) : message;
switch (effectiveMessage.messageType) {
case RCIMIWMessageType.text:
{
RCIMIWTextMessage? forwardMsg = RCIMIWTextMessage.fromJson(
(effectiveMessage as RCIMIWTextMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.voice:
{
RCIMIWVoiceMessage? forwardMsg = RCIMIWVoiceMessage.fromJson(
(effectiveMessage as RCIMIWVoiceMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.image:
{
RCIMIWImageMessage? forwardMsg = RCIMIWImageMessage.fromJson(
(effectiveMessage as RCIMIWImageMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.gif:
{
RCIMIWGIFMessage? forwardMsg = RCIMIWGIFMessage.fromJson(
(effectiveMessage as RCIMIWGIFMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.file:
{
RCIMIWFileMessage? forwardMsg = RCIMIWFileMessage.fromJson(
(effectiveMessage as RCIMIWFileMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.reference:
{
RCIMIWReferenceMessage? forwardMsg =
RCIMIWReferenceMessage.fromJson(
(effectiveMessage as RCIMIWReferenceMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.sight:
{
RCIMIWSightMessage? forwardMsg = RCIMIWSightMessage.fromJson(
(effectiveMessage as RCIMIWSightMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.nativeCustom:
{
RCIMIWNativeCustomMessage? forwardMsg =
RCIMIWNativeCustomMessage.fromJson(
(effectiveMessage as RCIMIWNativeCustomMessage).toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
case RCIMIWMessageType.nativeCustomMedia:
{
RCIMIWNativeCustomMediaMessage? forwardMsg =
RCIMIWNativeCustomMediaMessage.fromJson(
(effectiveMessage as RCIMIWNativeCustomMediaMessage)
.toJson());
_prepareForwardMessage(
forwardMsg, targetId, channelId, conversationType);
chatProvider.sendMessage(forwardMsg, isForward: true);
break;
}
// 根据需要增加其他消息类型的转发逻辑
default:
{
// 不支持的消息类型,可跳过或显示提示
break;
}
}
}
}