sendMediaMessage method

Future<void> sendMediaMessage(
  1. String conversationID,
  2. ZIMConversationType conversationType,
  3. String mediaPath,
  4. ZIMMessageType messageType, {
  5. FutureOr<ZIMKitMessage> preMessageSending(
    1. ZIMKitMessage message
    )?,
  6. dynamic onMessageSent(
    1. ZIMKitMessage message
    )?,
  7. int audioDuration = 0,
})

Implementation

Future<void> sendMediaMessage(
  String conversationID,
  ZIMConversationType conversationType,
  String mediaPath,
  ZIMMessageType messageType, {
  FutureOr<ZIMKitMessage> Function(ZIMKitMessage message)? preMessageSending,
  Function(ZIMKitMessage message)? onMessageSent,
  int audioDuration = 0,
}) async {
  if (mediaPath.isEmpty || !File(mediaPath).existsSync()) {
    ZIMKitLogger.warning(
        "sendMediaMessage: mediaPath is empty or file doesn't exits");
    return;
  }
  if (conversationID.isEmpty) {
    ZIMKitLogger.warning('sendCustomMessage: conversationID is empty');
    return;
  }

  // 1. create message
  var kitMessage = ZIMKitMessageUtils.mediaMessageFactory(
    mediaPath,
    messageType,
    audioDuration: audioDuration,
  ).toKIT();
  kitMessage.zim.conversationID = conversationID;
  kitMessage.zim.conversationType = conversationType;

  // 2. preMessageSending
  kitMessage = (await preMessageSending?.call(kitMessage)) ?? kitMessage;

  // 3. re-generate zim
  // ignore: cascade_invocations
  kitMessage.reGenerateZIMMessage();

  final sendConfig = ZIMMessageSendConfig();
  if (ZegoZIMKitNotificationManager.instance.resourceID?.isNotEmpty ??
      false) {
    final pushConfig = ZIMPushConfig()
      ..resourcesID = ZegoZIMKitNotificationManager.instance.resourceID!
      ..title = ZIMKit().currentUser()?.baseInfo.userName ?? ''

      /// media only show [type] for offline message
      ..content = '[${messageType.name}]'
      ..payload = const JsonEncoder().convert(
        {
          messageTypePayloadKey: BackgroundMessageType.mediaMessage.text,
          'id': conversationID,
          'sender': {
            'id': ZIMKit().currentUser()?.baseInfo.userID ?? '',
            'name': ZIMKit().currentUser()?.baseInfo.userName ?? '',
          },
          'type': conversationType.index,
        },
      );
    sendConfig.pushConfig = pushConfig;
  }

  final mediaMessagePath =
      // ignore: avoid_dynamic_calls
      kitMessage.autoContent.fileDownloadUrl.isNotEmpty
          // ignore: avoid_dynamic_calls
          ? kitMessage.autoContent.fileDownloadUrl
          : mediaPath;
  ZIMKitLogger.info('sendMediaMessage: $mediaMessagePath');

  // 3. call service
  late ZIMKitMessageNotifier kitMessageNotifier;
  await ZIM
      .getInstance()!
      .sendMediaMessage(
        kitMessage.zim as ZIMMediaMessage,
        conversationID,
        conversationType,
        sendConfig,
        ZIMMediaMessageSendNotification(
          onMessageAttached: (zimMessage) {
            ZIMKitLogger.info('sendMediaMessage.onMessageAttached: '
                '${(zimMessage as ZIMMediaMessage).fileName}');
            kitMessageNotifier = db
                .messages(conversationID, conversationType)
                .onAttach(zimMessage);
          },
          onMediaUploadingProgress:
              (message, currentFileSize, totalFileSize) {
            final zimMessage = message as ZIMMediaMessage;
            ZIMKitLogger.info(
                'onMediaUploadingProgress: ${zimMessage.fileName}, $currentFileSize/$totalFileSize');

            kitMessageNotifier.value = (kitMessageNotifier.value.clone()
              ..updateExtraInfo({
                'upload': {
                  ZIMMediaFileType.originalFile.name: {
                    'currentFileSize': currentFileSize,
                    'totalFileSize': totalFileSize,
                  }
                }
              }));
          },
        ),
      )
      .then((result) {
    ZIMKitLogger.info('sendMediaMessage: success, $mediaPath}');
    kitMessageNotifier.value = result.message.toKIT();
    onMessageSent?.call(kitMessageNotifier.value);
  }).catchError((error) {
    kitMessageNotifier.value =
        (kitMessageNotifier.value.clone()..sendFailed(error));
    return checkNeedReloginOrNot(error).then((retryCode) {
      if (retryCode == 0) {
        ZIMKitLogger.info('relogin success, retry sendMediaMessage');
        sendMediaMessage(
          conversationID,
          conversationType,
          mediaPath,
          messageType,
          preMessageSending: preMessageSending,
          onMessageSent: onMessageSent,
        );
      } else {
        ZIMKitLogger.severe(
            'sendMediaMessage: failed, $mediaPath, error:$error');
        onMessageSent?.call(kitMessageNotifier.value);
        throw error;
      }
    });
  });
}