From a701bc641325e3771bfb0674cdc5fd33db4f0bd6 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 5 Nov 2026 23:33:04 -0500 Subject: [PATCH] some small read receipt fixes --- lib/controllers/client.dart | 22 ++++++++++++++-------- lib/helpers/hooks/chat_scroll.dart | 4 ++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/controllers/client.dart b/lib/controllers/client.dart index 4770470..e6afa3b 100644 --- a/lib/controllers/client.dart +++ b/lib/controllers/client.dart @@ -1,7 +1,6 @@ import "dart:async"; import "dart:ffi"; import "dart:io"; -import "dart:math"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:ffi/ffi.dart"; @@ -12,6 +11,7 @@ import "package:nexus/controllers/active_account.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/controllers/settings.dart"; import "package:nexus/helpers/extensions/gomuks_buffer.dart"; +import "package:nexus/helpers/extensions/event_id_is_fake.dart"; import "package:nexus/helpers/extensions/thread_events.dart"; import "package:nexus/main.dart"; import "package:nexus/models/content/bot_command_description.dart"; @@ -441,13 +441,19 @@ class ClientController(final String? accountId) extends AsyncNotifier { Future markRead(Room room, {String? threadRoot}) async { if (room.metadata == null) return; final event = switch (threadRoot) { - final threadRoot? => room.latestThreadEvent(threadRoot), - null when room.timeline.isEmpty => null, - null => switch (room.timeline[room.timeline.keys.reduce(max)]) { - final rowId? => room.events[rowId], - null => null, - }, - }; + final threadRoot? => [ + ?room.latestThreadEvent(threadRoot), + ...room.threadEvents(threadRoot).reversed, + ], + null => + room.timeline.entries + .toIList() + .sort((a, b) => b.key.compareTo(a.key)) + .map((entry) => entry.value) + .nonNulls + .map((rowId) => room.events[rowId]) + .nonNulls, + }.where((event) => !event.eventId.isFake).firstOrNull; if (event == null) return; diff --git a/lib/helpers/hooks/chat_scroll.dart b/lib/helpers/hooks/chat_scroll.dart index b307c36..47f3e40 100644 --- a/lib/helpers/hooks/chat_scroll.dart +++ b/lib/helpers/hooks/chat_scroll.dart @@ -150,10 +150,10 @@ final class ChatScroll({ await paginate(.backward); } else if (isHistorical && position.extentBefore <= loadThreshold) { await paginate(.forward); - } else if (position.extentBefore <= 0) { - await markRead(); } + if (!isHistorical && position.extentBefore <= 0) await markRead(); + if (controllerData.isLoading == false && position.extentBefore <= 0 && controllerData.value?.hasMoreForward == false &&