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