refactor: Add loadHeroUsers method

This makes it possible to await loading the
hero users to correctly
calculate displayname and
avatar.
This commit is contained in:
Krille 2023-12-13 14:28:08 +01:00
parent 53487a5d23
commit 9dc2f825a3
No known key found for this signature in database
2 changed files with 26 additions and 0 deletions

View File

@ -223,6 +223,29 @@ class Room {
return pinned is Iterable ? pinned.map((e) => e.toString()).toList() : []; return pinned is Iterable ? pinned.map((e) => e.toString()).toList() : [];
} }
/// Returns the heroes as `User` objects.
/// This is very useful if you want to make sure that all users are loaded
/// from the database, that you need to correctly calculate the displayname
/// and the avatar of the room.
Future<List<User>> loadHeroUsers() async {
var heroes = summary.mHeroes;
if (heroes == null) {
final directChatMatrixID = this.directChatMatrixID;
if (directChatMatrixID != null) {
heroes = [directChatMatrixID];
}
}
if (heroes == null) return [];
return await Future.wait(heroes.map((hero) async =>
(await requestUser(
hero,
ignoreErrors: true,
)) ??
User(hero, room: this)));
}
/// Returns a localized displayname for this server. If the room is a groupchat /// Returns a localized displayname for this server. If the room is a groupchat
/// without a name, then it will return the localized version of 'Group with Alice' instead /// without a name, then it will return the localized version of 'Group with Alice' instead
/// of just 'Alice' to make it different to a direct chat. /// of just 'Alice' to make it different to a direct chat.

View File

@ -81,6 +81,9 @@ void main() {
stateKey: '', stateKey: '',
)); ));
final heroUsers = await room.loadHeroUsers();
expect(heroUsers.length, 3);
expect(room.id, id); expect(room.id, id);
expect(room.membership, membership); expect(room.membership, membership);
expect(room.notificationCount, notificationCount); expect(room.notificationCount, notificationCount);