add minimal scroll to message, only when on current timeline

This commit is contained in:
Henry Hiles 2026-03-12 21:09:11 -04:00
commit 9a3f7e9bdc
No known key found for this signature in database
4 changed files with 22 additions and 9 deletions

View file

@ -167,6 +167,11 @@ class ClientController extends AsyncNotifier<int> {
await _sendCommand("leave_room", {"room_id": room.metadata!.id}); await _sendCommand("leave_room", {"room_id": room.metadata!.id});
} }
// (await _sendCommand("get_event_context", {
// "room_id": request.roomId,
// "event_id": r"$OqZT4NuTj0J1-771IOEEWRI4XdumRNu6ighlvO3K3gc",
// }));
Future<IList<Event>> getRoomState(GetRoomStateRequest request) async { Future<IList<Event>> getRoomState(GetRoomStateRequest request) async {
final response = final response =
(await _sendCommand("get_room_state", request.toJson())) as List; (await _sendCommand("get_room_state", request.toJson())) as List;

View file

@ -18,12 +18,12 @@ import "package:nexus/models/relation_type.dart";
import "package:nexus/models/requests/send_message_request.dart"; import "package:nexus/models/requests/send_message_request.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
class RoomChatController extends AsyncNotifier<ChatController> { class RoomChatController extends AsyncNotifier<InMemoryChatController> {
final String roomId; final String roomId;
RoomChatController(this.roomId); RoomChatController(this.roomId);
@override @override
Future<ChatController> build() async { Future<InMemoryChatController> build() async {
final client = ref.watch(ClientController.provider.notifier); final client = ref.watch(ClientController.provider.notifier);
var room = ref.read(RoomsController.provider)[roomId]; var room = ref.read(RoomsController.provider)[roomId];
if (room == null) return InMemoryChatController(); if (room == null) return InMemoryChatController();
@ -283,8 +283,13 @@ class RoomChatController extends AsyncNotifier<ChatController> {
); );
} }
Future<void> scrollToMessage(Message message) async {
final controller = await future;
return await controller.scrollToMessage(message.id);
}
static final provider = AsyncNotifierProvider.family static final provider = AsyncNotifierProvider.family
.autoDispose<RoomChatController, ChatController, String>( .autoDispose<RoomChatController, InMemoryChatController, String>(
RoomChatController.new, RoomChatController.new,
); );
} }

View file

@ -435,6 +435,7 @@ class RoomChat extends HookConsumerWidget {
customWidget: getTextWidget(message), customWidget: getTextWidget(message),
topWidget: TopWidget( topWidget: TopWidget(
message, message,
onTapReply: notifier.scrollToMessage,
groupStatus: groupStatus, groupStatus: groupStatus,
), ),
message: message, message: message,
@ -491,6 +492,8 @@ class RoomChat extends HookConsumerWidget {
topWidget: TopWidget( topWidget: TopWidget(
message, message,
groupStatus: groupStatus, groupStatus: groupStatus,
onTapReply:
notifier.scrollToMessage,
alwaysShow: true, alwaysShow: true,
), ),
message: textMessage, message: textMessage,
@ -503,6 +506,8 @@ class RoomChat extends HookConsumerWidget {
: TopWidget( : TopWidget(
message, message,
groupStatus: groupStatus, groupStatus: groupStatus,
onTapReply:
notifier.scrollToMessage,
alwaysShow: true, alwaysShow: true,
), ),
customImageProvider: CachedNetworkImage( customImageProvider: CachedNetworkImage(
@ -547,6 +552,7 @@ class RoomChat extends HookConsumerWidget {
child: FlyerChatFileMessage( child: FlyerChatFileMessage(
topWidget: TopWidget( topWidget: TopWidget(
message, message,
onTapReply: notifier.scrollToMessage,
groupStatus: groupStatus, groupStatus: groupStatus,
), ),
message: message, message: message,

View file

@ -9,9 +9,11 @@ class TopWidget extends ConsumerWidget {
final Message message; final Message message;
final bool alwaysShow; final bool alwaysShow;
final MessageGroupStatus? groupStatus; final MessageGroupStatus? groupStatus;
final void Function(Message message)? onTapReply;
const TopWidget( const TopWidget(
this.message, { this.message, {
required this.groupStatus, required this.groupStatus,
this.onTapReply,
this.alwaysShow = false, this.alwaysShow = false,
super.key, super.key,
}); });
@ -54,12 +56,7 @@ class TopWidget extends ConsumerWidget {
return Padding( return Padding(
padding: EdgeInsets.only(bottom: 12), padding: EdgeInsets.only(bottom: 12),
child: InkWell( child: InkWell(
onTap: () => showDialog( onTap: () => onTapReply?.call(replyMessage),
context: context,
builder: (_) => Dialog(
child: Text("TODO: Scroll to original message"),
), // TODO
),
child: Quoted( child: Quoted(
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,