getRoomList method

  1. @override
Future<List<Room>> getRoomList(
  1. Client client
)
override

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