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.
This commit is contained in:
Christian Pauly 2022-03-31 12:57:47 +02:00
parent f8eee4f4f1
commit 117baecfb1
2 changed files with 20 additions and 7 deletions

View File

@ -1275,8 +1275,7 @@ class Room {
void Function()? onUpdate, void Function()? onUpdate,
}) async { }) async {
await postLoad(); await postLoad();
var events; final events = await client.database?.getEventList(
events = await client.database?.getEventList(
this, this,
limit: defaultHistoryCount, limit: defaultHistoryCount,
) ?? ) ??
@ -1288,13 +1287,20 @@ class Room {
for (var i = 0; i < events.length; i++) { for (var i = 0; i < events.length; i++) {
if (events[i].type == EventTypes.Encrypted && if (events[i].type == EventTypes.Encrypted &&
events[i].content['can_request_session'] == true) { events[i].content['can_request_session'] == true) {
events[i] = await client.encryption events[i] = await client.encryption!
?.decryptRoomEvent(id, events[i], store: true); .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( final timeline = Timeline(
room: this, room: this,
events: events, events: events,
@ -1303,9 +1309,6 @@ class Room {
onInsert: onInsert, onInsert: onInsert,
onUpdate: onUpdate, onUpdate: onUpdate,
); );
if (client.database == null) {
await requestHistory(historyCount: 10);
}
return timeline; return timeline;
} }

View File

@ -85,6 +85,16 @@ class Timeline {
limit: Room.defaultHistoryCount, limit: Room.defaultHistoryCount,
); );
if (eventsFromStore != null && eventsFromStore.isNotEmpty) { 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); events.addAll(eventsFromStore);
final startIndex = events.length - eventsFromStore.length; final startIndex = events.length - eventsFromStore.length;
final endIndex = events.length; final endIndex = events.length;