diff --git a/lib/src/database/database_api.dart b/lib/src/database/database_api.dart index 11a86416..f56ae03b 100644 --- a/lib/src/database/database_api.dart +++ b/lib/src/database/database_api.dart @@ -69,6 +69,8 @@ abstract class DatabaseApi { Future getEventById(int clientId, String eventId, Room room); + bool eventIsKnown(int clientId, String eventId, String roomId); + Future forgetRoom(int clientId, String roomId); Future clearCache(int clientId); diff --git a/lib/src/database/hive_database.dart b/lib/src/database/hive_database.dart index 5f05635c..9be35b14 100644 --- a/lib/src/database/hive_database.dart +++ b/lib/src/database/hive_database.dart @@ -344,6 +344,10 @@ class FamedlySdkHiveDatabase extends DatabaseApi { return Event.fromJson(convertToJson(raw), room); } + @override + bool eventIsKnown(int clientId, String eventId, String roomId) => + _eventsBox.keys.contains(MultiKey(roomId, eventId).toString()); + /// Loads a whole list of events at once from the store for a specific room Future> _getEventsByIds(List eventIds, Room room) => Future.wait(eventIds diff --git a/lib/src/room.dart b/lib/src/room.dart index 7f2c8f68..b6269d5c 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -336,6 +336,15 @@ class Room { return; } + // Do not set old events as state events + final prevEvent = getState(state.type, state.stateKey); + if (prevEvent != null && + prevEvent.eventId != state.eventId && + client.database != null && + client.database.eventIsKnown(client.id, state.eventId, state.roomId)) { + return; + } + states[state.type] ??= {}; states[state.type][state.stateKey ?? ''] = state; }