some small read receipt fixes

This commit is contained in:
Henry Hiles 2026-11-05 23:33:04 -05:00
commit a701bc6413
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 16 additions and 10 deletions

View file

@ -1,7 +1,6 @@
import "dart:async"; import "dart:async";
import "dart:ffi"; import "dart:ffi";
import "dart:io"; import "dart:io";
import "dart:math";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:ffi/ffi.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/client_state.dart";
import "package:nexus/controllers/settings.dart"; import "package:nexus/controllers/settings.dart";
import "package:nexus/helpers/extensions/gomuks_buffer.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/helpers/extensions/thread_events.dart";
import "package:nexus/main.dart"; import "package:nexus/main.dart";
import "package:nexus/models/content/bot_command_description.dart"; import "package:nexus/models/content/bot_command_description.dart";
@ -441,13 +441,19 @@ class ClientController(final String? accountId) extends AsyncNotifier<int> {
Future<void> markRead(Room room, {String? threadRoot}) async { Future<void> markRead(Room room, {String? threadRoot}) async {
if (room.metadata == null) return; if (room.metadata == null) return;
final event = switch (threadRoot) { final event = switch (threadRoot) {
final threadRoot? => room.latestThreadEvent(threadRoot), final threadRoot? => [
null when room.timeline.isEmpty => null, ?room.latestThreadEvent(threadRoot),
null => switch (room.timeline[room.timeline.keys.reduce(max)]) { ...room.threadEvents(threadRoot).reversed,
final rowId? => room.events[rowId], ],
null => null, 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; if (event == null) return;

View file

@ -150,10 +150,10 @@ final class ChatScroll({
await paginate(.backward); await paginate(.backward);
} else if (isHistorical && position.extentBefore <= loadThreshold) { } else if (isHistorical && position.extentBefore <= loadThreshold) {
await paginate(.forward); await paginate(.forward);
} else if (position.extentBefore <= 0) {
await markRead();
} }
if (!isHistorical && position.extentBefore <= 0) await markRead();
if (controllerData.isLoading == false && if (controllerData.isLoading == false &&
position.extentBefore <= 0 && position.extentBefore <= 0 &&
controllerData.value?.hasMoreForward == false && controllerData.value?.hasMoreForward == false &&