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,
}) 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;
}

View File

@ -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;