addMessage method

MessageGroup addMessage(
  1. Message 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,
      );
    }
  }
  if (message.isRead == false) {
    _unreadMessageIds.add(message.id);
  } else if (message.isRead == true) {
    _unreadMessageIds.remove(message.id);
  }
  notifyListeners();
  return messageGroup;
}