don't pass room around, use many watches

This commit is contained in:
Henry Hiles 2026-03-29 14:14:11 -04:00
commit 60be7aaf72
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
15 changed files with 207 additions and 231 deletions

View file

@ -1,31 +1,31 @@
import "dart:async";
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/members_controller.dart";
import "package:nexus/models/configs/author_config.dart";
import "package:nexus/models/membership.dart";
class AuthorController extends AsyncNotifier<Membership> {
final AuthorConfig config;
AuthorController(this.config);
final Message message;
AuthorController(this.message);
@override
Future<Membership> build() async {
final member = await ref.watch(
MembersController.provider(config.room).selectAsync(
MembersController.provider.selectAsync(
(value) => value.firstWhereOrNull(
(membership) => membership.userId == config.message.authorId,
(membership) => membership.userId == message.authorId,
),
),
);
final pmp = config.message.metadata?["pmp"] == null
final pmp = message.metadata?["pmp"] == null
? null
: Membership.fromContent(
IMap(config.message.metadata?["pmp"]),
config.message.authorId,
IMap(message.metadata?["pmp"]),
message.authorId,
ref.watch(
ClientStateController.provider.select(
(value) => value?.homeserverUrl,
@ -39,12 +39,13 @@ class AuthorController extends AsyncNotifier<Membership> {
displayName:
pmp?.displayName ??
member?.displayName ??
config.message.authorId.substring(1).split(":").first,
userId: config.message.authorId,
message.authorId.substring(1).split(":").first,
userId: message.authorId,
);
}
static final provider = AsyncNotifierProvider.family<AuthorController, Membership, AuthorConfig>(
static final provider =
AsyncNotifierProvider.family<AuthorController, Membership, Message>(
AuthorController.new,
);
}

View file

@ -2,24 +2,28 @@ 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";
import "package:nexus/models/room.dart";
class MembersController extends AsyncNotifier<IList<Membership>> {
final Room room;
MembersController(this.room);
@override
Future<IList<Membership>> build() async {
if (room.metadata == null) return const IList.empty();
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: room.metadata!.id,
fetchMembers: room.metadata!.hasMemberList == false,
roomId: data.$1,
fetchMembers: data.$2 == false,
includeMembers: true,
),
);
@ -42,7 +46,7 @@ class MembersController extends AsyncNotifier<IList<Membership>> {
}
static final provider =
AsyncNotifierProvider.family<MembersController, IList<Membership>, Room>(
AsyncNotifierProvider<MembersController, IList<Membership>>(
MembersController.new,
);
}

View file

@ -223,13 +223,13 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
}
Future<void> send(
String message, {
String text, {
bool shouldMention = true,
required Iterable<Tag> tags,
required IList<Tag> tags,
required RelationType relationType,
Message? relation,
}) async {
var taggedMessage = message;
var taggedMessage = text;
for (final tag in tags) {
final escaped = RegExp.escape(tag.id);