addMessage method
Adds a message to the chat.
Messages are automatically grouped with other messages from the same sender if they are sent within the same minute. This follows the Single Responsibility Principle by handling both message addition and grouping logic.
Returns the MessageGroup that contains the added message.
Implementation
MessageGroup addMessage(Message message) {
// _messages.add(message);
// _messages.sort((a, b) {
// if (a.isFailed == b.isFailed) return 0;
// if (a.isFailed) return 1;
// return -1;
// });
late final MessageGroup messageGroup;
if (_messageGroups.isEmpty ||
_messageGroups.last.isSender != message.isSender ||
!isSameMinute(DateTime.parse(_messageGroups.last.timestamp),
DateTime.parse(message.timestamp))) {
messageGroup = MessageGroup(
name: message.name,
isSender: message.isSender,
timestamp: message.timestamp,
messages: [message],
);
_messageGroups.add(messageGroup);
} else {
messageGroup = _messageGroups.last;
messageGroup.messages.add(message);
}
if (_failedMessageEntries.containsKey(message.id)) {
_failedMessageEntries[message.id] =
_failedMessageEntries[message.id]!.copyWith(
messageGroup: messageGroup,
);
}
if (_failedMessageEntries.isNotEmpty) {
final failedIds = List<String>.from(_failedMessageEntries.keys);
for (final failedId in failedIds) {
final entry = _failedMessageEntries[failedId]!;
final failedMessage =
entry.messageGroup.messages.firstWhere((m) => m.id == failedId);
entry.messageGroup.messages.remove(failedMessage);
if (entry.messageGroup.messages.isEmpty) {
_messageGroups.remove(entry.messageGroup);
}
late final MessageGroup newGroup;
if (_messageGroups.isNotEmpty &&
_messageGroups.last.isSender == failedMessage.isSender) {
newGroup = _messageGroups.last;
newGroup.messages.add(failedMessage);
} else {
newGroup = MessageGroup(
name: failedMessage.name,
isSender: failedMessage.isSender,
timestamp: failedMessage.timestamp,
messages: [failedMessage],
);
_messageGroups.add(newGroup);
}
_failedMessageEntries[failedId] = entry.copyWith(
messageGroup: newGroup,
);
}
}
notifyListeners();
return messageGroup;
}