sendCustomMessage method

Future<void> sendCustomMessage(
  1. String conversationID,
  2. ZIMConversationType conversationType, {
  3. required int customType,
  4. required String customMessage,
  5. String? searchedContent,
  6. FutureOr<ZIMKitMessage> preMessageSending(
    1. ZIMKitMessage
    )?,
  7. dynamic onMessageSent(
    1. ZIMKitMessage
    )?,
})

Implementation

Future<void> sendCustomMessage(
  String conversationID,
  ZIMConversationType conversationType, {
  required int customType,
  required String customMessage,
  String? searchedContent,
  FutureOr<ZIMKitMessage> Function(ZIMKitMessage)? preMessageSending,
  Function(ZIMKitMessage)? onMessageSent,
}) async {
  if (conversationID.isEmpty) {
    ZIMKitLogger.warning('sendCustomMessage: conversationID is empty');
    return;
  }

  // 1. create message
  var kitMessage =
      (ZIMCustomMessage(subType: customType, message: customMessage)
            ..searchedContent = searchedContent ?? '')
          .toKIT();
  final sendConfig = ZIMMessageSendConfig();

  // 2. preMessageSending
  kitMessage = (await preMessageSending?.call(kitMessage)) ?? kitMessage;
  ZIMKitLogger.info(
      'sendCustomMessage: customType: $customType, message: $customMessage');

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

  // 3. call service
  late ZIMKitMessageNotifier kitMessageNotifier;
  await ZIM.getInstance()!.sendMessage(
    kitMessage.zim,
    conversationID,
    conversationType,
    sendConfig,
    ZIMMessageSendNotification(
      onMessageAttached: (zimMessage) {
        kitMessageNotifier = db
            .messages(conversationID, conversationType)
            .onAttach(zimMessage);
      },
    ),
  ).then((result) {
    ZIMKitLogger.info(
        'sendCustomMessage: success, customType: $customType, message: $customMessage');
    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 sendCustomMessage');
        sendCustomMessage(
          conversationID,
          conversationType,
          customMessage: customMessage,
          customType: customType,
          searchedContent: searchedContent,
          preMessageSending: preMessageSending,
          onMessageSent: onMessageSent,
        );
      } else {
        ZIMKitLogger.severe(
            'sendCustomMessage: failed, error:$error, customType: $customType, message: $customMessage');
        onMessageSent?.call(kitMessageNotifier.value);
        throw error;
      }
    });
  });
}