markAsDelivered static method
dynamic
markAsDelivered(
- BaseMessage message, {
- required dynamic onSuccess(
- String message
- required dynamic onError(
- 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);
}
}