diff --git a/lib/controllers/room_chat.dart b/lib/controllers/room_chat.dart index 2db473e..4043922 100644 --- a/lib/controllers/room_chat.dart +++ b/lib/controllers/room_chat.dart @@ -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 { +class RoomChatController(final (String roomId, String? withEventId) info) + extends AsyncNotifier { @override Future 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 { .redactEvent( RedactEventRequest( eventId: event.eventId, - roomId: roomId, + roomId: info.$1, reason: reason, ), ); @@ -75,14 +77,14 @@ class RoomChatController(final String roomId) extends AsyncNotifier { 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 { .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 { 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 { 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 { .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 { 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 { 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 { 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 { } static final provider = AsyncNotifierProvider.family - .autoDispose( + .autoDispose( RoomChatController.new, ); } diff --git a/lib/helpers/extensions/build_event_options.dart b/lib/helpers/extensions/build_event_options.dart index 5319f2b..a95da6d 100644 --- a/lib/helpers/extensions/build_event_options.dart +++ b/lib/helpers/extensions/build_event_options.dart @@ -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 diff --git a/lib/widgets/reaction_row.dart b/lib/widgets/reaction_row.dart index 56f2356..195aa4f 100644 --- a/lib/widgets/reaction_row.dart +++ b/lib/widgets/reaction_row.dart @@ -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) { diff --git a/lib/widgets/room_chat/room_chat.dart b/lib/widgets/room_chat/room_chat.dart index 9d81c16..186b2a6 100644 --- a/lib/widgets/room_chat/room_chat.dart +++ b/lib/widgets/room_chat/room_chat.dart @@ -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(null); final relationType = useState(RelationType.reply); - final highlightedEvent = useState(null); + final highlightedEvent = useState(initialHighlightedEvent); final composerSize = useState(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);