From 164a95ea29a2a2def514429e26199c76043ba503 Mon Sep 17 00:00:00 2001 From: Jayesh Nirve Date: Tue, 17 Aug 2021 20:48:14 +0530 Subject: [PATCH] clean stuff up? --- lib/src/client.dart | 11 +++++--- lib/src/database/hive_database.dart | 39 +++++++++++++---------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index 385d1ad9..e9ab8fbe 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -1536,10 +1536,13 @@ sort order of ${prevState.sortOrder}. This should never happen...'''); ), ); } else { - if (stateEvent.relationshipType != RelationshipTypes.edit - || {room.lastEvent.eventId,room.lastEvent.relationshipEventId} - .contains(stateEvent.relationshipEventId)) { - room.setState(stateEvent); + if (stateEvent.type != EventTypes.Message || + stateEvent.relationshipType != RelationshipTypes.edit || + stateEvent.relationshipEventId == room.lastEvent.eventId || + ((room.lastEvent.relationshipType == RelationshipTypes.edit && + stateEvent.relationshipEventId == + room.lastEvent.relationshipEventId))) { + room.setState(stateEvent); } } break; diff --git a/lib/src/database/hive_database.dart b/lib/src/database/hive_database.dart index b381e128..0df679df 100644 --- a/lib/src/database/hive_database.dart +++ b/lib/src/database/hive_database.dart @@ -851,29 +851,24 @@ class FamedlySdkHiveDatabase extends DatabaseApi { eventUpdate.content['type'], ).toString(); final Map stateMap = await _roomStateBox.get(key) ?? {}; - stateMap[eventUpdate.content['state_key']] = eventUpdate.content; - final room = Room( - id: eventUpdate.roomID, - ); - final Map states = await _roomStateBox - .get(MultiKey(eventUpdate.roomID, EventTypes.Message).toString()); - final eventsInRoomStateBox = states?.values - ?.map((raw) => Event.fromJson(convertToJson(raw), room)) - ?.toList(); - if (eventsInRoomStateBox != null) { - for (final event in eventsInRoomStateBox) { - if (event.type == 'm.room.message') { - stateMap.values.first['content']['m.relates_to'] == null - ? await _roomStateBox.put(key, stateMap) - : {event.eventId, event.relationshipEventId}.contains(stateMap - .values.first['content']['m.relates_to']['event_id']) - ? await _roomStateBox.put(key, stateMap) - : null; - } else { - await _roomStateBox.put(key, stateMap); - } - } + // store state events and new messages, that either are not an edit or an edit of the lastest message + // An edit is an event, that has an edit relation to the latest event. In some cases for the second edit, we need to compare if both have an edit relation to the same event instead. + if (!eventUpdate.content['content'].containsKey('m.relates_to')) { + stateMap[eventUpdate.content['state_key']] = eventUpdate.content; await _roomStateBox.put(key, stateMap); + } else { + final String editedEventRelationshipEventId = + eventUpdate.content['content']['m.relates_to']['event_id']; + if (eventUpdate.content['type'] != EventTypes.Message || + eventUpdate.content['content']['m.relates_to']['rel_type'] != + RelationshipTypes.edit || + editedEventRelationshipEventId == stateMap['']?.eventId || + ((stateMap['']?.relationshipType == RelationshipTypes.edit && + editedEventRelationshipEventId == + stateMap['']?.relationshipEventId))) { + stateMap[eventUpdate.content['state_key']] = eventUpdate.content; + await _roomStateBox.put(key, stateMap); + } } } }