From c4255f340a2c028aede31bb4cb353772a94b71d3 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Tue, 19 May 2026 21:54:21 -0400 Subject: [PATCH] Support for loading history and marking read --- lib/widgets/room_chat.dart | 43 ++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/lib/widgets/room_chat.dart b/lib/widgets/room_chat.dart index 3dcea9b..7d28838 100644 --- a/lib/widgets/room_chat.dart +++ b/lib/widgets/room_chat.dart @@ -7,6 +7,7 @@ import "package:nexus/controllers/account_data_controller.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/power_level_controller.dart"; +import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/controllers/selected_room_controller.dart"; import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/controllers/via_controller.dart"; @@ -45,13 +46,6 @@ class RoomChat extends HookConsumerWidget { final memberListOpened = useState(showMembersByDefault); - final listController = useRef(ListController()); - final scrollController = useScrollController( - onAttach: (position) => position.addListener(() { - // TODO: Do things on scroll to top or bottom - }), - ); - final userId = ref.watch(ClientStateController.provider)?.userId; final roomId = ref.watch( SelectedRoomController.provider.select((value) => value?.metadata?.id), @@ -78,6 +72,21 @@ class RoomChat extends HookConsumerWidget { final controllerProvider = RoomChatController.provider(roomId); final notifier = ref.watch(controllerProvider.notifier); + final client = ref.watch(ClientController.provider.notifier); + + final listController = useRef(ListController()); + final scrollController = useScrollController(); + scrollController.addListener(() async { + if (!scrollController.position.atEdge) return; + + if (scrollController.position.pixels == 0) { + final room = ref.watch(RoomsController.provider)[roomId]; + if (room != null) client.markRead(room); + } else { + await notifier.loadOlder(); + } + }); + final composerNode = useFocusNode( onKeyEvent: (_, event) { if (event is KeyDownEvent && @@ -269,17 +278,15 @@ class RoomChat extends HookConsumerWidget { ), TextButton( onPressed: () { - ref - .watch(ClientController.provider.notifier) - .reportEvent( - ReportRequest( - roomId: roomId, - eventId: event.eventId, - reason: reasonController.text.isEmpty - ? null - : reasonController.text, - ), - ); + client.reportEvent( + ReportRequest( + roomId: roomId, + eventId: event.eventId, + reason: reasonController.text.isEmpty + ? null + : reasonController.text, + ), + ); Navigator.of(context).pop(); }, child: Text("Report"),