forwardMessages method

Future<void> forwardMessages(
  1. RCIMIWConversation forwardConversation,
  2. BuildContext context
)

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;
        }
    }
  }
}