updateMessage method

void updateMessage(
  1. Message message
)

Updates the message in the state if it exists. Adds it otherwise.

Implementation

void updateMessage(Message message) {
  // Regular messages, which are shown in channel.
  if (message.parentId == null || message.showInChannel == true) {
    var newMessages = [...messages];
    final oldIndex = newMessages.indexWhere((m) => m.id == message.id);
    if (oldIndex != -1) {
      final oldMessage = newMessages[oldIndex];
      var updatedMessage = message.syncWith(oldMessage);
      // Add quoted message to the message if it is not present.
      if (message.quotedMessageId != null && message.quotedMessage == null) {
        updatedMessage = updatedMessage.copyWith(
          quotedMessage: oldMessage.quotedMessage,
        );
      }
      newMessages[oldIndex] = updatedMessage;

      // Update quoted message reference for every message if available.
      newMessages = [...newMessages].map((it) {
        // Early return if the message doesn't have a quoted message.
        if (it.quotedMessageId != message.id) return it;

        // Setting it to null will remove the quoted message from the message
        // So, we are setting the same message but with the deleted state.
        return it.copyWith(
          quotedMessage: updatedMessage.copyWith(
            type: 'deleted',
            deletedAt: DateTime.now(),
          ),
        );
      }).toList();
    } else {
      newMessages.add(message);
    }

    final newPinnedMessages = [...pinnedMessages];
    final oldPinnedIndex =
        newPinnedMessages.indexWhere((m) => m.id == message.id);

    // Handle pinned messages
    if (message.pinned) {
      if (oldPinnedIndex != -1) {
        newPinnedMessages[oldPinnedIndex] = message;
      } else {
        newPinnedMessages.add(message);
      }
    } else {
      newPinnedMessages.removeWhere((m) => m.id == message.id);
    }

    _channelState = _channelState.copyWith(
      messages: newMessages.sorted(_sortByCreatedAt),
      pinnedMessages: newPinnedMessages,
      channel: _channelState.channel?.copyWith(
        lastMessageAt: message.createdAt,
      ),
    );
  }

  // Thread messages, which are shown in thread page.
  if (message.parentId != null) {
    updateThreadInfo(message.parentId!, [message]);
  }
}