receiveMessage method

void receiveMessage(
  1. Map<String, dynamic> messageData
)

Processes a received message

Implementation

void receiveMessage(Map<String, dynamic> messageData) {
  final userId = ChatConfig.instance.userId;
  if (userId == null) return;

  // Validate message
  if (!messageData.containsKey('messageId') ||
      !messageData.containsKey('sender') ||
      !messageData.containsKey('receiver')) {
    _log('Received message with missing fields');
    return;
  }

  // Create message object
  final message = ChatMessage.fromMap(messageData, userId);

  // Check for duplicates
  int existingIndex =
      _messages.indexWhere((msg) => msg.messageId == message.messageId);

  if (existingIndex >= 0) {
    // Update existing message if needed
    if (messageData.containsKey('status')) {
      String oldStatus = _messages[existingIndex].status;
      String newStatus = messageData['status'];

      if ((oldStatus == 'sent' &&
              (newStatus == 'delivered' || newStatus == 'read')) ||
          (oldStatus == 'delivered' && newStatus == 'read')) {
        _messages[existingIndex].status = newStatus;
        _triggerEvent(ChatEventType.messageStatusChanged,
            {'messageId': message.messageId, 'status': newStatus});
        _triggerEvent(ChatEventType.messagesChanged, _messages);
      }
    }
    return;
  }

  // Process for current chat
  if ((message.senderId == _receiverId && message.receiverId == userId) ||
      (message.senderId == userId && message.receiverId == _receiverId)) {
    // Add to messages
    _messages.add(message);

    // If we received a message, mark as delivered and read
    if (message.receiverId == userId && message.senderId == _receiverId) {
      _socket!.emit(_socketEvents.messageDeliveredEvent, {
        'messageId': message.messageId,
        'senderId': message.senderId,
        'receiverId': message.receiverId
      });

      // Mark as read if we're active and auto-mark is enabled
      if (ChatConfig.instance.autoMarkAsRead) {
        WidgetsBinding.instance.addPostFrameCallback((_) {
          markMessagesAsRead();
        });
      }
    }

    _triggerEvent(ChatEventType.messagesChanged, _messages);
  }
}