add room directory support

This commit is contained in:
Henry Hiles 2026-11-04 12:43:01 -05:00
commit e382499a2a
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 868 additions and 245 deletions

View file

@ -36,6 +36,7 @@ import "package:nexus/models/requests/get_related_events.dart";
import "package:nexus/models/requests/get_room_state.dart";
import "package:nexus/models/requests/get_specific_room_state.dart";
import "package:nexus/models/requests/get_space_hierarchy.dart";
import "package:nexus/models/requests/get_room_directory.dart";
import "package:nexus/models/requests/join_room.dart";
import "package:nexus/models/profile_response.dart";
import "package:nexus/models/push_notification.dart";
@ -57,6 +58,7 @@ import "package:nexus/models/requests/set_state.dart";
import "package:nexus/models/requests/update_push_rule.dart";
import "package:nexus/models/requests/upload_media.dart";
import "package:nexus/models/room.dart";
import "package:nexus/models/room_directory.dart";
import "package:nexus/models/room_summary.dart";
import "package:nexus/models/space_hierarchy.dart";
import "package:nexus/models/spec_versions_response.dart";
@ -311,6 +313,11 @@ class ClientController(final String? accountId) extends AsyncNotifier<int> {
) async =>
.fromJson(await _sendCommand("get_space_hierarchy", request.toJson()));
Future<RoomDirectory> getRoomDirectory(
GetRoomDirectoryRequest request,
) async =>
.fromJson(await _sendCommand("get_room_directory", request.toJson()));
Future<RoomSummary> getRoomSummary(JoinRoomRequest request) async =>
.fromJson(await _sendCommand("get_room_summary", request.toJson()));

View file

@ -0,0 +1,39 @@
import "package:flutter_riverpod/experimental/mutation.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/client.dart";
import "package:nexus/models/room_directory.dart";
/// The public room directory of a server, or of the user's own if null.
class RoomDirectoryController(final String? server)
extends AsyncNotifier<RoomDirectory> {
@override
Future<RoomDirectory> build() => ref
.read(ClientController.provider.notifier)
.getRoomDirectory(.new(server: server));
Future<void> loadMore() async {
final current = await future;
if (current.nextBatch == null) return;
final next = await ref
.read(ClientController.provider.notifier)
.getRoomDirectory(.new(server: server, since: current.nextBatch));
if (!ref.mounted) return;
state = AsyncData(
current.copyWith(
rooms: current.rooms.addAll(next.rooms),
nextBatch: next.nextBatch,
),
);
}
/// Loading the next page of a directory, keyed by its server
static final loadMoreMutation = Mutation<void>();
static final provider = AsyncNotifierProvider.family
.autoDispose<RoomDirectoryController, RoomDirectory, String?>(
RoomDirectoryController.new,
);
}