From 88ba2d303e82c600dbb0410eb468e5aa3274bd03 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Sun, 19 Apr 2020 14:16:35 +0200 Subject: [PATCH] Handles messages update events --- lib/helpers/conversations_helper.dart | 4 +--- ...conversation_messages_database_helper.dart | 23 ------------------- lib/helpers/events_helper.dart | 7 ++++++ lib/helpers/websocket_helper.dart | 6 +++++ lib/lists/conversation_messages_list.dart | 6 +++++ lib/ui/screens/conversation_screen.dart | 23 +++++++++---------- 6 files changed, 31 insertions(+), 38 deletions(-) diff --git a/lib/helpers/conversations_helper.dart b/lib/helpers/conversations_helper.dart index ac801fd..62f426d 100644 --- a/lib/helpers/conversations_helper.dart +++ b/lib/helpers/conversations_helper.dart @@ -342,9 +342,7 @@ class ConversationsHelper { if (response.code != 200) return false; - // Update the message content locally - return await _conversationMessagesDatabaseHelper.updateMessageContent( - id: id, newContent: newContent); + return true; } /// Delete permanently a message specified by its [id] diff --git a/lib/helpers/database/conversation_messages_database_helper.dart b/lib/helpers/database/conversation_messages_database_helper.dart index 1a81cd6..7a30f95 100644 --- a/lib/helpers/database/conversation_messages_database_helper.dart +++ b/lib/helpers/database/conversation_messages_database_helper.dart @@ -2,7 +2,6 @@ import 'package:comunic/helpers/database/database_contract.dart'; import 'package:comunic/helpers/database/model_database_helper.dart'; import 'package:comunic/lists/conversation_messages_list.dart'; import 'package:comunic/models/conversation_message.dart'; -import 'package:meta/meta.dart'; /// Conversation messages database helper /// @@ -35,26 +34,4 @@ class ConversationMessagesDatabaseHelper finalList.addAll(list); return finalList; } - - /// Update the content of a message - Future updateMessageContent({ - @required int id, - @required String newContent, - }) async { - assert(id != null); - assert(newContent != null); - - final message = await get(id); - - if(message == null) - return false; - - // Update the conversation message using the map - final map = message.toMap(); - map[ConversationsMessagesTableContract.C_MESSAGE] = newContent; - - await insertOrUpdate(ConversationMessage.fromMap(map)); - - return true; // Success - } } diff --git a/lib/helpers/events_helper.dart b/lib/helpers/events_helper.dart index 093f3af..d486617 100644 --- a/lib/helpers/events_helper.dart +++ b/lib/helpers/events_helper.dart @@ -53,6 +53,13 @@ class NewConversationMessageEvent { NewConversationMessageEvent(this.msg); } +/// Updated conversation message +class UpdatedConversationMessageEvent { + final ConversationMessage msg; + + UpdatedConversationMessageEvent(this.msg); +} + class EventsHelper { static EventBus _mgr = EventBus(); diff --git a/lib/helpers/websocket_helper.dart b/lib/helpers/websocket_helper.dart index e8c579c..da25a7d 100644 --- a/lib/helpers/websocket_helper.dart +++ b/lib/helpers/websocket_helper.dart @@ -144,6 +144,12 @@ class WebSocketHelper { ConversationsHelper.apiToConversationMessage(msg.data))); break; + // Update conversation message content + case "updated_conv_message": + EventsHelper.emit(UpdatedConversationMessageEvent( + ConversationsHelper.apiToConversationMessage(msg.data))); + break; + default: throw Exception("Unknown message type: ${msg.title}"); } diff --git a/lib/lists/conversation_messages_list.dart b/lib/lists/conversation_messages_list.dart index 8eacd5b..7a5aad8 100644 --- a/lib/lists/conversation_messages_list.dart +++ b/lib/lists/conversation_messages_list.dart @@ -48,4 +48,10 @@ class ConversationMessagesList extends ListBase { if (message.id < firstMessageID) firstMessageID = message.id; return firstMessageID; } + + /// Replace a message by another one (if any) + void replace(ConversationMessage msg) { + final index = this.indexWhere((t) => t.id == msg.id); + if (index >= 0) this[index] = msg; + } } diff --git a/lib/ui/screens/conversation_screen.dart b/lib/ui/screens/conversation_screen.dart index 4a75eb5..e643b25 100644 --- a/lib/ui/screens/conversation_screen.dart +++ b/lib/ui/screens/conversation_screen.dart @@ -86,8 +86,17 @@ class _ConversationScreenState extends SafeState { .registerConversationEvents(widget.conversationID); this.listen((ev) async { - await _conversationsHelper.saveMessage(ev.msg); - await _applyNewMessages(ConversationMessagesList()..add(ev.msg)); + if (ev.msg.conversationID == widget.conversationID) { + await _conversationsHelper.saveMessage(ev.msg); + await _applyNewMessages(ConversationMessagesList()..add(ev.msg)); + } + }); + + this.listen((ev) async { + if (ev.msg.conversationID == widget.conversationID) { + await _conversationsHelper.saveMessage(ev.msg); + setState(() => _messages.replace(ev.msg)); + } }); } @@ -406,16 +415,6 @@ class _ConversationScreenState extends SafeState { showSimpleSnack(context, tr("Could not update message content!")); return; } - - // Get the new version of the conversation message - final newMessage = - await _conversationsHelper.getSingleMessageFromCache(message.id); - - setState(() { - final index = _messages.indexOf(message); - _messages.insert(index, newMessage); - _messages.removeAt(index + 1); - }); } /// Request message deletion