markMessagesAsRead method
Marks all messages as read
Implementation
Future<void> markMessagesAsRead() async {
// Use custom handler if provided
if (_apiHandlers?.markMessageAsReadHandler != null) {
try {
List<String> unreadMessageIds = [];
for (int i = 0; i < _messages.length; i++) {
final msg = _messages[i];
if (msg.senderId == _receiverId &&
(msg.status == 'sent' || msg.status == 'delivered')) {
unreadMessageIds.add(msg.messageId);
_messages[i].status = 'read';
}
}
if (unreadMessageIds.isEmpty) return;
// Call custom handler for each message
for (var messageId in unreadMessageIds) {
await _apiHandlers!.markMessageAsReadHandler!(messageId);
}
_triggerEvent(ChatEventType.messagesChanged, _messages);
return;
} catch (e) {
_log('Error in custom markMessageAsReadHandler: $e');
return;
}
}
// Otherwise use default implementation
final userId = ChatConfig.instance.userId;
if (!ChatConfig.instance.enableReadReceipts ||
_socket == null ||
!_socket!.connected ||
userId == null ||
_receiverId.isEmpty) {
_log('Cannot mark messages as read: conditions not met');
return;
}
List<String> unreadMessageIds = [];
for (int i = 0; i < _messages.length; i++) {
final msg = _messages[i];
if (msg.senderId == _receiverId &&
(msg.status == 'sent' || msg.status == 'delivered')) {
unreadMessageIds.add(msg.messageId);
_messages[i].status = 'read';
}
}
if (unreadMessageIds.isNotEmpty) {
_log('Marking ${unreadMessageIds.length} messages as read');
// Send individual receipts
_socket!.emit(_socketEvents.messagesReadEvent, {
'messageIds': unreadMessageIds,
'senderId': _receiverId,
'receiverId': userId
});
}
// Always send bulk read receipt
_socket!.emit(_socketEvents.markMessagesReadEvent,
{'userId': userId, 'partnerId': _receiverId});
if (unreadMessageIds.isNotEmpty) {
_triggerEvent(ChatEventType.messagesChanged, _messages);
}
}