make RoomChatController family take an event ID

This commit is contained in:
Henry Hiles 2026-09-25 12:34:15 -04:00
commit 66bb820a59
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 27 additions and 17 deletions

View file

@ -17,9 +17,11 @@ import "package:nexus/models/requests/send_message.dart";
import "package:nexus/models/room.dart";
import "package:nexus/models/room_chat.dart";
class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
class RoomChatController(final (String roomId, String? withEventId) info)
extends AsyncNotifier<RoomChat?> {
@override
Future<RoomChat?> build() async {
final (roomId, eventId) = info;
final client = ref.read(ClientController.provider.notifier);
final room = ref.watch(
RoomsController.provider.select((rooms) => rooms[roomId]),
@ -64,7 +66,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
.redactEvent(
RedactEventRequest(
eventId: event.eventId,
roomId: roomId,
roomId: info.$1,
reason: reason,
),
);
@ -75,14 +77,14 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
state = .loading();
final timelineKeys = ref
.read(RoomsController.provider.select((value) => value[roomId]))
.read(RoomsController.provider.select((value) => value[info.$1]))
?.timeline
.keys;
final response = await ref
.read(ClientController.provider.notifier)
.paginate(
.new(
roomId: roomId,
roomId: info.$1,
maxTimelineId: timelineKeys?.isNotEmpty == true
? timelineKeys?.reduce(min)
: null,
@ -97,7 +99,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
.read(RoomsController.provider.notifier)
.update(
IMap({
roomId: Room(
info.$1: Room(
events: IMap.fromIterable(
response.events.addAll(response.relatedEvents),
keyMapper: (event) => event.rowId,
@ -126,7 +128,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
if (relationType == .edit) {
baseContent = relation?.content;
} else {
final provider = AttachmentController.provider(roomId);
final provider = AttachmentController.provider(info.$1);
baseContent = ref.read(provider)?.$2;
ref.invalidate(provider);
}
@ -146,7 +148,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
final client = ref.read(ClientController.provider.notifier);
final event = await client.sendMessage(
SendMessageRequest(
roomId: roomId,
roomId: info.$1,
baseContent: baseContent,
mentions: Mentions(
userIds: [
@ -168,7 +170,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
.read(RoomsController.provider.notifier)
.update(
.new({
roomId: .new(
info.$1: .new(
events: .new({event.rowId: event}),
clientSticky: .new({event.rowId}),
),
@ -185,7 +187,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
final client = ref.read(ClientController.provider.notifier);
final allReactionEvents = await client.getRelatedEvents(
.new(
roomId: roomId,
roomId: info.$1,
eventId: event.eventId,
relationType: "m.annotation",
),
@ -206,7 +208,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
if (reactionEvent != null) {
await ref
.watch(ClientController.provider.notifier)
.redactEvent(.new(eventId: reactionEvent.eventId, roomId: roomId));
.redactEvent(.new(eventId: reactionEvent.eventId, roomId: info.$1));
}
}
@ -215,7 +217,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
await client.sendEvent(
.new(
roomId: roomId,
roomId: info.$1,
type: EventType.reaction.type,
content: ReactionContent(key: reaction),
synchronous: true,
@ -227,7 +229,7 @@ class RoomChatController(final String roomId) extends AsyncNotifier<RoomChat?> {
}
static final provider = AsyncNotifierProvider.family
.autoDispose<RoomChatController, RoomChat?, String>(
.autoDispose<RoomChatController, RoomChat?, (String, String?)>(
RoomChatController.new,
);
}

View file

@ -27,7 +27,9 @@ extension BuildEventOptions on Event {
final theme = Theme.of(context);
final danger = theme.colorScheme.error;
final notifier = ref.read(RoomChatController.provider(roomId).notifier);
final notifier = ref.read(
RoomChatController.provider((roomId, null)).notifier,
);
final client = ref.read(ClientController.provider.notifier);
final isPinned = ref

View file

@ -64,8 +64,10 @@ class const ReactionRow(final Event event, {super.key}) extends ConsumerWidget {
enabled.value = false;
try {
final controller = ref.watch(
RoomChatController.provider(event.roomId)
.notifier,
RoomChatController.provider((
event.roomId,
null,
)).notifier,
);
if (selected) {

View file

@ -24,13 +24,14 @@ final class const RoomChat({
required final String? roomId,
required final bool isDesktop,
required final bool showMembersByDefault,
final String? initialHighlightedEvent,
super.key,
}) extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final relatedEvent = useState<Event?>(null);
final relationType = useState(RelationType.reply);
final highlightedEvent = useState<String?>(null);
final highlightedEvent = useState<String?>(initialHighlightedEvent);
final composerSize = useState<double>(64);
@ -59,7 +60,10 @@ final class const RoomChat({
final roomId = this.roomId!;
final controllerProvider = RoomChatController.provider(roomId);
final controllerProvider = RoomChatController.provider((
roomId,
initialHighlightedEvent,
));
final notifier = ref.watch(controllerProvider.notifier);
final client = ref.read(ClientController.provider.notifier);