diff --git a/lib/model/message_list.dart b/lib/model/message_list.dart index 952b00ebbd4..6237bb2702d 100644 --- a/lib/model/message_list.dart +++ b/lib/model/message_list.dart @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; +import '../api/model/events.dart'; import '../api/model/model.dart'; import '../api/route/messages.dart'; import 'content.dart'; @@ -86,6 +87,30 @@ class MessageListView extends ChangeNotifier { notifyListeners(); } + Message applyChangesToMessage(UpdateMessageEvent event, Message oldMessage) { + Map oldMessageJson = oldMessage.toJson(); + + //TODO: What other fields should be edited by the update event? + oldMessageJson["content"] = event.renderedContent; + oldMessageJson["lastEditTimestamp"] = event.editTimestamp; + + return Message.fromJson(oldMessageJson); + } + + void maybeUpdateMessage(UpdateMessageEvent event) { + int oldIdx = messages.indexWhere((m) => m.id == event.messageId); + if (oldIdx == -1) { + return; + } + + Message oldMessage = messages[oldIdx]; + Message newMessage = applyChangesToMessage(event, oldMessage); + + messages.replaceRange(oldIdx, oldIdx+1, [newMessage]); + contents.replaceRange(oldIdx, oldIdx+1, [parseContent(newMessage.content)]); + notifyListeners(); + } + /// Called when the app is reassembled during debugging, e.g. for hot reload. /// /// This will redo from scratch any computations we can, such as parsing diff --git a/lib/model/store.dart b/lib/model/store.dart index d9de7200207..f5121f3da82 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -272,7 +272,9 @@ class PerAccountStore extends ChangeNotifier { } } else if (event is UpdateMessageEvent) { assert(debugLog("server event: update_message ${event.messageId}")); - // TODO handle + for (final view in _messageListViews) { + view.maybeUpdateMessage(event); + } } else if (event is DeleteMessageEvent) { assert(debugLog("server event: delete_message ${event.messageIds}")); // TODO handle