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