spaceRelationsOverviewProvider top-level property

dynamic spaceRelationsOverviewProvider
final

Get the SpaceRelationsOverview of related SpaceItem for the space. Errors if the space or any related space isn’t found. Stays up to date with underlying client data if a space was found.

Implementation

final spaceRelationsOverviewProvider =
    FutureProvider.family<SpaceRelationsOverview, String>((ref, spaceId) async {
  final relatedSpaces = await ref.watch(spaceRelationsProvider(spaceId).future);
  if (relatedSpaces == null) {
    throw SpaceNotFound;
  }
  bool hasMore = false;
  final List<String> knownSubspaces = [];
  final List<String> knownChats = [];
  final List<String> suggested = [];
  for (final related in relatedSpaces.children()) {
    String targetType = related.targetType();
    final roomId = related.roomId().toString();
    if (related.suggested()) {
      suggested.add(roomId);
    }
    final room = ref.watch(maybeRoomProvider(roomId)).valueOrNull;
    if (room == null || !room.isJoined()) {
      // we don’t know this room or are not in it
      hasMore = true;
      continue;
    }

    if (targetType == 'ChatRoom') {
      // we know this as a chat room
      knownChats.add(roomId);
    } else {
      // this must be some space.
      knownSubspaces.add(roomId);
    }
  }

  Space? mainParent;
  final mainSpace = relatedSpaces.mainParent();
  if (mainSpace != null) {
    if (mainSpace.targetType() != 'ChatRoom') {
      final roomId = mainSpace.roomId().toString();
      try {
        final space = await ref.watch(spaceProvider(roomId).future);
        if (space.isJoined()) mainParent = space;
      } catch (e, s) {
        _log.severe('Loading main Parent of $spaceId failed', e, s);
      }
    }
  }

  List<Space> parents = [];
  for (final related in relatedSpaces.otherParents()) {
    if (related.targetType() != 'ChatRoom') {
      final roomId = related.roomId().toString();
      try {
        final space = await ref.watch(spaceProvider(roomId).future);
        if (space.isJoined()) parents.add(space);
      } catch (e, s) {
        _log.severe('Loading other Parents of $spaceId failed', e, s);
      }
    }
  }
  return SpaceRelationsOverview(
    rel: relatedSpaces,
    parents: parents,
    knownChats: knownChats,
    knownSubspaces: knownSubspaces,
    otherRelations: [],
    mainParent: mainParent,
    hasMore: hasMore,
    suggestedIds: suggested,
  );
});