diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index 4569a3f..de6e909 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -167,6 +167,11 @@ class ClientController extends AsyncNotifier { await _sendCommand("leave_room", {"room_id": room.metadata!.id}); } + // (await _sendCommand("get_event_context", { + // "room_id": request.roomId, + // "event_id": r"$OqZT4NuTj0J1-771IOEEWRI4XdumRNu6ighlvO3K3gc", + // })); + Future> getRoomState(GetRoomStateRequest request) async { final response = (await _sendCommand("get_room_state", request.toJson())) as List; diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 7ce7551..35b8aea 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -18,12 +18,12 @@ import "package:nexus/models/relation_type.dart"; import "package:nexus/models/requests/send_message_request.dart"; import "package:nexus/models/room.dart"; -class RoomChatController extends AsyncNotifier { +class RoomChatController extends AsyncNotifier { final String roomId; RoomChatController(this.roomId); @override - Future build() async { + Future build() async { final client = ref.watch(ClientController.provider.notifier); var room = ref.read(RoomsController.provider)[roomId]; if (room == null) return InMemoryChatController(); @@ -283,8 +283,13 @@ class RoomChatController extends AsyncNotifier { ); } + Future scrollToMessage(Message message) async { + final controller = await future; + return await controller.scrollToMessage(message.id); + } + static final provider = AsyncNotifierProvider.family - .autoDispose( + .autoDispose( RoomChatController.new, ); } diff --git a/lib/widgets/chat_page/room_chat.dart b/lib/widgets/chat_page/room_chat.dart index 00b7f42..26ecfc3 100644 --- a/lib/widgets/chat_page/room_chat.dart +++ b/lib/widgets/chat_page/room_chat.dart @@ -435,6 +435,7 @@ class RoomChat extends HookConsumerWidget { customWidget: getTextWidget(message), topWidget: TopWidget( message, + onTapReply: notifier.scrollToMessage, groupStatus: groupStatus, ), message: message, @@ -491,6 +492,8 @@ class RoomChat extends HookConsumerWidget { topWidget: TopWidget( message, groupStatus: groupStatus, + onTapReply: + notifier.scrollToMessage, alwaysShow: true, ), message: textMessage, @@ -503,6 +506,8 @@ class RoomChat extends HookConsumerWidget { : TopWidget( message, groupStatus: groupStatus, + onTapReply: + notifier.scrollToMessage, alwaysShow: true, ), customImageProvider: CachedNetworkImage( @@ -547,6 +552,7 @@ class RoomChat extends HookConsumerWidget { child: FlyerChatFileMessage( topWidget: TopWidget( message, + onTapReply: notifier.scrollToMessage, groupStatus: groupStatus, ), message: message, diff --git a/lib/widgets/chat_page/top_widget.dart b/lib/widgets/chat_page/top_widget.dart index b8ee5db..636bc84 100644 --- a/lib/widgets/chat_page/top_widget.dart +++ b/lib/widgets/chat_page/top_widget.dart @@ -9,9 +9,11 @@ class TopWidget extends ConsumerWidget { final Message message; final bool alwaysShow; final MessageGroupStatus? groupStatus; + final void Function(Message message)? onTapReply; const TopWidget( this.message, { required this.groupStatus, + this.onTapReply, this.alwaysShow = false, super.key, }); @@ -54,12 +56,7 @@ class TopWidget extends ConsumerWidget { return Padding( padding: EdgeInsets.only(bottom: 12), child: InkWell( - onTap: () => showDialog( - context: context, - builder: (_) => Dialog( - child: Text("TODO: Scroll to original message"), - ), // TODO - ), + onTap: () => onTapReply?.call(replyMessage), child: Quoted( Row( mainAxisSize: MainAxisSize.min,