getRoomList method
Implementation
@override
Future<List<Room>> getRoomList(Client client) =>
runBenchmarked<List<Room>>('Get room list from store', () async {
final rooms = <String, Room>{};
final rawRooms = await _roomsBox.getAllValues();
for (final raw in rawRooms.values) {
// Get the room
final room = Room.fromJson(copyMap(raw), client);
// Add to the list and continue.
rooms[room.id] = room;
}
final roomStatesDataRaws = await _preloadRoomStateBox.getAllValues();
for (final entry in roomStatesDataRaws.entries) {
final keys = TupleKey.fromString(entry.key);
final roomId = keys.parts.first;
final room = rooms[roomId];
if (room == null) {
Logs().w('Found event in store for unknown room', entry.value);
continue;
}
final states = entry.value;
final stateEvents = states.values
.map((raw) => room.membership == Membership.invite
? StrippedStateEvent.fromJson(copyMap(raw))
: Event.fromJson(copyMap(raw), room))
.toList();
for (final state in stateEvents) {
room.setState(state);
}
}
// Get the room account data
final roomAccountDataRaws = await _roomAccountDataBox.getAllValues();
for (final entry in roomAccountDataRaws.entries) {
final keys = TupleKey.fromString(entry.key);
final basicRoomEvent = BasicRoomEvent.fromJson(
copyMap(entry.value),
);
final roomId = keys.parts.first;
if (rooms.containsKey(roomId)) {
rooms[roomId]!.roomAccountData[basicRoomEvent.type] =
basicRoomEvent;
} else {
Logs().w(
'Found account data for unknown room $roomId. Delete now...');
await _roomAccountDataBox
.delete(TupleKey(roomId, basicRoomEvent.type).toString());
}
}
return rooms.values.toList();
});