markAsDelivered static method

dynamic markAsDelivered(
  1. BaseMessage message, {
  2. required dynamic onSuccess(
    1. String message
    )?,
  3. required dynamic onError(
    1. CometChatException excep
    )?,
})

Mark the messages for a particular conversation as delivered .

Migration Note: Migrated from platform channels to native Dart implementation. Uses RealtimeRepository for WebSocket-based receipt delivery. Behavior and signature remain identical for backward compatibility.

Android Reference: CometChat.markAsDelivered(MessageReceipt receipt)

Transport (matches Android):

  • If WebSocket connected → send via socket (primary)
  • If WebSocket disconnected/connecting → send via REST API (fallback)

method could throw PlatformException with error codes specifying the cause

Implementation

static markAsDelivered(BaseMessage message,
    {required Function(String message)? onSuccess,
    required Function(CometChatException excep)? onError}) async {
  try {
    // Get SDK instance
    final sdk = SdkRegistry.getInstance();

    // Validation: User logged in check (Android behavior)
    final loggedInUser = sdk.auth.getLoggedInUser();
    if (loggedInUser == null) {
      final cometChatEx = CometChatException(
        ErrorCode.errorUserNotLoggedIn,
        ErrorMessage.errorMessageUserNotLoggedIn,
        'Please login before marking messages as delivered',
      );
      _errorCallbackHandler(cometChatEx, null, null, onError);
      return;
    }

    // Check connection status for feature throttled
    final connectionStatus = sdk.realtime.connectionState;
    if (connectionStatus == sdk_connection.ConnectionState.featureThrottled) {
      final cometChatEx = CometChatException(
        'ERROR_RECEIPTS_TEMPORARILY_BLOCKED',
        'Receipts temporarily blocked',
        'Mark as delivered not functional in feature-throttled mode',
      );
      _errorCallbackHandler(cometChatEx, null, null, onError);
      return;
    }

    // Determine receiverId based on Android logic (same as markAsRead)
    String receiverId;
    if (message.receiverType == "group") {
      receiverId = message.receiverUid;
    } else {
      if (message.sender!.uid == loggedInUser.uid) {
        receiverId = message.receiverUid;
      } else {
        receiverId = message.sender!.uid;
      }
    }

    // Check connection status to decide transport method
    // Reference: CometChat.java - markAsDelivered uses same pattern as markAsRead
    final isDisconnectedOrConnecting =
        connectionStatus == sdk_connection.ConnectionState.disconnected ||
            connectionStatus == sdk_connection.ConnectionState.connecting;

    if (isDisconnectedOrConnecting) {
      // Use REST API fallback
      await sdk.messages.markAsDeliveredViaApi(
        messageId: message.id,
        receiverId: receiverId,
        receiverType: message.receiverType,
      );
    } else {
      // Use WebSocket (primary path)
      final receipt = MessageReceipt(
        messageId: message.id,
        sender: message.sender!,
        receiverId: receiverId,
        receiverType: message.receiverType,
        receiptType: 'delivered',
        deliveredAt: DateTime.now(),
        readAt: null,
        timestamp: DateTime.now(),
        messageSender: message.sender!.uid,
      );

      await sdk.realtime.markAsDelivered(receipt);
    }

    // Call success callback
    if (onSuccess != null) onSuccess('Message marked as delivered');
  } on SdkException catch (sdkEx) {
    // Convert SdkException to CometChatException
    final cometChatEx = CometChatException(
      sdkEx.code,
      sdkEx.details ?? sdkEx.message,
      sdkEx.message,
    );
    _errorCallbackHandler(cometChatEx, null, null, onError);
  } catch (e) {
    _errorCallbackHandler(null, null, e, onError);
  }
}