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