markMessagesAsRead method

Future<void> markMessagesAsRead()

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);
  }
}