52 lines
1.7 KiB
Dart
52 lines
1.7 KiB
Dart
import "package:fast_immutable_collections/fast_immutable_collections.dart";
|
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
|
import "package:nexus/controllers/client_controller.dart";
|
|
import "package:nexus/controllers/client_state_controller.dart";
|
|
import "package:nexus/controllers/selected_room_controller.dart";
|
|
import "package:nexus/models/membership.dart";
|
|
import "package:nexus/models/requests/get_room_state_request.dart";
|
|
|
|
class MembersController extends AsyncNotifier<IList<Membership>> {
|
|
@override
|
|
Future<IList<Membership>> build() async {
|
|
final data = ref.watch(
|
|
SelectedRoomController.provider.select(
|
|
(value) => value?.metadata == null
|
|
? null
|
|
: (value!.metadata!.id, value.metadata!.hasMemberList),
|
|
),
|
|
);
|
|
if (data == null) return const IList.empty();
|
|
|
|
final state = await ref
|
|
.watch(ClientController.provider.notifier)
|
|
.getRoomState(
|
|
GetRoomStateRequest(
|
|
roomId: data.$1,
|
|
fetchMembers: data.$2 == false,
|
|
includeMembers: true,
|
|
),
|
|
);
|
|
|
|
return state.nonNulls
|
|
.where((state) => state.type == "m.room.member")
|
|
.map(
|
|
(membership) => Membership.fromContent(
|
|
membership.content,
|
|
membership.stateKey!,
|
|
ref.watch(
|
|
ClientStateController.provider.select(
|
|
(value) => value?.homeserverUrl,
|
|
),
|
|
) ??
|
|
"",
|
|
),
|
|
)
|
|
.toIList();
|
|
}
|
|
|
|
static final provider =
|
|
AsyncNotifierProvider<MembersController, IList<Membership>>(
|
|
MembersController.new,
|
|
);
|
|
}
|