Support for loading history and marking read

This commit is contained in:
Henry Hiles 2026-05-19 21:54:21 -04:00
commit c4255f340a
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -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<bool>(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,9 +278,7 @@ class RoomChat extends HookConsumerWidget {
),
TextButton(
onPressed: () {
ref
.watch(ClientController.provider.notifier)
.reportEvent(
client.reportEvent(
ReportRequest(
roomId: roomId,
eventId: event.eventId,