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

@ -35,16 +35,18 @@ class RoomChat extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final client = ref.watch(ClientController.provider.notifier);
final replyToMessage = useState<Message?>(null);
final relatedMessage = useState<Message?>(null);
final memberListOpened = useState<bool>(showMembersByDefault);
final relationType = useState(RelationType.reply);
final room = ref.watch(SelectedRoomController.provider);
final userId = ref.watch(ClientStateController.provider)?.userId;
final roomId = ref.watch(
SelectedRoomController.provider.select((value) => value?.metadata?.id),
);
final theme = Theme.of(context);
final danger = theme.colorScheme.error;
if (room == null || userId == null || room.metadata?.id == null) {
if (roomId == null || userId == null) {
return Center(
child: Text(
"Nothing to see here...",
@ -53,7 +55,7 @@ class RoomChat extends HookConsumerWidget {
);
}
final controllerProvider = RoomChatController.provider(room.metadata!.id);
final controllerProvider = RoomChatController.provider(roomId);
final notifier = ref.watch(controllerProvider.notifier);
List<PopupMenuEntry> getMessageOptions(Message message) {
@ -61,7 +63,7 @@ class RoomChat extends HookConsumerWidget {
return [
PopupMenuItem(
onTap: () {
replyToMessage.value = message;
relatedMessage.value = message;
relationType.value = RelationType.reply;
},
child: ListTile(leading: Icon(Icons.reply), title: Text("Reply")),
@ -69,7 +71,7 @@ class RoomChat extends HookConsumerWidget {
if (message is TextMessage && isSentByMe)
PopupMenuItem(
onTap: () {
replyToMessage.value = message;
relatedMessage.value = message;
relationType.value = RelationType.edit;
},
child: ListTile(leading: Icon(Icons.edit), title: Text("Edit")),
@ -153,10 +155,9 @@ class RoomChat extends HookConsumerWidget {
),
TextButton(
onPressed: () {
if (room.metadata == null) return;
client.reportEvent(
ReportRequest(
roomId: room.metadata!.id,
roomId: roomId,
eventId: message.id,
reason: reasonController.text.isEmpty
? null
@ -189,7 +190,6 @@ class RoomChat extends HookConsumerWidget {
return Scaffold(
appBar: RoomAppbar(
room,
isDesktop: isDesktop,
onOpenDrawer: (_) => Scaffold.of(context).openDrawer(),
onOpenMemberList: (thisContext) {
@ -237,18 +237,41 @@ class RoomChat extends HookConsumerWidget {
chatAnimatedListBuilder: (_, itemBuilder) =>
ChatAnimatedList(
itemBuilder: itemBuilder,
onEndReached: room.hasMore
onEndReached:
ref.watch(
SelectedRoomController.provider.select(
(room) => room?.hasMore == true,
),
)
? notifier.loadOlder
: null,
onStartReached: () => client.markRead(room),
onStartReached: () async {
final room = ref.watch(
SelectedRoomController.provider,
);
return room == null
? null
: await client.markRead(room);
},
bottomPadding: 72,
),
composerBuilder: (_) => ChatBox(
onSend:
(
text, {
required shouldMention,
required tags,
}) => notifier.send(
text,
tags: tags,
relationType: relationType.value,
shouldMention: shouldMention,
relation: relatedMessage.value,
),
relationType: relationType.value,
relatedMessage: replyToMessage.value,
onDismiss: () => replyToMessage.value = null,
room: room,
relatedMessage: relatedMessage.value,
onDismiss: () => relatedMessage.value = null,
),
textMessageBuilder:
@ -259,7 +282,6 @@ class RoomChat extends HookConsumerWidget {
required bool isSentByMe,
MessageGroupStatus? groupStatus,
}) => TextMessageWrapper(
room: room,
message,
content: message.text,
groupStatus: groupStatus,
@ -277,7 +299,6 @@ class RoomChat extends HookConsumerWidget {
MessageGroupStatus? groupStatus,
}) => TextMessageWrapper(
message,
room: room,
content: message.text,
groupStatus: groupStatus,
onTapReply: notifier.scrollToMessage,
@ -309,7 +330,6 @@ class RoomChat extends HookConsumerWidget {
),
child: FlyerChatFileMessage(
topWidget: ReplyWidget(
room: room,
message,
onTapReply: notifier.scrollToMessage,
groupStatus: groupStatus,
@ -319,7 +339,6 @@ class RoomChat extends HookConsumerWidget {
),
),
groupStatus,
room,
),
systemMessageBuilder:
@ -358,11 +377,11 @@ class RoomChat extends HookConsumerWidget {
),
if (memberListOpened.value == true && showMembersByDefault)
MemberList(room),
MemberList(),
],
),
endDrawer: showMembersByDefault ? null : MemberList(room),
endDrawer: showMembersByDefault ? null : MemberList(),
);
}
}