sendMessageForNew<T, F> method

Future<V2TimValueCallback<V2TimMessage>> sendMessageForNew<T, F>({
  1. required Map<String, dynamic> params,
})

Implementation

Future<V2TimValueCallback<V2TimMessage>> sendMessageForNew<T, F>({required Map<String, dynamic> params}) async {
  String? id = params['id'];
  var messageElem;
  try {
    final groupID = params['groupID'] ?? '';
    final recveiver = params['receiver'] ?? '';
    final haveTwoValues = groupID != '' && recveiver != '';

    final messageMap = messageIDMap[id];
    final messageInfo = messageMap["messageInfo"];
    final type = messageMap["messageInfo"]["type"];
    if (haveTwoValues) {
      return CommonUtils.returnErrorForValueCb<V2TimMessage>({'code': 6017, 'desc': "receiver and groupID cannot set at the same time", 'data': V2TimMessage(elemType: 1).toJson()});
    }
    if (id == null || messageMap == null) {
      return CommonUtils.returnErrorForValueCb<V2TimMessage>({'code': 6017, 'desc': "id cannot be empty or message cannot find", 'data': V2TimMessage(elemType: 1).toJson()});
    }
    final convType = groupID != '' ? 'GROUP' : 'C2C';
    final sendToUserID = convType == 'GROUP' ? groupID : recveiver;
    final needReadReceipt = params['needReadReceipt'];
    final cloudCustomData = params['cloudCustomData'] ?? "";
    switch (type) {
      case "text":
        {
          String text = messageInfo["textElem"]["text"];
          final createElemParams = CreateMessage.createTextMessage(userID: sendToUserID, text: text, cloudCustomData: cloudCustomData, convType: convType, needReadReceipt: needReadReceipt, priority: params['priority']);
          messageElem = timeweb!.createTextMessage(createElemParams);
          break;
        }
      case "custom":
        {
          final customMessage = CreateMessage.createCustomMessage(
              userID: sendToUserID,
              customData: messageInfo["customElem"]["data"],
              convType: convType,
              cloudCustomData: cloudCustomData,
              needReadReceipt: needReadReceipt,
              extension: messageInfo['customElem']['extension'],
              description: messageInfo['customElem']['desc'],
              priority: params['priority']);
          messageElem = timeweb!.createCustomMessage(customMessage);
          break;
        }
      case "face":
        {
          final faceMessage = CreateMessage.createFaceMessage(
              userID: sendToUserID, data: messageInfo["faceElem"]["data"], index: messageInfo["faceElem"]["index"], cloudCustomData: cloudCustomData, needReadReceipt: needReadReceipt, convType: convType, priority: params['priority']);
          messageElem = timeweb!.createFaceMessage(faceMessage);
          break;
        }
      case "image":
        {
          final progressCallback = allowInterop((double progress) async {
            final messageInstance = await V2TIMMessage.convertMessageFromWebToDart(messageElem);
            if (messageListener.isNotEmpty) {
              messageInstance['id'] = id;
              for (var listener in messageListener.values) {
                listener.onSendMessageProgress(V2TimMessage.fromJson(messageInstance), progress.toInt());
              }
            }
          });
          final createElemParams = CreateMessage.createImageMessage(
              userID: sendToUserID, file: messageInfo["imageElem"]["file"], convType: convType, cloudCustomData: cloudCustomData, needReadReceipt: needReadReceipt, progressCallback: progressCallback, priority: params['priority']);
          messageElem = timeweb!.createImageMessage(createElemParams);
          break;
        }
      case "textAt":
        {
          final createElemParams = CreateMessage.createTextAtMessage(
              groupID: sendToUserID, text: messageInfo["textElem"]['text'], priority: params['priority'], needReadReceipt: needReadReceipt, cloudCustomData: cloudCustomData, atList: messageInfo["textElem"]['atUserList']);
          messageElem = timeweb!.createTextAtMessage(createElemParams);
          break;
        }
      case "location":
        {
          final createElemParams = CreateMessage.createLocationMessage(
              description: messageInfo["locationElem"]['description'],
              longitude: messageInfo["locationElem"]['longitude'],
              latitude: messageInfo["locationElem"]['latitude'],
              cloudCustomData: cloudCustomData,
              needReadReceipt: needReadReceipt,
              priority: params['priority'],
              userID: sendToUserID);
          messageElem = timeweb!.createLocationMessage(createElemParams);
          break;
        }
      case "mergeMessage":
        {
          List<String> msgList = messageInfo["mergerElem"]['msgIDList'];
          List<dynamic> messageList = msgList.map((e) => timeweb!.findMessage(e)).toList();
          String titile = messageInfo["mergerElem"]['title'];
          List<String> abstractList = messageInfo["mergerElem"]['abstractList'];
          String compatibleText = messageInfo["mergerElem"]['compatibleText'];
          final createElemParams = CreateMessage.createMereMessage(
              userID: sendToUserID,
              messageList: messageList,
              title: titile,
              convType: convType,
              cloudCustomData: cloudCustomData,
              priority: params['priority'],
              abstractList: abstractList,
              needReadReceipt: needReadReceipt,
              compatibleText: compatibleText);
          messageElem = timeweb!.createMergerMessage(createElemParams);
          break;
        }
      case "forwardMessage":
        {
          final msgID = messageInfo['msgID'];
          final createElemParams = CreateMessage.createForwardMessage(
            message: timeweb!.findMessage(msgID),
            userID: sendToUserID,
            cloudCustomData: cloudCustomData,
            needReadReceipt: needReadReceipt,
            priority: params['priority'],
          );

          messageElem = timeweb!.createForwardMessage(createElemParams);
          break;
        }
      case "video":
        {
          final progressCallback = allowInterop((double progress) async {
            final messageInstance = await V2TIMMessage.convertMessageFromWebToDart(messageElem);
            if (messageListener.isNotEmpty) {
              messageInstance['id'] = id;
              for (var listener in messageListener.values) {
                listener.onSendMessageProgress(V2TimMessage.fromJson(messageInstance), progress.toInt());
              }
            }
          });
          final createElemParams = CreateMessage.createVideoMessage(
              userID: sendToUserID, file: messageInfo['videoElem']['file'], convType: convType, cloudCustomData: cloudCustomData, needReadReceipt: needReadReceipt, progressCallback: progressCallback, priority: params['priority']);
          messageElem = timeweb!.createVideoMessage(createElemParams);
          break;
        }
      case "file":
        {
          final progressCallback = allowInterop((double progress) async {
            final messageInstance = await V2TIMMessage.convertMessageFromWebToDart(messageElem);
            if (messageListener.isNotEmpty) {
              messageInstance['id'] = id;
              for (var listener in messageListener.values) {
                listener.onSendMessageProgress(V2TimMessage.fromJson(messageInstance), progress.toInt());
              }
            }
          });
          final createElemParams = CreateMessage.createFileMessage(
              userID: sendToUserID, file: messageInfo['fileElem']['file'], convType: convType, cloudCustomData: cloudCustomData, needReadReceipt: needReadReceipt, progressCallback: progressCallback, priority: params['priority']);
          messageElem = timeweb!.createFileMessage(createElemParams);
          break;
        }
    }
    final res = await wrappedPromiseToFuture(timeweb!.sendMessage(
        messageElem,
        mapToJSObj({
          "onlineUserOnly": params['onlineUserOnly'],
          "messageControlInfo": mapToJSObj({"excludedFromUnreadCount": params["isExcludedFromUnreadCount"], "excludedFromLastMessage": params["isExcludedFromLastMessage"]})
        })));
    final code = res.code;
    if (code == 0) {
      final message = jsToMap(res.data)['message'];
      final formatedMessage = await V2TIMMessage.convertMessageFromWebToDart(message);
      messageIDMap.remove(id);
      return CommonUtils.returnSuccess<V2TimMessage>(formatedMessage);
    } else {
      return CommonUtils.returnErrorForValueCb<V2TimMessage>('发送消息失败');
    }
  } catch (error) {
    messageIDMap.remove(id);
    final mapMessageElem = jsToMap(messageElem);
    mapMessageElem['status'] = "fail";
    final formatedMessage = await V2TIMMessage.convertMessageFromWebToDart(messageElem);
    return CommonUtils.returnErrorForValueCb<V2TimMessage>(error, resultData: formatedMessage);
  }
}