From 117baecfb1925d58b96aef800a8c33865453c5ec Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Thu, 31 Mar 2022 12:57:47 +0200 Subject: [PATCH] fix: Post load all users on room opening When opening a room we need to fetch all users from the database. Otherwise we would need to update the timeline per user after creation which should be much slower. --- lib/src/room.dart | 17 ++++++++++------- lib/src/timeline.dart | 10 ++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/src/room.dart b/lib/src/room.dart index 81c1fb37..c6a1d1e1 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1275,8 +1275,7 @@ class Room { void Function()? onUpdate, }) async { await postLoad(); - var events; - events = await client.database?.getEventList( + final events = await client.database?.getEventList( this, limit: defaultHistoryCount, ) ?? @@ -1288,13 +1287,20 @@ class Room { for (var i = 0; i < events.length; i++) { if (events[i].type == EventTypes.Encrypted && events[i].content['can_request_session'] == true) { - events[i] = await client.encryption - ?.decryptRoomEvent(id, events[i], store: true); + events[i] = await client.encryption! + .decryptRoomEvent(id, events[i], store: true); } } }); } + // Fetch all users from database we have got here. + for (final event in events) { + if (getState(EventTypes.RoomMember, event.senderId) != null) continue; + final dbUser = await client.database?.getUser(event.senderId, this); + if (dbUser != null) setState(dbUser); + } + final timeline = Timeline( room: this, events: events, @@ -1303,9 +1309,6 @@ class Room { onInsert: onInsert, onUpdate: onUpdate, ); - if (client.database == null) { - await requestHistory(historyCount: 10); - } return timeline; } diff --git a/lib/src/timeline.dart b/lib/src/timeline.dart index 7324b106..3b793a8f 100644 --- a/lib/src/timeline.dart +++ b/lib/src/timeline.dart @@ -85,6 +85,16 @@ class Timeline { limit: Room.defaultHistoryCount, ); if (eventsFromStore != null && eventsFromStore.isNotEmpty) { + // Fetch all users from database we have got here. + for (final event in events) { + if (room.getState(EventTypes.RoomMember, event.senderId) != null) { + continue; + } + final dbUser = + await room.client.database?.getUser(event.senderId, room); + if (dbUser != null) room.setState(dbUser); + } + events.addAll(eventsFromStore); final startIndex = events.length - eventsFromStore.length; final endIndex = events.length;