updateMessage method

void updateMessage(
  1. Message message
)

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

Implementation

void updateMessage(Message message) {
  // Determine if the message should be displayed in the channel view.
  if (message.parentId == null || message.showInChannel == true) {
    // Create a new list of messages to avoid modifying the original
    // list directly.
    var newMessages = [...messages];
    final oldIndex = newMessages.indexWhere((m) => m.id == message.id);

    if (oldIndex != -1) {
      // If the message already exists, prepare it for update.
      final oldMessage = newMessages[oldIndex];
      var updatedMessage = message.syncWith(oldMessage);

      // Preserve quotedMessage if the update doesn't include a new
      // quotedMessage.
      if (message.quotedMessageId != null &&
          message.quotedMessage == null &&
          oldMessage.quotedMessage != null) {
        updatedMessage = updatedMessage.copyWith(
          quotedMessage: oldMessage.quotedMessage,
        );
      }

      // Update the message in the list.
      newMessages[oldIndex] = updatedMessage;

      // Update quotedMessage references in all messages.
      newMessages = newMessages.map((it) {
        // Skip if the current message does not quote the updated message.
        if (it.quotedMessageId != message.id) return it;

        // Update the quotedMessage only if the updatedMessage indicates
        // deletion.
        if (message.type == 'deleted') {
          return it.copyWith(
            quotedMessage: updatedMessage.copyWith(
              type: message.type,
              deletedAt: message.deletedAt,
            ),
          );
        }
        return it;
      }).toList();
    } else {
      // If the message is new, add it to the list.
      newMessages.add(message);
    }

    // Handle updates to pinned messages.
    final newPinnedMessages = _updatePinnedMessages(message);

    // Apply the updated lists to the channel state.
    _channelState = _channelState.copyWith(
      messages: newMessages.sorted(_sortByCreatedAt),
      pinnedMessages: newPinnedMessages,
      channel: _channelState.channel?.copyWith(
        lastMessageAt: message.createdAt,
      ),
    );
  }

  // If the message is part of a thread, update thread information.
  if (message.parentId != null) {
    updateThreadInfo(message.parentId!, [message]);
  }
}