From 50c56206dbc8e128bbd20e8b71a5db352aaef9fc Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Wed, 3 Dec 2025 16:28:07 -0500 Subject: [PATCH] Subspace support --- README.md | 2 +- lib/controllers/spaces_controller.dart | 13 ++-------- lib/helpers/extensions/room_to_children.dart | 26 ++++++++++++++++++++ 3 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 lib/helpers/extensions/room_to_children.dart diff --git a/README.md b/README.md index 33737a5..2a708d9 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ A simple and user-friendly Matrix client made with Flutter and the Matrix Dart S - [ ] From space - [ ] Exploring - [x] Leaving - - [ ] Subspaces + - [x] Subspaces - [x] Messages - [x] Sending - [x] Plain text diff --git a/lib/controllers/spaces_controller.dart b/lib/controllers/spaces_controller.dart index 92e0d5d..de0d873 100644 --- a/lib/controllers/spaces_controller.dart +++ b/lib/controllers/spaces_controller.dart @@ -1,9 +1,9 @@ -import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/helpers/extensions/get_full_room.dart"; +import "package:nexus/helpers/extensions/room_to_children.dart"; import "package:nexus/models/space.dart"; class SpacesController extends AsyncNotifier> { @@ -60,16 +60,7 @@ class SpacesController extends AsyncNotifier> { avatar: space.avatar, id: space.roomData.id, roomData: space.roomData, - children: await Future.wait( - space.roomData.spaceChildren - .map( - (child) => client.rooms.firstWhereOrNull( - (room) => room.id == child.roomId, - ), - ) - .nonNulls - .map((room) => room.fullRoom), - ), + children: await space.roomData.getAllChildren(client), ), ), )), diff --git a/lib/helpers/extensions/room_to_children.dart b/lib/helpers/extensions/room_to_children.dart new file mode 100644 index 0000000..039a064 --- /dev/null +++ b/lib/helpers/extensions/room_to_children.dart @@ -0,0 +1,26 @@ +import "package:collection/collection.dart"; +import "package:matrix/matrix.dart"; +import "package:nexus/helpers/extensions/get_full_room.dart"; +import "package:nexus/models/full_room.dart"; + +extension RoomToChildren on Room { + Future> getAllChildren(Client client) async { + final direct = await Future.wait( + spaceChildren + .map( + (child) => client.rooms + .firstWhereOrNull((r) => r.id == child.roomId) + ?.fullRoom, + ) + .nonNulls, + ); + + return (await Future.wait( + direct.map( + (child) async => child.roomData.isSpace + ? await child.roomData.getAllChildren(client) + : [child], + ), + )).expand((list) => list).toList(); + } +}